2012-03-09 14:13:35 +0000 2012-03-09 14:13:35 +0000
131
131
Advertisement

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

Advertisement

在真正问之前,先说清楚:是的,我知道磁盘缓存,不,不是我的情况:) 对不起,这个序言:)

我使用的是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

所以,我实际上只有42Mb可以使用! 据我了解,-/+ buffers/cache其实并没有计算磁盘缓存,所以我确实只有42Mb,对吗?我想,可能是我想错了,于是我试着关闭了磁盘缓存,结果没有任何效果–图片还是老样子。

于是,我决定查出我所有的内存都被谁用掉了,于是我用top来查。但是,很明显,它报告说没有进程使用我的RAM。我的顶部唯一的进程是MySQL,但它使用了0.1%的RAM和400Mb的swap。

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

&001

重启无济于事,而且,它们的速度很慢,这在这台机器上是****慢的,我通常不会想到的(4核,4Gb RAM,RAID1)。

所以,我很确定这不是磁盘缓存,是谁在使用内存,因为通常情况下,它应该被减少,让其他进程使用内存,而不是去交换。

Advertisement

答案 (9)

115
115
115
2012-03-09 14:25:01 +0000

在Linux上,在top进程中,你可以按<键将输出显示的排序向左移动。默认情况下,它是由%CPU排序的,所以如果你按了4次这个键,你就会按VIRT来排序,而&007是虚拟内存大小,你就会得到答案。

78
78
78
2016-02-09 21:12:26 +0000

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

14
Advertisement
14
14
2012-10-15 15:05:01 +0000

只是在一个显示同样症状但仍然显示内存耗尽的服务器上的一个侧面说明。最终发现的是一个有32GB内存的盒子里的sysctl.conf,并为DB设置了一个配置为12000的巨大页面。这个盒子只有2GB的RAM,所以它将所有的空闲RAM分配给了巨大的页面(只有960个)。将巨页设置为10,因为没有使用过,所以释放了所有的内存。

快速检查/proc/meminfo中的HugePages_设置,至少可以作为一个很好的开端来排除内存占用的问题。

5
5
5
2018-03-31 03:38:27 +0000

在我的情况下,问题是服务器是一个VMware虚拟服务器,启用了vmw_balloon模块:

$ 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

,所以大约5GB的内存实际上被主机回收了。因此,尽管我的VM “官方 "有8GB的内存,但实际上要少得多:

$ free
              total used free shared buff/cache available
Mem: 8174716 5609592 53200 27480 2511924 2458432
Swap: 8386556 6740 8379816
2
Advertisement
2
2
2013-07-08 06:05:54 +0000

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

ps aux | less
2
2
2
2016-10-21 10:51:37 +0000

我参考了【这个】(https://superuser.com/a/1037753/205255)和【Python进程使用的内存总量? - Stack Overflow】(https://stackoverflow.com/a/40173829/686105),这就是我的答案。

# 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

附上我的进程列表。 &001

参考

1
Advertisement
1
1
2016-03-14 20:50:46 +0000

制作一个名为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") }
 '
```。
0
0
0
2019-07-12 19:46:37 +0000

我的ubuntu服务器DISTRIB RELEASE=18.04的Hyper-V上的ubuntu服务器使用了大部分内存,但所有进程都没有问题。(承认我已经删除了snapd和unattended-upgr包,但95%的内存还是被使用了。)

答案是Hyper-V有动态内存,所以它占用了主系统使用的内存,而ubuntu标记为已使用。

0
Advertisement
0
0
2019-03-31 17:51:48 +0000

这也会获取进程的id,按使用的MB进行排序,并概述(创建进程的命令):

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

Advertisement
Advertisement