Linux:找出正在使用所有 RAM 的进程?

Tim*_*mur 146 memory linux performance

在实际询问之前,要清楚:是的,我知道磁盘缓存,不,这不是我的情况:) 抱歉,对于这个序言:)

我用的是CentOS 5。系统中的每个应用程序都在大量交换,并且系统非常慢。当我这样做时free -m,这是我得到的:

             total       used       free     shared    buffers     cached
Mem:          3952       3929         22          0          1         18
-/+ buffers/cache:       3909         42
Swap:        16383         46      16337
Run Code Online (Sandbox Code Playgroud)

所以,我实际上只有 42 Mb 可以使用!据我了解,-/+ buffers/cache实际上并没有计算磁盘缓存,所以我确实只有42 Mb,对吗?我想,我可能是错的,所以我试图关闭磁盘缓存,但没有效果——图片保持不变。

所以,我决定找出谁在使用我所有的 RAM,然后我就使用top了它。但是,显然,它报告说没有进程正在使用我的 RAM。我最上面的唯一进程是 MySQL,但它使用 0.1% 的 RAM 和 400Mb 的交换。当我尝试运行其他服务或应用程序时相同的图片 - 全部进入交换,top显示未使用 MEM(任何进程的最大值为 0.1%)。

top - 15:09:00 up  2:09,  2 users,  load average: 0.02, 0.16, 0.11
Tasks: 112 total,   1 running, 111 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   4046868k total,  4001368k used,    45500k free,      748k buffers
Swap: 16777208k total,    68840k used, 16708368k free,    16632k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  SWAP COMMAND
 3214 ntp       15   0 23412 5044 3916 S  0.0  0.1   0:00.00  17m ntpd
 2319 root       5 -10 12648 4460 3184 S  0.0  0.1   0:00.00 8188 iscsid
 2168 root      RT   0 22120 3692 2848 S  0.0  0.1   0:00.00  17m multipathd
 5113 mysql     18   0  474m 2356  856 S  0.0  0.1   0:00.11 472m mysqld
 4106 root      34  19  251m 1944 1360 S  0.0  0.0   0:00.11 249m yum-updatesd
 4109 root      15   0 90152 1904 1772 S  0.0  0.0   0:00.18  86m sshd
 5175 root      15   0 90156 1896 1772 S  0.0  0.0   0:00.02  86m sshd
Run Code Online (Sandbox Code Playgroud)

重新启动无济于事,而且速度非常慢,我通常不会在这台机器(4 核、4Gb RAM、RAID1)上期待这种情况。

所以,有了这个 - 我很确定这不是一个使用 RAM 的磁盘缓存,因为通常它应该被减少并让其他进程使用 RAM,而不是去交换。

所以,最后,问题是 - 如果有人有任何想法如何找出实际如此大量使用内存的进程?

Kar*_*son 127

在 Linuxtop进程中你可以按<键将输出显示排序左移。默认情况下,它按 排序,%CPU因此如果您按 4 次键,您将按VIRT虚拟内存大小对其进行排序,从而为您提供答案。

另一种方法是:

ps -e -o pid,vsz,comm= | sort -n -k 2
Run Code Online (Sandbox Code Playgroud)

应该给你和输出按进程虚拟大小排序。

这是长版:

ps --everyone --format=pid,vsz,comm= | sort --numeric-sort --key=2
Run Code Online (Sandbox Code Playgroud)

  • 稍微修改的版本以获取占用 **RAM** 的进程并显示完整命令:`ps -e --format=pid,rss,args | 排序 --numeric-sort --key=2 ` (3认同)
  • 我不太熟悉`-ef` 选项。但这似乎产生了合理的输出:`sudo ps axo pid,vsz,comm=|sort -n -k 2` (2认同)
  • Ty,我喜欢 `&lt;` 的最高建议,我不知道这是可能的,fedora (2认同)

小智 95

以兆字节显示进程内存和进程路径。

ps aux  | awk '{print $6/1024 " MB\t\t" $11}'  | sort -n
Run Code Online (Sandbox Code Playgroud)

  • 我很惊讶这个答案被否决了,并且有一条评论要求解释它..它足够短,应该清楚它的作用(管道 ps aux 到 awk 然后排序),并且在问题的上下文中,它显示哪些进程使用的 RAM 最多。我认为这是一个很好的答案。 (13认同)
  • 欢迎使用超级用户。您能否扩展您的答案以解释此代码的作用以及它如何解决问题?无法解释的代码是 [不鼓励](http://meta.stackexchange.com/questions/148272),因为它没有教解决方案。谢谢。 (8认同)

小智 14

只是显示相同症状但仍显示内存耗尽的服务器上的附注。最终找到的是一个 sysctl.conf,来自一个 32 GB RAM 的盒子,并为一个 DB 设置了一个大页面配置为 12000。这个盒子只有 2 GB 的 RAM,所以它把所有可用的 RAM 分配给大页面(仅其中 960 个)。将大页面设置为 10,因为无论如何都没有使用,释放了所有内存。

快速检查 /proc/meminfo 以查找 HugePages_ 设置可能是解决至少一个意外内存占用问题的良好开端。

  • 我最近有另一台服务器,这是问题所在。如果您的组织中有前 Oracle 员工,则此设置可能是您的罪魁祸首。 (3认同)

Fel*_*ipe 5

制作一个show-memory-usage.sh带有内容的脚本:

#!/bin/sh
ps -eo rss,pid,user,command | sort -rn | head -$1 | awk '{ hr[1024**2]="GB"; hr[1024]="MB";
 for (x=1024**3; x>=1024; x/=1024) {
 if ($1>=x) { printf ("%-6.2f %s ", $1/x, hr[x]); break }
 } } { printf ("%-6s %-10s ", $2, $3) }
 { for ( x=4 ; x<=NF ; x++ ) { printf ("%s ",$x) } print ("\n") }
 '
Run Code Online (Sandbox Code Playgroud)

使其可执行chmod +x show-memory-usage.sh并像这样调用它./show-memory-usage.sh 10(10 => 最多显示 10 行)

输出示例:

5.54   GB 12783  mysql      /usr/sbin/mysqld

1.02   GB 27582  root       /usr/local/cpanel/3rdparty/bin/clamd

131.82 MB 1128   company+   /opt/cpanel/ea-php73/root/usr/bin/php /home/companyde/redesign.company.de/bin/magento queue:consumers:start inventory.mass.update --single-thread --max-messages=10000

131.21 MB 1095   company+   /opt/cpanel/ea-php73/root/usr/bin/php /home/companyde/redesign.company.de/bin/magento queue:consumers:start product_action_attribute.update --single-thread --max-messages=10000

131.19 MB 1102   company+   /opt/cpanel/ea-php73/root/usr/bin/php /home/companyde/redesign.company.de/bin/magento queue:consumers:start product_action_attribute.website.update --single-thread --max-messages=10000

130.80 MB 1115   company+   /opt/cpanel/ea-php73/root/usr/bin/php /home/companyde/redesign.company.de/bin/magento queue:consumers:start exportProcessor --single-thread --max-messages=10000

130.69 MB 1134   company+   /opt/cpanel/ea-php73/root/usr/bin/php /home/companyde/redesign.company.de/bin/magento queue:consumers:start inventory.reservations.update --single-thread --max-messages=10000

130.69 MB 1131   company+   /opt/cpanel/ea-php73/root/usr/bin/php /home/companyde/redesign.company.de/bin/magento queue:consumers:start inventory.reservations.cleanup --single-thread --max-messages=10000

130.69 MB 1107   company+   /opt/cpanel/ea-php73/root/usr/bin/php /home/companyde/redesign.company.de/bin/magento queue:consumers:start codegeneratorProcessor --single-thread --max-messages=10000

130.58 MB 1120   company+   /opt/cpanel/ea-php73/root/usr/bin/php /home/companyde/redesign.company.de/bin/magento queue:consumers:start inventory.source.items.cleanup --single-thread --max-messages=10000
Run Code Online (Sandbox Code Playgroud)

  • 为什么?这有什么作用?它是如何工作的?不要告诉人们运行随机代码;解释它的目的和它是如何工作的。 (10认同)
  • 图我将为那些不理解的人解释代码,因为它似乎可以安全地运行,但是downvote 可能会阻止那些对它有用的人。它运行的命令与 [above answers](https://superuser.com/a/398870/338974) 中的命令相同,但它使用 AWK 添加格式。我没有亲自运行脚本,因为我对它没有用处,但解释它可以帮助那些需要一些格式的人。 (4认同)

小智 5

就我而言,问题是服务器是vmw_balloon启用了模块的 VMware 虚拟服务器:

$ lsmod | grep vmw_balloon
vmw_balloon            20480  0
vmw_vmci               65536  2 vmw_vsock_vmci_transport,vmw_balloon
Run Code Online (Sandbox Code Playgroud)

跑步:

$ vmware-toolbox-cmd stat balloon
5189 MB
Run Code Online (Sandbox Code Playgroud)

因此,主机实际上回收了大约 5 GB 的内存。因此,尽管“正式”为我的 VM 提供了 8 GB,但实际上它要少得多:

$ free
              total        used        free      shared  buff/cache   available
Mem:        8174716     5609592       53200       27480     2511924     2458432
Swap:       8386556        6740     8379816
Run Code Online (Sandbox Code Playgroud)