Oracle Linux 7 - 哪些进程使用了​​这么多的缓冲/缓存内存

Oracle Linux 7 - 哪些进程使用了​​这么多的缓冲/缓存内存

我希望有人能给我指引正确的方向。

我最近更新了服务器上的一些软件,几天后,该软件因无法分配内存而崩溃。最初,我以为新版本中有一个错误,直到我检查了其他 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:这就是您的有效载荷实际可以使用的内容。

相关内容