我有一台内存为12G的服务器。顶部的片段如下所示:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
12979 frank 20 0 206m 21m 12m S 11 0.2 26667:24 krfb
13 root 15 -5 0 0 0 S 1 0.0 36:25.04 ksoftirqd/3
59 root 15 -5 0 0 0 S 0 0.0 4:53.00 ata/2
2155 root 20 0 662m 37m 8364 S 0 0.3 338:10.25 Xorg
4560 frank 20 0 8672 1300 852 R 0 0.0 0:00.03 top
12981 frank 20 0 987m 27m 15m S 0 0.2 45:10.82 amarok
24908 frank 20 0 16648 708 548 S 0 0.0 2:08.84 wrapper
1 root 20 0 8072 608 572 S 0 0.0 0:47.36 init
2 root 15 -5 0 0 0 S 0 0.0 0:00.00 kthreadd
free -m
显示以下内容:
total used free shared buffers cached
Mem: 12038 11676 362 0 599 9745
-/+ buffers/cache: 1331 10706
Swap: 2204 257 1946
如果我理解正确,系统只有362 MB的可用内存。我的问题是:如何找出消耗大部分内存的进程?
正如背景信息一样,系统正在运行64bit OpenSuse 12
。
答案 0 :(得分:306)
使用linux / unix中的top命令快速提示
$ top
然后点击 Shift + m (即写一个大写M
)。
来自man top
SORTING of task window
For compatibility, this top supports most of the former top sort keys.
Since this is primarily a service to former top users, these commands do
not appear on any help screen.
command sorted-field supported
A start time (non-display) No
M %MEM Yes
N PID Yes
P %CPU Yes
T TIME+ Yes
或者:点击 Shift + f ,然后按键 n 按内存使用顺序选择显示,然后按输入。您将看到按内存使用情况排序的活动进程
答案 1 :(得分:271)
首先,重复这个咒语一段时间:“未使用的内存是浪费的内存”。 Linux内核保留了巨大的数量的文件元数据和所请求的文件,直到看起来更重要的东西将数据推出。这就是你可以运行的原因:
find /home -type f -name '*.mp3'
find /home -type f -name '*.aac'
让第二个find
实例以极快的速度运行。
Linux只留下一点内存'免费'来处理内存使用高峰而不需要太多努力。
其次,你想找到满足你所有记忆的过程;在top
中使用M
命令按内存使用排序。您可以随意忽略VIRT
列,它只是告诉您已分配了多少虚拟内存,而不是该进程使用了多少内存。 RES
报告驻留或当前处于ram中的内存量(相对于交换到磁盘或从未在第一时间实际分配,尽管被请求)。
但是,因为RES
会计算,例如几乎每个进程都有/lib/libc.so.6
个内存,但这并不是对进程使用多少内存的一个很好的衡量标准。 SHR
列报告与其他进程共享的内存量,但无法保证其他进程实际共享 - 它可以共享,只是没有其他人想要共享。
smem
工具旨在帮助用户更好地衡量每个流程应该真正指责的内存量。它做了一些聪明的工作来弄清楚什么是真正独特的,共享的,并按比例计算共享内存与共享内存的进程。 smem
可以帮助您了解您的记忆力比top
更好,但top
是一个很好的第一个工具。
答案 2 :(得分:37)
ps aux | awk '{print $2, $4, $11}' | sort -k2rn | head -n 10
(在sort命令中添加-n数字标志。)
答案 3 :(得分:28)
首先你应该阅读an explanation on the output of free
。结论:流程至少可以使用 10.7 GB 的内存。
然后你应该定义一个进程的“内存使用”(这不容易或毫不含糊,相信我)。
然后我们可以提供更多帮助: - )
答案 4 :(得分:20)
按内存使用情况列出和排序进程:
ps -e -orss=,args= | sort -b -k1,1n | pr -TW$COLUMNS
答案 5 :(得分:17)
<强> ps aux --sort '%mem'
强>
(Ubuntu 12.04上的默认值)生成如下输出:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
...
tomcat7 3658 0.1 3.3 1782792 124692 ? Sl 10:12 0:25 /usr/lib/jvm/java-7-oracle/bin/java -Djava.util.logging.config.file=/var/lib/tomcat7/conf/logging.properties -D
root 1284 1.5 3.7 452692 142796 tty7 Ssl+ 10:11 3:19 /usr/bin/X -core :0 -seat seat0 -auth /var/run/lightdm/root/:0 -nolisten tcp vt7 -novtswitch
ciro 2286 0.3 3.8 1316000 143312 ? Sl 10:11 0:49 compiz
ciro 5150 0.0 4.4 660620 168488 pts/0 Sl+ 11:01 0:08 unicorn_rails worker[1] -p 3000 -E development -c config/unicorn.rb
ciro 5147 0.0 4.5 660556 170920 pts/0 Sl+ 11:01 0:08 unicorn_rails worker[0] -p 3000 -E development -c config/unicorn.rb
ciro 5142 0.1 6.3 2581944 239408 pts/0 Sl+ 11:01 0:17 sidekiq 2.17.8 gitlab [0 of 25 busy]
ciro 2386 3.6 16.0 1752740 605372 ? Sl 10:11 7:38 /usr/lib/firefox/firefox
所以这里的Firefox是占据我内存16%的顶级消费者。
您可能也有兴趣:
ps aux --sort '%cpu'
答案 6 :(得分:4)
您可以使用以下步骤指定要排序的列:
steps: * top * shift + F * select a column from the list e.g. n means sort by memory, * press enter * ok
答案 7 :(得分:2)
我建立在gaoithe's answer的基础上,试图以兆字节为单位显示内存单元,并按内存降序排列,限制为15个条目:
ps -e -orss=,args= |awk '{print $1 " " $2 }'| awk '{tot[$2]+=$1;count[$2]++} END {for (i in tot) {print tot[i],i,count[i]}}' | sort -n | tail -n 15 | sort -nr | awk '{ hr=$1/1024; printf("%13.2fM", hr); print "\t" $2 }'
588.03M /usr/sbin/apache2
275.64M /usr/sbin/mysqld
138.23M vim
97.04M -bash
40.96M ssh
34.28M tmux
17.48M /opt/digitalocean/bin/do-agent
13.42M /lib/systemd/systemd-journald
10.68M /lib/systemd/systemd
10.62M /usr/bin/redis-server
8.75M awk
7.89M sshd:
4.63M /usr/sbin/sshd
4.56M /lib/systemd/systemd-logind
4.01M /usr/sbin/rsyslogd
下面是在bash配置文件中使用它的示例别名:
alias topmem="ps -e -orss=,args= |awk '{print \$1 \" \" \$2 }'| awk '{tot[\$2]+=\$1;count[\$2]++} END {for (i in tot) {print tot[i],i,count[i]}}' | sort -n | tail -n 15 | sort -nr | awk '{ hr=\$1/1024; printf(\"%13.2fM\", hr); print \"\t\" \$2 }'"
然后,您只需在命令行上输入topmem
。
答案 8 :(得分:1)
您可以通过在终端中执行此代码来查看内存使用情况:
$ watch -n2 free -m
$ htop
答案 9 :(得分:1)
如何按进程名称总计已用内存:
有时甚至查看最大的单个进程,仍然有很多未使用的内存。要检查是否有很多相同的较小的进程使用内存,可以使用以下命令,该命令使用awk汇总同名进程使用的总内存:
ps -e -orss=,args= |awk '{print $1 " " $2 }'| awk '{tot[$2]+=$1;count[$2]++} END {for (i in tot) {print tot[i],i,count[i]}}' | sort -n
例如输出
9344 docker 1
9948 nginx: 4
22500 /usr/sbin/NetworkManager 1
24704 sleep 69
26436 /usr/sbin/sshd 15
34828 -bash 19
39268 sshd: 10
58384 /bin/su 28
59876 /bin/ksh 29
73408 /usr/bin/python 2
78176 /usr/bin/dockerd 1
134396 /bin/sh 84
5407132 bin/naughty_small_proc 1432
28061916 /usr/local/jdk/bin/java 7
答案 10 :(得分:0)
时间紧迫
ps -U $(whoami) -eom pid,pmem,pcpu,comm | head -n4
不断更新
watch -n 1 'ps -U $(whoami) -eom pid,pmem,pcpu,comm | head -n4'
我还在这里添加了一些好东西,您可能会感激(或者您可能会忽略)
-n 1
每秒观看和更新
-U $(whoami)
仅显示您的进程。 $(某些命令)现在评估
| head -n4
要一次仅在公元前一次显示标头和3个进程,您只需要高使用率的订单项
${1-4}
说我的第一个论点$1
,我想默认为4,除非我提供了它
如果您使用的是Mac,则可能需要先安装watch 酿造安装手表
或者您可以使用一个函数
psm(){
watch -n 1 "ps -eom pid,pmem,pcpu,comm | head -n ${1-4}"
# EXAMPLES:
# psm
# psm 10
}
答案 11 :(得分:-1)
您有以下简单命令:
$ free -h