透過proc看記憶體

fiona8953發表於2016-10-27

1 記憶體資訊檢視

proc檔案系統中涉及記憶體使用情況的檔案主要有:

/proc/meminfo表徵了系統記憶體使用概要資訊:

[root@localhost ~]# cat /proc/meminfo

MemTotal:       505964 kB              //系統可用實體記憶體總量

MemFree:         16060 kB             //系統空閒內實體記憶體總量= HighFree+ LowFree

Buffers:         41132 kB                //系統分配但未被使用的buffer數量(1)

Cached:         359268 kB              //系統分配但未被使用的cache數量(1)

SwapCached:          0 kB             //指交換出去的記憶體,再次交換回來,但在swap檔案中仍存在,主要為了節約這塊記憶體再次交換出去的IO操作

Active:         137156 kB               //最近使用的記憶體,除非必要,一般不會立即回收

Inactive:       282600 kB                 //最近未使用的記憶體,回收時優先回收

HighTotal:           0 kB                //高階記憶體總量(High Zone)860M以上的實體記憶體

HighFree:            0 kB               //高階記憶體空閒總量

LowTotal:       505964 kB              //常規記憶體總量(Normal Zone),可被kernel和應用任意使用

LowFree:         16060 kB             //常規記憶體空閒總量

SwapTotal:     1269124 kB               //總的交換記憶體大小

SwapFree:      1268948 kB              //空閒的交換記憶體大小

Dirty:              76 kB               //需要寫回磁碟的資料大小

Writeback:           0 kB               //正在寫回磁碟的資料大小

Mapped:          33808 kB             //mmap使用的記憶體大小

Slab:            63204 kB               //slab pool大小

CommitLimit:   1522104 kB        //系統實際可分配記憶體總量(2)

Committed_AS:    98172 kB             //系統當前已分配的記憶體總量,包括unused(2)

PageTables:       1660 kB                //管理記憶體頁表所使用的記憶體

VmallocTotal:   507896 kB                //vmalloc可使用的總記憶體大小

VmallocUsed:      3676 kB        // vmalloc已用的總記憶體大小

VmallocChunk:   503960 kB              //vmalloc可分配的最大的邏輯連續的記憶體大小

....

(1)cachebuffer的區別

Cachebuffer都是系統做為緩衝的記憶體,cache指的是page cache,表示檔案系統的cache;而buffer指的是buffer cache,用來為塊裝置的做讀寫緩衝,與具體的塊裝置關聯,跟蹤塊的變化。Linux系統之所以使用cachebuffer,主要是為了提高檔案讀寫訪問的效能。

簡單來說,buffers是用來儲存,目錄裡面有什麼內容,許可權等等。而cached直接用來記憶我們開啟的檔案。如果 cache 的值很大,說明cache住的檔案數很多。

Cachebuffer的記憶體對kernel來說是已經被使用的free的記憶體是指不需要任何處理即可分配的記憶體。對應用程式而言,當free記憶體不足時,可以從buffercache中回收記憶體再次分配。所以對kernel而言,可用記憶體即為free,對應用程式,可用記憶體為free+cache+buffer

(2)CommitLimitCommitted_AS

CommitLimit:基於過量分配比率(vm.overcommit_ratio),系統可分配的記憶體總量大小。這個值只有當採用嚴格過量記憶體管理(vm.overcommit_memory=2)時才有效。其總大小的計劃公式如下:

CommitLimit = (vm.overcommit_ratio * Physical RAM) + Swap

Committed_AS:系統當前已分配的記憶體總量,包括已分配但尚未使用的記憶體大小。如,一個程式分配了1G的記憶體,有300M在使用,但對VM已分配了1G,而且這1G在任何時候都可以被使用。當(vm.overcommit_memory=2)時,Committed_AS不能大於CommitLimit

/proc//status表徵了程式狀態資訊:

[zhangyan@localhost opt]$ cat /proc/28151/status

Name:   memtest

State:  R (running)

SleepAVG:       0%

......

Groups: 500

VmSize:     7528 kB   //該程式使用虛擬記憶體大小,是VmLib, VmExe, VmDataVmStk的總和

VmLck:         0 kB  //程式當前使用的並且加鎖的虛擬記憶體總數

VmRSS:      5400 kB //佔用的在實體記憶體大小,它沒有交換到硬碟,包括程式碼,資料和棧

VmData:     5136 kB  //堆使用的虛擬記憶體

VmStk:      1104 kB   //棧使用的虛擬記憶體

VmExe:         1 kB  //可執行的和靜態連結庫所使用的虛擬記憶體

VmLib:      1259 kB   //動態連結庫所使用的虛擬記憶體

......

/proc/slabinfo主要表徵了slab pool內資料的資訊:

[root@localhost ~]# cat /proc/slabinfo

slabinfo - version: 2.0

# name             : tunables : slabdata

nfs_direct_cache       0      0     68   58    1 : tunables  120   60    8 : slabdata      0      0      0

......

主要關注 三個項,一種型別的資料所佔記憶體的大小為:active_objs* objsize,該類記憶體池中空閒記憶體數:(num_objs- active_objs)* objsize。但並不是所有的空閒的記憶體單元是可回收的,這與建立時該型別記憶體池時的屬性相關。

2 記憶體管理策略

    與記憶體相關的配置都在/proc/sys/vm目錄下

/proc/sys/vm/dirty_ratio

檔案系統寫緩衝區的大小,單位是百分比,表示系統記憶體的百分比,表示當寫緩衝使用到系統記憶體多少的時候,開始向磁碟寫出資料。增大之會使用更多系統記憶體用於磁碟寫緩衝,也可以極大提高系統的寫效能。但是,當需要持續、恆定的寫入時,應該降低其數值。

/proc/sys/vm/dirty_background_ratio

控制pdflush程式在何時重新整理磁碟。單位是百分比,表示系統記憶體的百分比,意思是當寫緩衝使用到系統記憶體多少的時候,pdflush開始向磁碟寫出資料。增大之會使用更多系統記憶體用於磁碟寫緩衝,也可以極大提高系統的寫效能。但是,當需要持續、恆定的寫入場合時,應該降低其數值。

/proc/sys/vm/dirty_writeback_centisecs

控制pdflush的執行間隔。單位是 1/100 秒。預設數值是500,也就是 5 秒。如果你的系統是持續地寫入動作,那麼實際上還是降低這個數值比較好,這樣可以把尖峰的寫操作削平成多次寫操作。

/proc/sys/vm/dirty_expire_centisecs

表示如果髒資料在記憶體中駐留時間超過該值,pdflush程式在下一次將把這些資料寫回磁碟。單位是 1/100秒。預設是30000,也就是 30秒的資料就算舊了,將會重新整理磁碟。

/proc/sys/vm/overcommit_memory

指定核心針對記憶體分配的策略,其值可以是012

0 表示核心將檢查是否有足夠的可用記憶體供應用程式使用;如果有足夠的可用記憶體,記憶體申請允許;否則,記憶體申請失敗,並把錯誤返回給應用程式。

1 表示核心允許分配所有的實體記憶體,而不管當前的記憶體狀態如何。

2 表示核心允許分配所有的實體記憶體的一定百分比與交換空間總和之內的記憶體(參見overcommit_ratio)。

/proc/sys/vm/overcommit_ratio

如果overcommit_memory=2,可以過載記憶體的百分比。系統可分配記憶體=交換空間+實體記憶體*overcommit_ratio/100

You can change the behaviour of the Linux Kernel in regardings to its Overcommit Behaviour for memory. You can change the behaviour at /etc/sysctl.conf/ or /etc/sysctl.d/myconfig.conf

You will write something like

vm.overcommit_memory = (a integer from 0 to 2)
where 
0 - means that the kernel will use predefined heuristics when deciding whether to allow such an overcommit. This is the default. 
1 -always overcommits (Very dangerous)
2 - Prevents overcommits from exceeding a certain value. Within this mode, the total commit can not exceed the swap space(s) size + overcommit_ratio percent * RAM size. By default, the overcommit ratio is 50.

My assumption is that you have 10GB of swap and 20GB of memory and you wish the kernel to stop handling processes at  18GB RAM, then the calculation should be (swap size +  0.4 * RAM size).
So at /etc/sysctlf.conf, the configuration will be
vm.overcommit_memory = 2
vm.overcommit_ratio = 40
Note: The ratio is (40/100). 

Once the memory hits 18GB, the so-called OOM killer of the Linux kernel will kick in. 
Another calculation example is that your RAM size and  SWAP size are the same and you wish exactly the physical memory to be used only. then
vm.overcommit_memory = 2
vm.overcommit_ratio = 0
For more information, do read
  1. When Linux runs out of memory 
  2. vm.overcommit_memory = 2, vm.overcommit_ratio = 0

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26477398/viewspace-2127192/,如需轉載,請註明出處,否則將追究法律責任。

相關文章