![为什么 Mac 上的进程加起来不等于总物理内存?](https://linux22.com/image/1326881/%E4%B8%BA%E4%BB%80%E4%B9%88%20Mac%20%E4%B8%8A%E7%9A%84%E8%BF%9B%E7%A8%8B%E5%8A%A0%E8%B5%B7%E6%9D%A5%E4%B8%8D%E7%AD%89%E4%BA%8E%E6%80%BB%E7%89%A9%E7%90%86%E5%86%85%E5%AD%98%EF%BC%9F.png)
运行ps -ax -O 'rss user %mem
应该调用当前正在参与 Active 或 Wired 的所有进程,在 Mac 的定义中
“活动 + 有线 + 非活动 + 空闲 = 总物理内存”,对吗?
活动监视器显示出高积极的内存使用情况和手工计数显示数字较低,因此我使用下面的 awk 脚本重新计算。
注意活动监视器的屏幕截图1针对“活动”和“有线”。捕获时,“root”进程显示~377MiB,而非 root 进程总计~1805MiB 接近。
total: root 376632 KiB, and active 1805476 KiB , percent : 51.9
% root 8.4
% active 43.5
但是,关闭 Chrome 会让问题变得更明显。我有一张活动监视器截图2,带有脚本输出。这里,积极的也不有线记忆匹配。
total: root 365968 KiB, and active 643880 KiB , percent : 23.6
% root 8.2
% active 15.4
mem_count.sh:
3 ps -axmc -O 'rss user %mem' | awk '
4
5 BEGIN {
6 root = 0 ; active = 0 ; percent_root = 0.0 ;
7 percent_active = 0.0 ; percent = 0.0 ;
8 }
9
10 {
11 percent += $4
12 if ( $3 == "root") {
13 root += $2
14 percent_root += $4 ;
15 }
16 else {
17 active += $2
18 percent_active += $4 ;
19 }
20
21 }
22 END {
23 print "total: root ", root, "KiB, and active ", active , "KiB , percent : ", percent ;
24 print "% root " , percent_root
25 print "% active " , percent_active
26 }'
示例输出
$ ps -axmc -O 'rss user %mem'
PID RSS USER %MEM TT STAT TIME COMMAND
37 160964 root 3.8 ?? Ss 20:22.92 mds
...
这让人有点头疼。图片参考:
答案1
ps 显示以下统计信息用户进程仅有的。它不报告有关内核的统计信息。因此,不要指望 ps 报告的内存会等于总物理内存。
你似乎还误解了类 Unix 操作系统和 OSX 内存管理的一些关键概念。我不知道具体是哪一种,但这里
- 根!=内核:root 也是一个用户。
- 有线内存 != 根进程使用的内存
- 活动内存 != 进程使用的内存
- 非活动记忆并不像人们想象的那样工作:它还包括正在运行的进程的内存。阅读这个问题这为非活动记忆提供了一些见解。
底线是,活动监视器的聚合内存统计数据与 ps 报告的内存使用情况统计数据之间没有任何简单的关联。