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

Eld*_*eek 8 memory swap

如果我有足够多的 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
Run Code Online (Sandbox Code Playgroud)

注意:该系统的正常运行时间不会超过 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
Run Code Online (Sandbox Code Playgroud)

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

Gil*_*il' 4

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

\n\n

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

\n\n

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

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

在没有 \xe2\x80\x9ccomplex\xe2\x80\x9d 的情况下,物理内存碎片可能会导致连接需要连续内存池的新设备时出现问题(内核为此保留了这样的池,但它们可能需要如果司机突然提出很大的要求,则放大)。如果设备使用率恒定,则物理碎片并不重要,特别是不会导致应用程序运行速度变慢或空间不足。

\n\n

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

\n\n

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

\n\n

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

\n\n

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

\n