Linux服務器Cache占用過多內存導致系統內存不足問題的排查解決


作者: 大圓那些事 | 文章可以轉載,請以超鏈接形式標明文章原始出處和作者信息

網址: http://www.cnblogs.com/panfeng412/archive/2013/12/10/drop-caches-under-linux-system.html

問題描述

Linux服務器內存使用量超過閾值,觸發報警。

問題排查

首先,通過free命令觀察系統的內存使用情況,顯示如下:

             total       used       free     shared    buffers     cached
Mem:      24675796   24587144      88652          0     357012    1612488
-/+ buffers/cache:   22617644    2058152
Swap:      2096472     108224    1988248

其中,可以看出內存總量為24675796KB,已使用22617644KB,只剩余2058152KB。

然后,接着通過top命令,shift + M按內存排序后,觀察系統中使用內存最大的進程情況,發現只占用了18GB內存,其他進程均很小,可忽略。

因此,還有將近4GB內存(22617644KB-18GB,約4GB)用到什么地方了呢?

進一步,通過cat /proc/meminfo發現,其中有將近4GB(3688732 KB)的Slab內存:

......
Mapped:          25212 kB
Slab:          3688732 kB
PageTables:      43524 kB
......

Slab是用於存放內核數據結構緩存,再通過slabtop命令查看這部分內存的使用情況:

  OBJS ACTIVE  USE OBJ SIZE  SLABS OBJ/SLAB CACHE SIZE NAME                   
13926348 13926348 100%    0.21K 773686       18   3494744K dentry_cache
334040 262056  78%    0.09K   8351       40     33404K buffer_head
151040 150537  99%    0.74K  30208        5    120832K ext3_inode_cache

發現其中大部分(大約3.5GB)都是用於了dentry_cache

問題解決

1. 修改/proc/sys/vm/drop_caches,釋放Slab占用的cache內存空間(參考drop_caches的官方文檔):

Writing to this will cause the kernel to drop clean caches, dentries and inodes from memory, causing that memory to become free.
To free pagecache:
* echo 1 > /proc/sys/vm/drop_caches
To free dentries and inodes:
* echo 2 > /proc/sys/vm/drop_caches
To free pagecache, dentries and inodes:
* echo 3 > /proc/sys/vm/drop_caches
As this is a non-destructive operation, and dirty objects are notfreeable, the user should run "sync" first in order to make sure allcached objects are freed.
This tunable was added in 2.6.16.

2. 方法1需要用戶具有root權限,如果不是root,但有sudo權限,可以通過sysctl命令進行設置:

$sync
$sudo sysctl -w vm.drop_caches=3
$sudo sysctl -w vm.drop_caches=0 #recovery drop_caches

操作后可以通過sudo sysctl -a | grep drop_caches查看是否生效。

3. 修改/proc/sys/vm/vfs_cache_pressure,調整清理inode/dentry caches的優先級(默認為100),LinuxInsight中有相關的解釋:

At the default value of vfs_cache_pressure = 100 the kernel will attempt to reclaim dentries and inodes at a “fair” rate with respect to pagecache and swapcache reclaim. Decreasing vfs_cache_pressure causes the kernel to prefer to retain dentry and inode caches. Increasing vfs_cache_pressure beyond 100 causes the kernel to prefer to reclaim dentries and inodes.

具體的設置方法,可以參考方法1或者方法2均可。

參考資料

https://www.kernel.org/doc/Documentation/sysctl/vm.txt

http://major.io/2008/12/03/reducing-inode-and-dentry-caches-to-keep-oom-killer-at-bay/

http://linux-mm.org/Drop_Caches

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM