我正在使用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 楼
在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将其标记为已使用。希望对别人有帮助。
评论
您找到答案了吗?@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。