當前內存占用率的計算,是根據top命令顯示的Mem.used除以Mem.total得到。
- Mem.total:表示總物理內存。
- Mem.used: 表示內核控制的內存數,除了應用程序使用的內存外,還包括緩存。
Mem.used = 應用程序使用內存 + Mem.buffers + Mem.cached
Linux的內存管理機制,會盡可能緩存一些數據,就算程序本身已經釋放相關內存,Buffers/cached也不會立即釋放。
但在需要的時候Buffers/cached都是可以被丟棄並快速回收的。
- 反過來,Mem.free: 表示還未納入內核管理范圍的內存(完全未被使用)。
有時候看上去可用內存很少,但實際還是比較充足的。從應用程序角度,buffers和cached也屬於可用。
實際可用內存 = Mem.free + Mem.buffers + Mem.cached.
所以, 由於buffeds/cached機制,服務器在運行一段時間以后uesd內存的值越來越大。
基於此計算的內存占用率結果比實際偏高,而且還可能偏高很多。
舉例,在服務器用vi打開文件,此時文件數據納入緩存,內存占用隨之增加。但這並不是應用程序占用的內存。
linux139:/srv # free -m total used free shared buffers cached Mem: 19953 1133 18820 0 20 86 -/+ buffers/cache: 1025 18927 Swap: 16384 0 16384 linux139:/srv # vim test.log linux139:/srv # ll -sh test.log 30M -rw------- 1 root root 30M Mar 29 11:24 test.log linux139:/srv # free -m total used free shared buffers cached Mem: 19953 1162 18790 0 20 116 -/+ buffers/cache: 1025 18928 Swap: 16384 0 16384 lin # top top - 11:25:34 up 3:49, 3 users, load average: 0.21, 0.11, 0.09 Tasks: 128 total, 1 running, 127 sleeping, 0 stopped, 0 zombie Cpu(s): 0.1%us, 0.1%sy, 0.0%ni, 99.8%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 19953M total, 1163M used, 18790M free, 20M buffers Swap: 16384M total, 0M used, 16384M free, 116M cached
手工清理緩存方式:
sync ;echo 3 > /proc/sys/vm/drop_caches