如何查看 Linux 的 RAM 视图以确定碎片
Posted
技术标签:
【中文标题】如何查看 Linux 的 RAM 视图以确定碎片【英文标题】:How to see Linux' view of the RAM in order to determinate the fragmentation 【发布时间】:2011-02-01 14:26:09 【问题描述】:我知道的唯一相关程序是pmap
,但这只会打印一个进程的内存。
我想看看 物理内存 是如何被占用的,以及整个物理 RAM 的进程/库(包括内核)被哪些进程/库占用(与 @987654322 的进程 POV 中的相反) @)。
最好还带有图形界面。
你知道有没有这样的工具?
我知道图书馆引入的歧义。如果是这种情况,它可以显示一条 1 像素宽的线和一个指向该库的实际位置的箭头。
我需要这个做什么?查看 RAM 碎片。
【问题讨论】:
你为什么想看那个?除非您正在开发内核代码或拥有 NUMA 系统,否则它并不重要。您是否将物理内存碎片与用户空间内存分配器引入的内存碎片混淆了? 不,我没有混淆任何东西。我说我的系统上有 2Gb 的 RAM,我想看看内核是如何真正使用这个芯片的。我就是想看看,谁知道后面会提出什么问题呢。 啊,为了学习而学习 :-) +1 @thkala 这叫做探索 :-) 【参考方案1】:内存碎片
当 Linux 系统运行一段时间后,内存碎片可能会增加,这在很大程度上取决于在其上运行的应用程序的性质。分配和释放内存的进程越多,内存碎片就越快。并且内核可能并不总是能够按时为请求的大小整理足够的内存。如果发生这种情况,即使有足够的可用内存,应用程序也可能无法分配更大的连续内存块。从 2.6 内核(即 RHEL4 和 SLES9)开始,内存管理得到了极大的改进,内存碎片问题已经不再那么严重了。
要查看内存碎片,您可以使用神奇的 SysRq 键。只需执行以下命令:
# echo m > /proc/sysrq-trigger
此命令会将当前内存信息转储到 /var/log/messages。以下是 RHEL3 32 位系统的示例:
Jul 23 20:19:30 localhost kernel: 0*4kB 0*8kB 0*16kB 1*32kB 0*64kB 1*128kB 1*256kB 1*512kB 1*1024kB 0*2048kB 0*4096kB = 1952kB)
Jul 23 20:19:30 localhost kernel: 1395*4kB 355*8kB 209*16kB 15*32kB 0*64kB 0*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 12244kB)
Jul 23 20:19:31 localhost kernel: 1479*4kB 673*8kB 205*16kB 73*32kB 21*64kB 847*128kB 473*256kB 92*512kB 164*1024kB 64*2048kB 28*4096kB = 708564kB)
第一行显示 DMA 内存碎片。第二行显示低内存碎片,第三行显示高内存碎片。输出显示 Low Memory 区域中的内存碎片。但是高内存区域中有许多大内存块可用,例如28 4MB。
如果内存信息未转储到 /var/log/messages,则未启用 SysRq。您可以通过将 sysrq 设置为 1 来启用 SysRq:
# echo 1 > /proc/sys/kernel/sysrq
从 2.6 内核开始,即 RHEL4 和 SLES9,您不需要 SysRq 转储内存信息。您可以简单地检查 /proc/buddyinfo 的内存碎片。
这是运行 2.6 内核的 64 位服务器的输出:
# cat /proc/buddyinfo
Node 0, zone DMA 5 4 3 4 3 2 1 0 1 1 2
Node 0, zone Normal 1046 527 128 36 17 5 26 40 13 16 94
# echo m > /proc/sysrq-trigger
# grep Normal /var/log/messages | tail -1
Jul 23 21:42:26 localhost kernel: Normal: 1046*4kB 529*8kB 129*16kB 36*32kB 17*64kB 5*128kB 26*256kB 40*512kB 13*1024kB 16*2048kB 94*4096kB = 471600kB
#
在本例中,我再次使用 SysRq 来显示 /proc/buddyinfo 中的每个数字所指的内容。
来源:http://www.puschitz.com/pblog/
【讨论】:
一个重要细节:应用程序无论如何都不会分配连续的内存块——它们只能访问虚拟内存。只有内核需要连续的物理块——这就是物理 RAM 碎片可能成为问题的地方。 这里有一个小测试来检查这一点:char *p = malloc(256 * 1024 * 1024);
它应该在大多数现代系统上都能成功,只要它们没有处于内存耗尽的边缘。
嗯...从技术上讲,您还需要一个 memset()
电话或其他东西以避免过度使用...
@thkala:一些用户空间请求可能最终需要连续内存,例如 AF_UNIX dgram/seqpacket 发送,请参阅***.com/questions/4729315/…
@ninjalj:是的,有很多内核服务需要大量的连续分配——这就是为什么在 linux-2.6.35 中引入了内存压缩。其中一些甚至是由于代码损坏 - 前段时间我不得不调试一个 V4L 驱动程序,该驱动程序使用 kmalloc 而不是 vmalloc 作为其视频缓冲区...以上是关于如何查看 Linux 的 RAM 视图以确定碎片的主要内容,如果未能解决你的问题,请参考以下文章