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

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

在实际询问之前,首先要明确一点:是的,我知道磁盘缓存,但不,这不是我的情况:)抱歉,对于这个开场白:)

我正在使用 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

所以,我实际上只有 42 Mb 可用!据我所知,-/+ buffers/cache实际上不包括磁盘缓存,所以我确实只有 42 Mb,对吗?我想我可能是错的,所以我尝试关闭磁盘缓存,但没有任何效果 - 图片保持不变。

因此,我决定找出谁在使用我的所有 RAM,并top为此使用了它们。但是,显然,它报告说没有进程在使用我的 RAM。我的 top 中唯一的进程是 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

重启没有用,顺便说一下非常速度很慢,这在我通常情况下是不会在该机器(4 核、4GB RAM、RAID1)上运行的。

因此,我很确定这不是磁盘缓存,谁在使用 RAM,因为通常应该减少它并让其他进程使用 RAM,而不是去交换。

所以,最后的问题是——是否有人知道如何找出哪个进程实际上如此大量地使用内存?

答案1

在 Linux 上,top您可以按下<键将输出显示排序向左移动。默认情况下,它是按 排序的,%CPU因此,如果您按下 键 4 次,您将按VIRT虚拟内存大小 排序,从而得到答案。

另一种方法是:

ps -e -o pid,vsz,comm= | sort -n -k 2

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

以下是完整版本:

ps --everyone --format=pid,vsz,comm= | sort --numeric-sort --key=2

答案2

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

ps aux  | awk '{print $6/1024 " MB\t\t" $11}'  | sort -n

答案3

附注:服务器上出现了同样的症状,但仍然显示内存耗尽。最后找到的是一台 sysctl.conf,它来自一个有 32 GB RAM 的机器,并且为数据库设置了大页面,配置为 12000。这个机器只有 2 GB RAM,所以它将所有可用 RAM 分配给大页面(只有 960 个)。将大页面设置为 10(因为反正没有使用大页面),释放了所有内存。

快速检查 /proc/meminfo 来查找 HugePages_ 设置可以很好地开始解决至少一个意外的内存占用问题。

答案4

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

$ lsmod | grep vmw_balloon
vmw_balloon            20480  0
vmw_vmci               65536  2 vmw_vsock_vmci_transport,vmw_balloon

跑步:

$ vmware-toolbox-cmd stat balloon
5189 MB

因此,主机实际上回收了大约 5 GB 的内存。因此,尽管我的虚拟机“正式”拥有 8 GB 的内存,但实际上却少得多:

$ free
              total        used        free      shared  buff/cache   available
Mem:        8174716     5609592       53200       27480     2511924     2458432
Swap:       8386556        6740     8379816

相关内容