Cache

緩衝區/記憶體溢出 Ubuntu 10.04 LTS Xen Rackspace

  • October 25, 2011

我在跑:

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).

引用自:https://serverfault.com/questions/324146