![pmap计算的私有内存,虚拟内存大小和常驻内存大小的组合?](https://linux22.com/image/45065/pmap%E8%AE%A1%E7%AE%97%E7%9A%84%E7%A7%81%E6%9C%89%E5%86%85%E5%AD%98%EF%BC%8C%E8%99%9A%E6%8B%9F%E5%86%85%E5%AD%98%E5%A4%A7%E5%B0%8F%E5%92%8C%E5%B8%B8%E9%A9%BB%E5%86%85%E5%AD%98%E5%A4%A7%E5%B0%8F%E7%9A%84%E7%BB%84%E5%90%88%EF%BC%9F.png)
可以使用 ps 命令获取进程的虚拟内存大小和常驻内存大小:
$ ps aux | grep apache2
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
www-data 31141 0.0 0.3 163864 24008 ? S 16:15 0:01 /usr/sbin/apache2 -k start
现在,虚拟内存和驻留内存无法提供进程真实内存占用的准确精度,因为它还考虑了共享库。
所以更好的解决方案是使用pmap来获取进程的真实内存使用情况。所以这是使用与上面相同的过程的 pmap 的输出:
$ sudo pmap -d 31141
31141: /usr/sbin/apache2 -k start
Address Kbytes Mode Offset Device Mapping
00007f85bbb82000 28 r-x-- 0000000000000000 0fc:00000 libnss_dns-2.15.so
...
...
mapped: 163864K writeable/private: 28420K shared: 592K
所以“writable/private”值是进程的私有内存,大约是28 mb。我的问题:这个私有内存只是主内存(RAM)还是这个数字还可能包括交换空间?
答案1
我发现这篇文章的标题是:了解 Linux 上的内存使用情况我认为它比我之前在 linuxquestions.org 网站上找到的更好,标题为:如何准确测量内存使用情况?。
摘自 了解记忆...帖子
皮秒输出USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
dbunker 3468 0.0 2.7 25400 14452 ? S 20:19 0:00 kdeinit: kedit
映射输出
Address Kbytes Mode Offset Device Mapping
08048000 40 r-x-- 0000000000000000 0fe:00000 kdeinit
08052000 4 rw--- 0000000000009000 0fe:00000 kdeinit
08053000 1164 rw--- 0000000008053000 000:00000 [ anon ]
40000000 84 r-x-- 0000000000000000 0fe:00000 ld-2.3.5.so
40015000 8 rw--- 0000000000014000 0fe:00000 ld-2.3.5.so
40017000 4 rw--- 0000000040017000 000:00000 [ anon ]
... (trimmed) ...
mapped: 25404K writeable/private: 2432K shared: 0K
描述正在发生的事情
如果你查看输出,你会发现Kbytes数最大的行通常是包含的共享库的代码段(以“lib”开头的是共享库)。这样做的好处是它们可以在进程之间共享。如果您分解出进程之间共享的所有部分,则最终会得到“可写/私有”总数,该总数显示在输出的底部。这可以被认为是该过程的增量成本,排除了共享库。因此,运行此 KEdit 实例的成本(假设所有共享库都已加载)约为 2 MB。这与 ps 报道的 14 或 25 兆字节完全不同。
进程 X 使用了多少交换空间?
您可以使用以下命令找出进程正在使用的交换空间:
$ grep VmSwap /proc/$(pidof chrome | awk '{print $1}')/status
VmSwap: 1324 kB
上面是获取第一个chrome
返回VmSwap
值的PID。
内存统计器
如果您正在寻找准确的内存测量值,您可能想看看这个工具,它的名字是memstat
:
cyberciti.biz 上有一个教程,标题为:Linux:找出什么占用了所有虚拟内存这体现memstat
在行动中。