我在我的系统上运行以下两个命令,得到不同的数字:

[root@rhel6 ~] grep Committed_AS /proc/meminfo
Committed_AS:      82964 kB

[root@rhel6 ~]# ps aux | awk '{vsz+=$5}END{print vsz}'
1580824

我的理解是committed_as是系统上当前分配的虚拟内存量。在我的第二个命令中,我将对“ps aux”输出中的vsz列(以KB为单位报告的已分配虚拟内存)求和。
为什么这些数字不一样?他们很不一样,所以很明显我一路上有些不明白。
有什么帮助吗?

最佳答案

这些数字如此不同的一个原因是,进程可以将虚拟地址范围保留为不可访问的,这只是为了防止将来的调用(如mmap()意外使用它们)。这些不可访问的范围包括在vss中,但不包括在提交的。
下面是使用这种不可访问范围的两个示例:
1)如果在多线程进程中使用libc malloc,它通常会创建多个“arenas”,以帮助减少同时执行malloc的线程之间的锁争用。对于除第一个竞技场(称为主竞技场)以外的每个竞技场,内存都保留在固定大小的堆中。在64位的情况下,这些堆每个都是64兆字节,但是当一个堆最初创建时,只有开始被赋予了rw访问权限。堆的尾部变得不可访问,随着堆的增长,进程逐渐扩展可读写的部分,并缩小不可访问的部分。
2)在加载共享库时,在最近的64位Linux进程中,某些部分的对齐限制高达2MB。通常,这会在每个共享库使用的地址范围的中间留下一个不可访问的区域,并且这些区域的大小通常为2mb或2mb-4k。

关于linux - Committed_AS与VSZ列的总和之间的差异,以ps为单位,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25952234/

10-13 09:19