除此之外还有一个类似的问题,在这里回答同样的问题,让人们知道 linux proc stat vm info 目前是如何不准确的。
Valgrind 可以显示详细信息,但它会显着降低目标应用程序的速度,并且大多数情况下它会改变应用程序的行为。
我假设每个人都想知道的WRT“内存使用情况”如下......
在linux中,单个进程可能使用的物理内存量大致可以分为以下几类。
- 马匿名映射内存
- .p 私有
- .d 脏 == malloc/mmapped 堆和堆栈分配和写入的内存
- .c clean == malloc/mmapped 堆和堆栈内存一旦分配、写入、然后释放,但尚未回收
- .s 共享
- .d 脏 == 应该没有
- .c clean == 应该没有
- Mn 命名映射内存
- .p 私有
- .d 脏 == 文件映射写入内存私有
- .c clean == 映射程序/库文本私有映射
- .s 共享
- .d 脏 == 文件映射写入内存共享
- .c clean == 映射库文本共享映射
我宁愿按以下方式获取数字,以便以最少的开销获得实数。
您必须将这些总结起来才能将 ps 显示为 RSS 的内容进行划分,并获得更准确的数字以免混淆。
/proc/(pid)/status 试图显示这些数字,但它们失败了。
因此,与其尝试将 [anon]、[stack] 正确标记到每个映射,我希望 linux 内核人员将主线 proc 入口代码汇总并显示这些 Mapd、Mapc、Mnpd ......数字。
嵌入式 linux 的人会很高兴恕我直言。
映射:
awk '/^[0-9a-f]/{if ($6=="") {anon=1}else{anon=0}} /Private_Dirty/{if(anon) {asum+=$2}else{nasum+=$2}} END{printf "sum=%d\n",asum}' /proc/<pid>/smaps
地图:
awk '/^[0-9a-f]/{if ($6=="") {anon=1}else{anon=0}} /Private_Clean/{if(anon) {asum+=$2}else{nasum+=$2}} END{printf "sum=%d\n",asum}' /proc/<pid>/smaps
Mnpd:……等等