Linux内存问题排查

通常,我们会遇到很多关于Linux内存异常的问题:

1、 为什么我们的内存使用偏高?

2、 谁用了我的内存?

3、 内存使用如何调优?


这里总结下排查思路:

  1. 通过free -m命令查看当前系统内存总体使用情况,引用大牛们的图一幅:

技术分享

a)Used = 进程使用内存+Slab使用+pagetable+Buffer+Cache

b)-buffer/cache Used =进程使用内存+Slab使用+pagetable


 那么,由于pagetable通常是内存页表的元数据,一般很小;

排查内存使用基本上排查三个地方:

 1、buffer、cache是否偏高,为什么?

 2、用户进程使用是否偏高,为什么?

 3、Slab使用是否偏高,为什么?


针对问题1:

通过free -m即可看到buffer/cache的使用情况,如果buffer/cache偏高,我们就可以通过drop cache来进行释放了;


To free pagecache:

echo 1 > /proc/sys/vm/drop_caches


To free dentriesand inodes:

echo 2 > /proc/sys/vm/drop_caches


To free pagecache,dentriesand inodes:

echo 3 > /proc/sys/vm/drop_caches


安全起见,先sync。



针对问题2:

top 命令, 通过shift+m,即可按照内存排序:

技术分享

1.Virt: 虚拟内存

2.Res :   物理内存(常驻内存)

3.Shr :   共享内存

4.    实际使用内存是:RES

Free中看到的used,不是virt的和,而是res的和

通过这个命令,则可以知道哪些进程内存占用率高;

然后,通过pmap -d  $pid查看内存分布情况:

技术分享

通过这个命令,即可知道这个进程的内存具体分配到哪里了;


针对问题3:

如果buffer/cache、用户态进程都使用的很少,但是内存使用率很高,剩下的疑点就是slab了;

通过slabtop命令,能查明slab的使用情况;

技术分享t

排序标准

a: sort by number of active objects

b: sort by objects per slab

c: sort by cache size

l: sort by number of slabs

v: sort by number of active slabs

n: sort by name

o: sort by number of objects

p: sort by pages per slab

s: sort by object size

u: sort by cache utilization


通过按照cache size排序,就是到哪些slab消耗内存最大;

处理方法往往也是drop cache;


 

另外,如果使用了swap,建议关闭swap;

但是内存又不够,怎么办?如果是云服务器,建议直接弹性内存扩容;


如果是物理机,大致有这些调优方法:

1.降低swap的使用率:

sysctl-a | grepswappiness

vm.swappiness= 60


2.关闭Swap:swapoff


3.限制其他用户的内存使用

vim /etc/security/limits.conf

user1 hard as 1000 (用户user1所有累加起来,内存不超过1000kiB

user1 soft as 800 (用户user1一次运行,内存不超过800kiB


4.大量连续内存数据:

vim /etc/sysctl.conf

vm.nr_hugepage=20


5.调节page cache(大量一样的请求 调大page cache

vm.lowmem_reserve_ratio= 256 256 32 (保留多少内存作为pagecache当前 最大 最小)

vm.vfs_cache_pressure=100(大于100,回收pagecache

vm.page.cluster=3(一次性从swap写入内存的量为23次方页)

vm.zone_reclaim_mode=0/1(当内存危机时,是否尽量回收内存0:尽量回收1:尽量不回收

min_free_kbytes:该文件表示强制Linux VM最低保留多少空闲内存(Kbytes)。


6脏页

vm.dirty_background_radio=10(当脏页占内存10%pdflush工作)

vm.dirty_radio=40(当进程自身脏页占内存40%,进程自己处理脏页,将其写入磁盘)

vm.dirty_expire_centisecs=3000(脏页老化时间为303000/100=30秒)

vm.dirty_writeback_centisecs=500(每隔5秒,pdflush监控一次内存数量500/100=5


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。