内存碎片与系统上是否启用交换区之间有任何关系吗?

内存碎片与系统上是否启用交换区之间有任何关系吗?

答案之一如果我有足够的 RAM,我是否需要交换空间?让我想知道测量的内存碎片cat /proc/buddyinfo 与是否使用交换区之间是否存在任何关系。更具体地说,我想知道利用交换是否可以减少内存碎片。在正常的日子里,在我的系统上关闭交换工作时,我有这样的情况:

tvbox@tvbox-G31M-ES2L:~$ cat /proc/buddyinfo
Node 0, zone      DMA      3      3      4     14     16      6      2      0      0      1      0 
Node 0, zone   Normal   1564   1052    462    356    240    109     33     21      6      1      0 
Node 0, zone  HighMem     43   1972    839    285    183    109     98     34     16      0      0 
tvbox@tvbox-G31M-ES2L:~$ free
             total       used       free     shared    buffers     cached
Mem:       2053888    1821904     231984     171376     299908     812940
-/+ buffers/cache:     709056    1344832
Swap:            0          0          0

注意:该系统的正常运行时间不会超过 18 小时。

在使用更频繁的系统上,我有这个:

me@me-zippy:~$ cat /proc/buddyinfo
Node 0, zone      DMA    149    106     70     26     15      5      4      0      0      2      0 
Node 0, zone   Normal   2455   3527   4651   1421    367    157     61     19     14      3      0 
Node 0, zone  HighMem      7     43     75    266    166    162     91     43     27      0      0 
me@me-zippy:~$ free -h
             total       used       free     shared    buffers     cached
Mem:          7.4G       7.0G       351M       281M       116M       6.0G
-/+ buffers/cache:       967M       6.4G
Swap:           0B         0B         0B
me@me-zippy:~$ uptime
 12:01:49 up 3 days,  3:20,  2 users,  load average: 0.52, 0.23, 0.17

您会注意到这些系统都没有启用交换。

答案1

交换允许移动物理页面,从某种意义上说,用于一个目的的页面可以将其内容交换出来,然后用于另一个目的。

在各种虚拟内存管理系统下,就应用程序而言,不存在物理内存碎片之类的情况。应用程序分配的每个页面都可以位于物理内存中的任何位置,虚拟内存中的两个连续页面不需要在物理内存中具有任何特定的接近度。

在许多情况下,内存碎片都是一个问题:物理内存位置很重要的任何情况。这包括:

  • 半虚拟化,其中虚拟机以比一页更粗的粒度决定谁拥有哪个物理页。
  • 相似地,集群其中多个节点共享同一个 RAM 池。
  • 外设使用的内存,通常需要大的连续缓冲区。
  • 优化例如大页面

在没有“复杂”场景的情况下,物理内存碎片可能会导致连接需要连续内存池的新设备时出现问题(内核为此保留这样的池,但如果驱动程序突然产生大量内存,则可能需要扩大它们)要求)。如果设备使用率恒定,则物理碎片并不重要,特别是不会导致应用程序运行速度变慢或空间不足。

物理地址空间的碎片可能会导致内核中使用更多内存来表示空闲列表。我不相信Linux 是这种情况,但我还远不是其内存管理方面的专家。

总而言之,允许应用程序的一部分交换并不能使该应用程序分配更多内存,但可以使某些硬件驱动程序分配它们所需的内存。

添加交换区对应用程序的虚拟内存空间没有影响。毕竟,这就是交换的重点——它对应用程序是透明的。

但是,向计算机添加交换可能会对应用程序虚拟内存空间内的碎片产生间接影响。如果系统耗尽了虚拟内存,那么应用程序将不得不使用它所拥有的内存。如果应用程序正在使用从操作系统分配的大部分内存,随着时间的推移,这将导致该空间内出现碎片,因为小块会到处释放。如果应用程序有更多的虚拟内存(其中一些被换出),这将为内存管理器提供更多的操作空间,从而降低应用程序耗尽内存的风险,当它需要一个单独的 2kB 块时,可以使用三个独立的 2kB 块。 4kB 对象。

相关内容