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

我正在使用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,然后再进行交换。

最后,问题是-如果有人有什么想法如何找出实际使用内存的进程是什么?

评论

您找到答案了吗?

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

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

@Hackeron:我在irc.freenode.org上找不到您是“ hackeron”。我确实在这里创建了一个聊天室以进行进一步的讨论。

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

#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


评论


这给了我警告:错误的ps语法,也许是假的“-”?请参阅Ubuntu服务器11.10上的http://procps.sf.net/faq.html。

–霍赫斯塔普勒(Der Hochstapler)
2012年3月9日14:36

@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可能有用,但是我现在没有地方可以验证。

–卡尔森
2012年9月9日14:40



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

–霍赫斯塔普勒(Der Hochstapler)
2012年3月9日14:43

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

–SSH此
2012年6月6日下午0:29

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

–僧侣
18-09-10在8:16



#2 楼

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

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


评论


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

–fixer1234
16年2月9日在22:03

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

–约翰
16年5月10日在22:51

#3 楼

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

快速检查/ proc / meminfo以查找HugePages_设置至少可以成为排除故障的好开始一只意外的记忆猪。

评论


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

–字段
2014年7月15日14:20

#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的内存。因此,尽管“正式”为我的VM提供了8 GB的存储空间,但实际上它要少得多:

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


#5 楼

编写一个名为show-memory-usage.sh的脚本,其内容如下:
#!/bin/sh
ps -eo rss,pid,user,command | sort -rn | head - | awk '{ hr[1024**2]="GB"; hr[1024]="MB";
 for (x=1024**3; x>=1024; x/=1024) {
 if (>=x) { printf ("%-6.2f %s ", /x, hr[x]); break }
 } } { printf ("%-6s %-10s ", , ) }
 { for ( x=4 ; x<=NF ; x++ ) { printf ("%s ",$x) } print ("\n") }
 '

使它与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


评论


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

–用户
16-10-21在11:01

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

–Dooley_labs
17年1月4日在5:05



我已经阅读并运行了代码。它将表等字段对齐,并使用前缀格式化已消耗的常驻内存(例如1.12 GB,582.79 MB)。

–StéphaneGourichon
19 Mar 26 '19在11:17

我添加了一个输出示例,并对脚本进行了改进,使其可以接受。

–黑色
20-08-26在11:08



#6 楼

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

ps aux | less


评论


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

– KingsInnerSoul
15年11月13日在16:09

@KingsInnerSoul按'q'

– enobayram
15年11月16日在13:41

#7 楼

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

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

# Byte.
$ ps aux | grep python | awk '{sum=sum+}; 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


参考资料


内存-Linux:找出正在使用所有RAM的进程是什么? -超级用户
Python进程使用的总内存是多少? -堆栈溢出
linux-ps aux输出含义-超级用户


#8 楼

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

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

#9 楼

我在Hyper-V上的ubuntu服务器DISTRIB RELEASE = 18.04占用了大部分内存,但是所有进程都很好。 (承认我已经删除了快照和无人值守的upgr程序包,但仍使用了95%的内存。)答案是Hyper-V具有动态内存,因此它占用了主系统使用的内存,并且ubuntu将其标记为已使用。

希望对别人有帮助。