如何查找或计算 Linux 进程的页表大小和其他内核记帐?
Posted
技术标签:
【中文标题】如何查找或计算 Linux 进程的页表大小和其他内核记帐?【英文标题】:How to find or calculate a Linux process's page table size and other kernel accounting? 【发布时间】:2010-10-25 14:54:21 【问题描述】:我怎样才能知道 Linux 进程的页表有多大,以及任何其他可变大小的进程记帐?
【问题讨论】:
我不确定是否理解您的问题:页表大小,AFAIK,不依赖于同一平台的进程(嗯。我可能错了,我不是 linux 大师..)。顺便说一句,我想知道:您真的是指页面 table 大小吗?或者您的意思是 页面大小,因为程序员更经常需要恕我直言? 我的意思是特定进程的页表正在消耗的(内核)内存量。 【参考方案1】:从 Linux 2.6.10 开始,单个进程的页表使用的内存量已通过 /proc/<pid>/status
的 VmPTE 字段公开。
【讨论】:
它似乎工作得很好,除非我用 mmap 分配大页面:报告的大小是一个小常数,不管分配的大小(内核 4.4.0-77)。 字段 VmPMD 报告的值似乎没问题,它随着分配的大小线性增长,即使是大页面也是如此。但我不认为它占整个页表(该人说“二级页表的大小”)。在试验经典页面时,该值大约比 VmPTE 低 500 倍。【参考方案2】:你应该描述你的问题,而不是询问细节。如果你 fork 太多(特别是对于具有大地址空间的进程),就会出现各种各样的问题(包括内存不足),恕我直言,达到分页表的最大大小不是一个现实的问题。
Thad 说,我也有兴趣阅读 Linux 中的进程分页表共享。
作为一个简单的经验法则,您可以假设每个进程在页表中占用一个与其虚拟大小相等的共享,例如每页 6 个字节。因此,例如,如果您有一个具有 8GB SGA 和 500 个进程共享它的 Oracle 数据库,则每个进程将使用 14MB 页面表,这导致 7GB 页面表+8GB SGA。 (样本编号来自http://kevinclosson.wordpress.com/2009/07/25/little-things-doth-crabby-make-%E2%80%93-part-ix-sometimes-you-have-to-really-really-want-your-hugepages/)
【讨论】:
哦,顺便说一句,一些数字现在有巨大的页面:kevinclosson.wordpress.com/2009/07/28/…【参考方案3】:嗯,回到 Ye Olden Tymes,我们曾经调用 nlist(3) 来获取我们感兴趣的数据的系统地址,然后打开 /dev/kmem,寻找地址,然后读取数据。不确定这是否适用于 Linux,但可能值得输入“man 3 nlist”并查看返回的内容。
【讨论】:
【参考方案4】:如果您真的对页表感兴趣,请做一个
$ cat /proc/meminfo | grep PageTables
PageTables: 24496 kB
【讨论】:
这很有用,但我需要确定这个尺寸是否“太大”。如果这个大小有一个限制会调用 fork() 失败,那么内核离这个限制有多近。理想情况下,我还需要找出特定进程正在使用 PageTables 大小的哪一部分,这样当 fork() 尝试复制该进程的表时,就会超出限制。【参考方案5】:不确定 Linux,但大多数 UNIX 变体为此提供了sysctl(3)
。还有sysctl(8)
命令行实用程序。
【讨论】:
什么 Unix 允许您通过 sysctl 读取 pagetablesize(相对于 pagesize)?以上是关于如何查找或计算 Linux 进程的页表大小和其他内核记帐?的主要内容,如果未能解决你的问题,请参考以下文章