我有一台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
.
8 回答
首先,重复这个咒语一段时间:"unused memory is wasted memory" . Linux内核保留了大量的文件元数据和所请求的文件,直到看起来更重要的东西将数据推出 . 这就是为什么你可以运行:
让第二个
find
实例以荒谬的速度运行 .Linux只留下一点内存“免费”来处理内存使用量的峰值而不需要太多努力 .
其次,你想要找到满足你所有记忆的过程;在
top
中使用M
命令按内存使用排序 . 您可以随意忽略VIRT
列,它只会告诉您已分配了多少虚拟内存,而不是该进程使用了多少内存 .RES
报告了驻留或当前处于ram中的内存量(相对于交换到磁盘或从未实际分配过的内存,尽管被请求) .但是,因为
RES
将计算,例如/lib/libc.so.6
几乎每个进程都有一次内存,它并不是一个过程正在使用多少内存的精确度量 .SHR
列报告与其他进程共享多少内存,但不能保证另一个进程实际共享 - 它可以是可共享的,只是没有其他人想要共享 .smem工具旨在帮助用户更好地测量每个进程应该归咎于多少内存 . 它做了一些聪明的工作来弄清楚什么是真正独特的,共享的,并按比例计算共享内存与共享内存的进程 .
smem
可以帮助你了解你的记忆力比top
更好,但top
是一个很好的第一个工具 .在linux / unix中使用top命令使用快速提示
然后点击Shift m(即写一个大写
M
) .来自
man top
或者:点击Shift f,然后按键n选择显示按存储器使用顺序,然后按Enter键 . 您将看到按内存使用情况排序的活动进程
(在sort命令中添加-n数字标志 . )
首先你应该阅读an explanation on the output of free . 结论:流程至少可以使用 10.7 GB 的内存 .
然后你应该定义一个进程的“内存使用”(它不容易或不明确,相信我) .
然后我们可以帮助更多:-)
按内存使用列出和排序进程:
ps aux --sort '%mem'
来自procps' ps(Ubuntu 12.04上的默认值)生成如下输出:
所以这里的Firefox是最重要的消费者,拥有16%的内存 .
您也可能对 . . . 有兴趣:
您可以使用以下步骤指定要排序的列:
您可以通过在终端中执行此代码来查看内存使用情况: