Linux

CentOS 伺服器。當總使用的 RAM 不等於 RES 的總和時,這意味著什麼?

  • June 30, 2011

我在執行 CentOS 的虛擬託管伺服器上遇到問題。在過去的一個月裡,一個執行良好的程序(基於 java 的)在 JVM 啟動時開始出現獲取記憶體的問題。

我注意到的一件奇怪的事情是,當我啟動程序時,PID 說它正在使用 470mb 的 RAM,而“已用”記憶體立即下降了 1GB 以上。如果我執行“top”,則所有程序中使用的總 RES 與頂部列出的“used”相差近 700mb。

支持人員說這意味著我的程序存在記憶體洩漏。我不知道該相信什麼,因為我希望記憶體洩漏只會浪費程序分配的記憶體 - 而不是消耗沒有使用“頂部”顯示的額外記憶體。

我是開發人員而不是伺服器人員,所以我呼籲專家。對我來說,如果總 RES 記憶體加起來不等於總“已用”,則表明我的虛擬伺服器設置有問題。在這種情況下,我應該懷疑一個記憶體洩漏的 java 程序嗎?

如果我free以前使用:

            total       used       free     shared    buffers     cached  
Mem:       2097152     149264    1947888          0          0          0  
-/+ buffers/cache:     149264    1947888  
Swap:            0          0          0 

free後:

            total       used       free     shared    buffers     cached  
Mem:       2097152    1094116    1003036          0          0          0  
-/+ buffers/cache:    1094116    1003036  
Swap:            0          0          0  

因此,看起來該程序正在使用(或導致使用)近 1GB 的 RAM。由於程序(基於top僅使用 470mb,這是否意味著核心突然使用了額外的 500mb?

編輯:添加cat proc/meminfo- 執行 java 應用程序的輸出:

MemTotal:      2097152 kB
MemFree:       1112672 kB
Buffers:             0 kB
Cached:              0 kB
SwapCached:          0 kB
Active:              0 kB
Inactive:            0 kB
HighTotal:           0 kB
HighFree:            0 kB
LowTotal:      2097152 kB
LowFree:       1112672 kB
SwapTotal:           0 kB
SwapFree:            0 kB
Dirty:               0 kB
Writeback:           0 kB
AnonPages:           0 kB
Mapped:              0 kB
Slab:                0 kB
PageTables:          0 kB
NFS_Unstable:        0 kB
Bounce:              0 kB
CommitLimit:         0 kB
Committed_AS:        0 kB
VmallocTotal:        0 kB
VmallocUsed:         0 kB
VmallocChunk:        0 kB
HugePages_Total:     0
HugePages_Free:      0
HugePages_Rsvd:      0
Hugepagesize:     2048 kB

中的“已使用”欄位top反映了正在使用的 RAM 總量,包括程序、文件緩衝區和記憶體所使用的 RAM 總量。但 RES 數字僅顯示程序正在使用的 RAM 量,不包括文件緩衝區。

要真正查看在沒有緩衝區的情況下使用了多少 RAM,請使用該free命令並查看該-/+ buffers/cache行。“已使用”列中的數字顯示了程序實際使用了多少 RAM。

這是一個例子:

$ free
            total       used       free     shared    buffers     cached
Mem:       2057196    1812352     244844          0     344768     833660
-/+ buffers/cache:     633924    1423272
Swap:      2097148          0    2097148

此輸出顯示系統有 2GB 的 RAM,其中 1.8GB 正在使用中。但是,其中 344MB 用於緩衝區,833MB 用於記憶體。減去它,程序和核心只使用了 633MB。

在啟動 Java 應用程序之前和之後執行該free命令,以更好地了解正在發生的事情。

編輯:刪除了對核心記憶體的引用,這些工具未報告。

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