我在一台拥有 32GB RAM 内存的 Centos 7 服务器上运行着几个程序,分别是 MySQL、Apache2 和 PHP。最近我想核实一下剩余的 RAM 数量,因为我打算安装更多程序,但令我惊讶的是,内存量竟然非常低!经过调查,我发现 Slab 使用了超过 20GB。2 天前我删除了缓存,因此 slab 使用率降至 0,然后又缓慢上升。在使用程序监控时,我注意到使用率呈线性上升。在过去 24 小时内,它增加了约 5200MB(60 小时内总共增加了 13GB)。磁盘上的总数据不到 40GB。'find /' 的输出只有几 MB。似乎有很多 dentry 被缓存了?
我发过帖子说 curl 自带的 NSS 是导致问题的原因。我检查了安装的 NSS 版本,发现这个版本应该已经应用了修复。
我还发现建议使用 vfs_cache_pressure 的帖子,但是增加它似乎并不能阻止使用率上升到极高的值。
我想知道对于小于 50GB 的小磁盘,标识的正常内存量是多少?我如何找到源头以及如何修复此问题?
相关图片:
slabtop 截图:这里
slab 可回收和缓存内存图表:这里
编辑:
# sysctl -n vm.vfs_cache_pressure
10000
(以前是 100,我将其增加了 100 倍,但内存仍然增加了相同的量)
# find / -type d -size +10M -ls
#
(无输出)
至于 cronjobs,除了每日日志轮换之外,还有一个脚本会建立几个 tcp 连接来获取数据并将其存储在数据库中(原始套接字,没有 curl 或任何东西)。除了那个 cronjob,还有 2 个备份 cronjobs,每周运行一次。唯一应该能够导致 I/O 的是安装了 SMF 的 apache2 webserver。我个人怀疑它可能是 mod_rewrite 检查文件是否存在之类的。
完整内核版本:
Linux #1 SMP Tue Mar 18 14:48:24 CET 2014 x86_64 x86_64 x86_64 GNU/Linux
# strace -fc -e trace=access curl 'https://www.google.com' > /dev/null
Process 7342 attached
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 259 100 259 0 0 903 0 --:--:-- --:--:-- --:--:-- 905
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
100.00 0.000048 0 7877 7872 access
------ ----------- ----------- --------- --------- ----------------
100.00 0.000048 7877 7872 total
答案1
我总是top
寻找最大的 VSIZE/VSS 或 RSS 进程,
然后我转到 /proc/<.PID>/ 子目录。
并检查smaps
文件中是否存在最大的违规目标文件、套接字以及库。