如何查看Linux';RAM视图,以确定碎片

如何查看Linux';RAM视图,以确定碎片,linux,ram,Linux,Ram,我所知道的唯一相关程序是pmap,但它只打印一个进程的内存 我想看看物理内存是如何被占用的,以及整个物理RAM的哪个进程/库(包括内核)(与pmap进程的POV相反) 理想情况下,还可以使用图形界面 你知道有没有这样的工具吗 我知道图书馆带来的歧义。如果是这样,它可以显示一条1像素宽的线和指向该库实际位置的箭头 我需要这个做什么?查看RAM碎片。内存碎片 当Linux系统运行一段时间后,内存碎片会增加,这在很大程度上取决于在其上运行的应用程序的性质。分配和释放内存的进程越多,内存碎片化的速度就越

我所知道的唯一相关程序是
pmap
,但它只打印一个进程的内存

我想看看物理内存是如何被占用的,以及整个物理RAM的哪个进程/库(包括内核)(与
pmap
进程的POV相反)

理想情况下,还可以使用图形界面

你知道有没有这样的工具吗

我知道图书馆带来的歧义。如果是这样,它可以显示一条1像素宽的线和指向该库实际位置的箭头

我需要这个做什么?查看RAM碎片。

内存碎片 当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内存碎片。第二行显示低内存碎片,第三行显示高内存碎片。输出显示低内存区域中的内存碎片。但在高内存区域中有许多大内存块可用,例如284MB

如果内存信息没有转储到/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中的每个数字所指的内容


来源:

你为什么要看这个?除非您正在开发内核代码或拥有NUMA系统,否则它不应该很重要。您是否将物理内存碎片与用户空间内存分配器引入的内存碎片混淆了?不,我没有混淆任何东西。我说我的系统上有2Gb的RAM,我想看看内核是如何使用这个芯片的。我只是想看看,谁知道以后会有什么问题。啊,为了学习而学习:-)+1@thkala它被称为探索:-)一个重要的细节:应用程序无论如何都不会分配连续的内存块-它们只能访问虚拟内存。只有内核需要连续的物理块——这就是物理RAM碎片可能存在的问题memset()调用或一些避免过度使用的东西…@thkala:一些用户空间请求可能最终需要连续内存,例如AF_UNIX dgram/seqpacket发送,请参阅@ninjalj:true,有相当多的内核服务需要大量的连续分配,这就是linux-2.6.35中引入内存压缩的原因。其中一些甚至是由于代码错误造成的-不久前我不得不调试一个V4L驱动程序,该驱动程序使用kmalloc而不是vmalloc作为其视频缓冲区。。。