緩衝區/記憶體溢出 Ubuntu 10.04 LTS Xen Rackspace
我在跑:
Ubuntu 10.04 LTS Server AMD64 in a 512MB XEN paravirtualized environment. lighttpd v1.4.26 PHP v5.3.8 MySQL v5.1.41-3ubuntu12
問題是:
我首先從一個“256MB 帳戶”開始,這是一個謊言,因為它使用 free -m 註冊為 245MB 我發現在我啟動並執行系統後,記憶體開始慢慢消失,後來我了解到這是磁碟到記憶體記憶體/緩衝區,但它仍然讓我感到緊張,因為它看起來像記憶體洩漏。果然,當它達到最大記憶體時,伺服器崩潰了。我認為這可能是我的程式碼有問題,或者我使用的是新 PHP 的錯誤版本。所以我將我的雲大小從 256 更改為 512,這也是一個謊言,因為它報告為 496MB 並讓它執行。一周後,記憶體又滿了,伺服器崩潰了。
作為參考,我沒有使用 drupal 或 php-nuke 或任何預先捆綁或臃腫的東西。我嘗試從最大的 PHP v5.3.2 LTS 版本強制升級到 5.3.8 我的 swappiness 設置為預設值 60。
這是我現在的記憶:
total used free shared buffers cached Mem: 496 187 308 0 32 65 -/+ buffers/cache: 89 406 Swap: 1023 0 1023
該站點幾乎總是保持在 89MB 級別,但緩衝區和記憶體不斷增加。我的解決方法是使用
echo 3 > /proc/sys/vm/drop_caches
. 這已經工作了 3 週,但我擔心一旦網站成為主流,這種黑客方法就會失敗。我在這裡問你們對這種情況的了解比我多得多,接下來我該怎麼做?我完全願意獲得您需要的任何數據來幫助診斷這一點。
我個人的預感是與 XEN 和 Ubuntu 不兼容,因為我的猜測是 XEN 說只有 496 時可以使用真正的 512MB 記憶體,或者 XEN 說有 16GB 的記憶體可以用作 VM 的不正確比例。不知道如何確認。
我的預感是對的!我選擇的預建構 PV 映像似乎沒有正確創建 Linux 可以辨識和使用的交換分區。因此,在文件記憶體填滿所有記憶體後,系統將進入記憶體,並且它要麼表現得好像有 0MB 交換,要麼它恐慌並凍結在某種記憶體/交換循環中。
使用 fdisk -l
以下是我研究過的不同文件系統的範例。(PV 代表準虛擬化,HVM 代表完全虛擬化,在 XEN 環境中)
通過 CDROM-ISO 安裝自定義/清潔 HVM:
Disk /dev/sda: 16.1 GB, 16106127360 bytes 255 heads, 63 sectors/track, 1958 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x0001d37d Device Boot Start End Blocks Id System /dev/sda1 * 1 1871 15021056 83 Linux /dev/sda2 1871 1958 704513 5 Extended /dev/sda5 1871 1958 704512 82 Linux swap / Solaris
預建 PV/HVM:
Disk /dev/sda: 16.1 GB, 16106127360 bytes 255 heads, 63 sectors/track, 1958 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00084eb7 Device Boot Start End Blocks Id System /dev/sda1 * 1 13 96256 83 Linux Partition 1 does not end on cylinder boundary. /dev/sda2 13 75 499712 82 Linux swap / Solaris Partition 2 does not end on cylinder boundary. /dev/sda3 75 1958 15130643 83 Linux
失敗的光伏:
Disk /dev/sda1: 20.4 GB, 20401094656 bytes 255 heads, 63 sectors/track, 2480 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000 Disk /dev/sda1 doesn't contain a valid partition table Disk /dev/sda2: 1073 MB, 1073741824 bytes 255 heads, 63 sectors/track, 130 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000 Disk /dev/sda2 doesn't contain a valid partition table
為什麼要刪除緩衝區和記憶體?空閒記憶體就是浪費記憶體——所有現代作業系統,包括 Linux,都會在 RAM 中積極記憶體目錄路徑、活躍使用的文件等內容,因為與硬碟相比,訪問 RAM 的速度非常快。
如果某個應用程序突然需要 RAM,記憶體的 RAM 將立即為該應用程序釋放。這是一個非常快速的操作,不會對性能造成顯著影響。
因此,在 Linux 中,您實際上使用
total - (free + buffers + cached)
.