关于linux系统使用的问题
问题排查
首先,通过free命令观察系统的内存使用情况,显示如下:
totalusedfreesharedbufferscached
Mem:24675796245871448865203570121612488
-/+ buffers/cache:226176442058152
Swap:20964721082241988248
其中,可以看出内存总量为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 ACTIVEUSE OBJ SIZESLABS OBJ/SLAB CACHE SIZE NAME
13926348 13926348 100%0.21K 773686183494744K
dentry_cache334040 26205678%0.09K83514033404K
buffer_head151040 15053799%0.74K302085120832K
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均可。
谢谢你的解答,你的解答蛮专业的,问题已经解决了。