答案之一如果我有足够的 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
交换允许移动物理页面,从某种意义上说,用于一个目的的页面可以将其内容交换出来,然后用于另一个目的。
在各种虚拟内存管理系统下,就应用程序而言,不存在物理内存碎片之类的情况。应用程序分配的每个页面都可以位于物理内存中的任何位置,虚拟内存中的两个连续页面不需要在物理内存中具有任何特定的接近度。
在许多情况下,内存碎片都是一个问题:物理内存位置很重要的任何情况。这包括:
在没有“复杂”场景的情况下,物理内存碎片可能会导致连接需要连续内存池的新设备时出现问题(内核为此保留这样的池,但如果驱动程序突然产生大量内存,则可能需要扩大它们)要求)。如果设备使用率恒定,则物理碎片并不重要,特别是不会导致应用程序运行速度变慢或空间不足。
物理地址空间的碎片可能会导致内核中使用更多内存来表示空闲列表。我不相信Linux 是这种情况,但我还远不是其内存管理方面的专家。
总而言之,允许应用程序的一部分交换并不能使该应用程序分配更多内存,但可以使某些硬件驱动程序分配它们所需的内存。
添加交换区对应用程序的虚拟内存空间没有影响。毕竟,这就是交换的重点——它对应用程序是透明的。
但是,向计算机添加交换可能会对应用程序虚拟内存空间内的碎片产生间接影响。如果系统耗尽了虚拟内存,那么应用程序将不得不使用它所拥有的内存。如果应用程序正在使用从操作系统分配的大部分内存,随着时间的推移,这将导致该空间内出现碎片,因为小块会到处释放。如果应用程序有更多的虚拟内存(其中一些被换出),这将为内存管理器提供更多的操作空间,从而降低应用程序耗尽内存的风险,当它需要一个单独的 2kB 块时,可以使用三个独立的 2kB 块。 4kB 对象。