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


127

在实际询问之前,请先明确一点:是的,我知道磁盘缓存,不,这不是我的情况:)对不起,此序言:)

我正在使用CentOS5。系统中的每个应用程序都在大量交换,并且系统非常慢。当我这样做时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。我上面唯一的过程是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
您是否找到了答案?
Hackeron 2015年

@Hackeron:OP接受了这个答案。我知道答案无法解决您的问题。我能够在我的一台服务器上重现您的问题,并且我目前正在研究是否有解决方法。
Deltik

@Deltik啊,好的。谢谢:)-我这里有2台服务器,它们泄漏了大约12个小时内所有可用的内存,请告知我是否有什么办法可以帮助诊断。我在IRC(irc.freenode.org)上的昵称是“ hackeron”。
Hackeron 2015年

@Hackeron:我无法在上找到您作为“ hackeron”的身份irc.freenode.org。我确实在这里创建了一个聊天室以进行进一步的讨论
Deltik 2015年

值得一提的是,ZFS内存中的ARC(和/或L2ARC)缓存未显示在其中free -m,但是可以在Linux上使用来查询其大小cat /proc/spl/kstat/zfs/arcstats | grep data_size
kqr

Answers:


112

在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

这使我可以Warning: bad ps syntax, perhaps a bogus '-'? See http://procps.sf.net/faq.html在Ubuntu服务器11.10上使用。
Der Hochstapler,2012年

1
@OliverSalzburg问题是-o选择。RHEL4这行得通。RHEL5:ps -e -o pid,vsz,comm= | sort -n -k 2有效。今晚晚些时候我会尝试11.10,但是如果您在之前找到正确的排序选项,请告诉我。 ps -e -o pid,vsz,comm | sort -n -k 2可能有效,但目前我没有验证的地方。
卡森(Karlson)2012年

2
我对这个-ef选项不是很熟悉。但这似乎产生了合理的输出:sudo ps axo pid,vsz,comm=|sort -n -k 2
Der Hochstapler 2012年

1
是的,我喜欢<我不知道这是可能的最高建议,fedora
SSH

2
略作修改的版本以获取占用RAM的进程并显示完整命令:ps -e --format=pid,rss,args | sort --numeric-sort --key=2
发出

71

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

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

8
欢迎来到超级用户。您能否扩大答案以解释此代码的作用以及如何解决该问题?不鼓励使用无法解释的代码,因为它不会教导解决方案。谢谢。
fixer1234 '16

9
我很惊讶这个答案被拒绝,并有评论要求解释它。.足够简短,应该清楚它的功能(将ps aux放入awk,然后进行排序),并在问题的上下文中显示哪个进程使用的内存最多。我认为这是一个很好的答案。
约翰

14

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

快速检查/ proc / meminfo以查找HugePages_设置,可以为对至少一个意外的内存占用进行故障排除的好开始。


2
我最近在另一台服务器上遇到了问题。如果您的组织中有前Oracle员工,则此设置可能是您的罪魁祸首。
字段

5

就我而言,问题是服务器是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的内存。因此,尽管“正式地”为我的VM提供了8 GB的存储空间,但实际上它要少得多:

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

2

您也可以使用ps命令来获取有关进程的更多信息。

ps aux | less

出于好奇,逃脱此命令的正确方法是什么?它显示END ocne我到达最后一行,当我按Ctrl + C时它不会终止该进程。
KingsInnerSoul 2015年

1
@KingsInnerSoul按'Q'
enobayram

2

我引用了这个Python进程使用的总内存吗?-堆栈溢出,这就是我的答案。我现在有一个特定的进程(python)计数工具。

# Megabyte.
$ ps aux | grep python | awk '{sum=sum+$6}; END {print sum/1024 " MB"}'
87.9492 MB

# Byte.
$ ps aux | grep python | awk '{sum=sum+$6}; END {print sum " KB"}'
90064 KB

附上我的流程清单。

$ ps aux  | grep python
root       943  0.0  0.1  53252  9524 ?        Ss   Aug19  52:01 /usr/bin/python /usr/local/bin/beaver -c /etc/beaver/beaver.conf -l /var/log/beaver.log -P /var/run/beaver.pid
root       950  0.6  0.4 299680 34220 ?        Sl   Aug19 568:52 /usr/bin/python /usr/local/bin/beaver -c /etc/beaver/beaver.conf -l /var/log/beaver.log -P /var/run/beaver.pid
root      3803  0.2  0.4 315692 36576 ?        S    12:43   0:54 /usr/bin/python /usr/local/bin/beaver -c /etc/beaver/beaver.conf -l /var/log/beaver.log -P /var/run/beaver.pid
jonny    23325  0.0  0.1  47460  9076 pts/0    S+   17:40   0:00 python
jonny    24651  0.0  0.0  13076   924 pts/4    S+   18:06   0:00 grep python

参考


1

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

#!/bin/sh
ps -eo rss,pid,user,command | sort -rn | head -10 | 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") }
 '

6
为什么?这是做什么的?它是如何工作的?不要告诉人们运行随机代码;解释其目的及其运作方式。
CVn

2
图1将为那些不了解的人解释代码,因为它似乎可以安全运行,但是下降表决可能会避开那些有用的代码。它运行的命令与上述答案中的命令相同,但是它使用AWK添加格式。我没有亲自运行该脚本,因为我没有用它,但是解释它可以帮助那些需要某种格式的人。
Dooley_labs

1
我已经阅读并运行了代码。它会像表格一样对齐字段,并使用前缀格式化已使用的常驻内存(例如1.12 GB,582.79 MB)。
StéphaneGourichon

0

这还将获取进程ID,按使用的MB排序,并概述命令(创建进程):

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


0

我在Hyper-V上的ubuntu服务器DISTRIB RELEASE = 18.04占用了大部分内存,但是所有进程都很好。(承认我已经删除了快照和无人值守的升级软件包,但仍然使用了95%的内存。)

答案是Hyper-V具有动态内存,因此它占用了内存供主系统使用,并且ubuntu将其标记为已使用。

希望它可以帮助某人。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.