我希望有人能给我指引正确的方向。
我最近更新了服务器上的一些软件,几天后,该软件因无法分配内存而崩溃。最初,我以为新版本中有一个错误,直到我检查了其他 Oracle Linux 7 服务器(没有更新的软件)并观察到以下情况:
[root@server yabbath]# free -mh
total used free shared buff/cache available
Mem: 62G 2.2G 42G 24M 18G 59G
Swap: 63G 0B 63G
[root@server2 yabbath]# free -mh
total used free shared buff/cache available
Mem: 62G 11G 4.1G 34M 47G 50G
Swap: 31G 0B 31G
不幸的是,监控不会减去 buff/cache 值,所以一切似乎都很好。实现这个之后,我得到了以下图表:
smem 输出如下
smem -r
PID User Command Swap USS PSS RSS
1485 mongod /usr/bin/mongod -f /etc/mon 0 1155092 1155941 1160916
20146 root /usr/sbin/nsrexecd 0 38884 38987 41232
1365 zabbix /usr/sbin/zabbix_agent2 -c 0 30956 31471 35648
1835 zabbix /usr/sbin/zabbix-agent2-plu 0 21796 21836 23304
1366 root /usr/bin/python2 -Es /usr/s 0 13060 14959 22176
682 root /usr/lib/systemd/systemd-jo 0 4988 14089 34972
1046 polkitd /usr/lib/polkit-1/polkitd - 0 8184 9462 14724
10225 root python /bin/smem -r 0 7592 8479 11488
1363 redis /usr/local/bin/redis-server 0 7132 7848 10776
1371 root /usr/sbin/rsyslogd -n 0 1876 7605 23312
1369 redis /usr/local/bin/redis-sentin 0 5992 6705 9624
1105 root /usr/sbin/NetworkManager -- 0 5164 6689 13908
1 root /usr/lib/systemd/systemd -- 0 4852 5658 10416
1040 root /usr/bin/VGAuthService -s 0 3596 4198 9340
717 root /usr/lib/systemd/systemd-ud 0 3240 3998 8468
有人能告诉我如何获取有关哪个进程使用了多少 buff/cache 内存的信息吗?
提前致谢并致以问候,
亚伯斯
编辑:
这只是众多服务器中的一台。我还有一些机器,其缓冲/缓存内存使用了 47GB,总共 64GB。
答案1
缓冲/缓存内存是每个实例的,并且由所有进程使用。目前您不必担心,因为您有 11GB 的缓存,总内存为 64GB。
你可以使用这些技术来查看里面的东西(来自这回答):
您可以使用 fincore 查看缓存中当前有哪些块。以下是项目页面中的一个例子:
# fincore --pages=false --summarize --only-cached *
stats for CLUSTER_LOG_2010_05_21.MYI: file size=93840384 , total pages=22910 , cached pages=1 , cached size=4096, cached perc=0.004365
stats for CLUSTER_LOG_2010_05_22.MYI: file size=417792 , total pages=102 , cached pages=1 , cached size=4096, cached perc=0.980392
stats for CLUSTER_LOG_2010_05_23.MYI: file size=826368 , total pages=201 , cached pages=1 , cached size=4096, cached perc=0.497512
stats for CLUSTER_LOG_2010_05_24.MYI: file size=192512 , total pages=47 , cached pages=1 , cached size=4096, cached perc=2.127660
stats for CLUSTER_LOG_2010_06_03.MYI: file size=345088 , total pages=84 , cached pages=43 , cached size=176128, cached perc=51.190476
至于如何清除它们,来自 man 5 proc:
/proc/sys/vm/drop_caches (since Linux 2.6.16) Writing to this file causes the kernel to drop clean caches, dentries, and inodes from memory, causing that memory to become free.
这对于内存管理测试和执行可重现的文件系统基准测试非常有用。由于写入此文件会导致缓存的好处丢失,因此会降低整体系统性能。
答案2
如果你看一下你的输出free -mh
,你会发现available+buf/cache
大于total
:
[root@server yabbath]# free -mh
total used free shared buff/cache available
Mem: 62G 2.2G 42G 24M 18G 59G
Swap: 63G 0B 63G
怎么做到的?很简单:只有那些本来不用的 RAM 才会被用作缓冲区/缓存内存,以加快 IO 操作。如果某个进程需要的 RAM 比当前多free
,则缓冲区/缓存池中的内存将被释放(可能在写回其内容之后),然后提供给请求进程。
对您来说,重要的指标是available
:这就是您的有效载荷实际可以使用的内容。