hi,欢迎访问本站!
当前位置: 首页学习笔记正文

CentOS6 slab内存占用高故障排查

用户投稿 学习笔记 22阅读
一、故障复盘

服务器总内存16G,所有进程占用内存4G,slab占用7G,其中dentry占用6G,一直无法释放。导致服务器内存持续在80%以上。

dentry的作用是目录项缓存,当打开一个文件时,系统会分配一部分dentry给这个文件,便于下次打开更快。

最终排查发现是由于curl时,会打开/usr/local/lib下的*.so文件,但这个路径下没有这些文件,于是打开时报错No such file or directory,导致占用了很多dentry,由于打开失败,只有open操作,没有close操作,dentry无法及时释放,显示还是ACTIVE状态,最终越积累越多,导致内存占满。

处理方式,将/lib64/*.so、/usr/lib64/*.so中的文件复制到/usr/local/lib中,dentry就释放掉了。

二、故障排查流程

收到阿里云报警,内存超过80%。

1. top 内存排序 PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 4232 www 20 0 6681m 534m 5572 S 0.0 3.3 249:54.28 java -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m -Xms1g -Xmx1g -Xss256k -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC -jar -D13183 root 10 -10 209m 89m 4652 S 5.7 0.6 3665:27 /usr/local/aegis/aegis_client/aegis_10_85/AliYunDun16022 www 20 0 275m 46m 8920 S 7.1 0.3 0:28.12 php28688 www 20 0 274m 46m 9188 S 0.0 0.3 0:02.68 php28784 www 20 0 272m 44m 9192 S 1.4 0.3 0:02.82 php28542 www 20 0 272m 44m 9020 S 2.8 0.3 0:02.84 php28574 www 20 0 272m 44m 9020 S 0.0 0.3 0:02.90 php28578 www 20 0 272m 44m 9020 S 0.0 0.3 0:02.66 php28788 www 20 0 272m 44m 9020 S 1.4 0.3 0:02.87 php28820 www 20 0 272m 44m 9020 S 2.8 0.3 0:02.75 php28824 www 20 0 272m 44m 9020 S 2.8 0.3 0:03.01 php28538 www 20 0 272m 44m 9020 S 1.4 0.3 0:02.68 php28720 www 20 0 272m 44m 9020 S 4.3 0.3 0:02.76 php28684 www 20 0 272m 44m 9020 S 4.3 0.3 0:02.94 php28614 www 20 0 272m 44m 9020 S 2.8 0.3 0:02.80 php28610 www 20 0 272m 43m 9020 S 2.8 0.3 0:02.85 php28725 www 20 0 272m 43m 9020 S 4.3 0.3 0:02.81 php26947 www 20 0 263m 33m 7672 S 1.4 0.2 0:03.17 php26951 www 20 0 263m 33m 7672 S 2.8 0.2 0:03.02 php23616 www 20 0 263m 32m 6880 S 0.0 0.2 0:02.04 php-fpm: pool www31608 www 20 0 263m 31m 7672 S 2.8 0.2 0:01.20 php23647 www 20 0 261m 31m 7040 S 0.0 0.2 0:01.10 php-fpm: pool www23658 www 20 0 262m 30m 5872 S 0.0 0.2 0:01.64 php-fpm: pool www23615 www 20 0 259m 29m 7008 S 0.0 0.2 0:01.21 php-fpm: pool www23607 www 20 0 259m 29m 7012 S 0.0 0.2 0:01.23 php-fpm: pool www23683 www 20 0 260m 29m 5868 S 0.0 0.2 0:01.71 php-fpm: pool www23656 www 20 0 260m 29m 5796 S 0.0 0.2 0:02.36 php-fpm: pool www

没有找到占用大内存的进程。

2. free 查看内存使用 [root@192.168.1.218 ~]# free -m total used free shared buffers cachedMem: 15950 14448 1502 0 206 1675-/+ buffers/cache: 12566 3384Swap: 9897 159 9738

-/+ buffers/cache的第一列代表当前已使用(used - buffer - cache),第二列表示剩余可用内存(free + buffer + cache)。

能看出系统已用内存12G。

3. 查看所有进程使用内存之和 [root@192.168.1.218 ~]# grep Pss /proc/[1-9]*/smaps | awk '{total+=$2}; END {print total}'4138253[root@192.168.1.218 ~]

发现所有进程只占用4G内存。还剩8G内存不知道被谁占了。

4. 查看内存分配详情(仅粘贴出重要内存) [root@192.168.1.218 ~]#cat /proc/meminfoMemTotal: 16333736 kBMemFree: 2746984 kBBuffers: 104976 kBCached: 1207308 kBSlab: 8375144 kBSReclaimable: 6610836 kBSUnreclaim: 1764308 kB

可以看到,slab占用了8G左右。其中可释放SReclaimable6G多。

5. 查看slab内存使用详情 OBJS ACTIVE USE OBJ SIZE SLABS OBJ/SLAB CACHE SIZE NAME 26144880 26143568 99% 0.19K 130724420 5228976K dentry25382036 25381364 99% 0.06K 43020459 1720816K size-641319488 1319281 99% 0.99K 3298724 1319488K ext4_inode_cache404151 275805 68% 0.10K 1092337 43692K buffer_head52899 42371 80% 0.05K 68777 2748K anon_vma_chain43092 34580 80% 0.20K 226819 9072K vm_area_struct41818 26036 62% 0.55K 59747 23896K radix_tree_node28428 16609 58% 0.04K 30992 1236K anon_vma

可以看出slab占用了5G多。

6. 查看dentry使用详情 [root@192.168.1.218 ~]# cat /proc/sys/fs/dentry-state26191771 26140830 45000[root@192.168.1.218 ~]#

第一列表示申请的dentry数量,第二列表示可以未使用的数量,可以看到未使用数量很高,但是没释放。

7. 使用strace排查

先查看php进程是否有频繁打开不存在的文件,发现有打开关闭文件,但不是不存在的文件。

[root@192.168.1.218 ~]# strace -fp 31234 -e trace=stat,open,close,unlink

网上查到有说是curl的版本有问题,会创建很多临时文件,排查下curl

[root@192.168.1.218 ~]# strace -f -e trace=open,unlink,close curl "https://www.baidu.com"

发现没有打开临时文件,但是有很多.so文件不存在,打开失败了,初步确定就是这个引起的*

三、故障处理 1.将缺少的文件复制过去,再使用strace排查curl,No such file or directory 报错,使用slabtop查看dentry,发现已经在下降了,大概3分钟后下降至正常水平。 cp libcrypto.so.10 /usr/local/lib/libcrypto.so.10 cp libz.so.1 /usr/local/lib/libz.so.1 cp librt.so.1 /usr/local/lib/librt.so.1 cp libpthread.so.0 /usr/local/lib/libpthread.so.0 cp libc.so.6 /usr/local/lib/libc.so.6 cp libldap-2.4.so.2 /usr/local/lib/libldap-2.4.so.2 cp libgssapi_krb5.so.2 /usr/local/lib/libgssapi_krb5.so.2 cp libkrb5.so.3 /usr/local/lib/libkrb5.so.3 cp libcom_err.so.2 /usr/local/lib/libcom_err.so.2 cp libk5crypto.so.3 /usr/local/lib/libk5crypto.so.3 cp libdl.so.2 /usr/local/lib/libdl.so.2 cp liblber-2.4.so.2 /usr/local/lib/liblber-2.4.so.2 cp libresolv.so.2 /usr/local/lib/libresolv.so.2 cp libsasl2.so.2 /usr/local/lib/libsasl2.so.2 cp libssl3.so /usr/local/lib/libssl3.so cp libsmime3.so /usr/local/lib/libsmime3.so cp libnss3.so /usr/local/lib/libnss3.so cp libnssutil3.so /usr/local/lib/libnssutil3.so cp libplds4.so /usr/local/lib/libplds4.so cp libplc4.so /usr/local/lib/libplc4.so cp libnspr4.so /usr/local/lib/libnspr4.so cp libkrb5support.so.0 /usr/local/lib/libkrb5support.so.0 cp libkeyutils.so.1 /usr/local/lib/libkeyutils.so.1 cp libcrypt.so.1 /usr/local/lib/libcrypt.so.1 cp libselinux.so.1 /usr/local/lib/libselinux.so.1 cp libfreebl3.so /usr/local/lib/libfreebl3.so cp libssl.so.10 /usr/local/lib/libssl.so.10cp libnss_files.so.2 /usr/local/lib/libnss_files.so.2cp libnss_dns.so.2 /usr/local/lib/libnss_dns.so.2

dentry降到1G了,属于正常范围。

OBJS ACTIVE USE OBJ SIZE SLABS OBJ/SLAB CACHE SIZE NAME 5650780 5650584 99% 0.19K 282539 20 1130156K dentry2389323 1066827 44% 0.06K 40497 59 161988K size-64 89432 80871 90% 0.99K 22358 4 89432K ext4_inode_cache 93972 92969 98% 0.64K 15662 6 62648K proc_inode_cache

内存使用已降到6G以内了。

[root@192.168.1.218 ~]# free -m total used free shared buffers cachedMem: 15950 8189 7761 0 1428 1010-/+ buffers/cache: 5749 10200Swap: 9897 492 9405[root@192.168.1.218 ~]# 2. 增大自动回收阈值

修改 vm.min_free_kbytes 和 vm.extra_free_kbytes,增加slab回收阈值

sysctl -w vm.extra_free_kbytes=836787sysctl -w vm.min_free_kbytes=836787
标签:
声明:无特别说明,转载请标明本文来源!
发布评论
正文 取消