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


8

如果我有足够多的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

您会注意到,这两个系统均未启用交换功能。


4
出于好奇,如果内存分散了,为什么会很重要?它不像硬盘那样需要寻找时间。无论如何,内存在逻辑上总是在进程的虚拟地址空间中连续出现,因此用户空间甚至无法判断内存是否在物理级别上分散了。是因为页面转换表变得更加复杂?
Celada

好问题。提出该条件是使用交换的原因。我仍然持怀疑态度,所以我正在寻找交换利用率和内存碎片之间的任何联系。我不希望找到任何人,但我总是愿意面对新信息改变立场。经过进一步测试,我可能最终自己回答这个问题。
极客老人

Answers:


3

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

在花园式虚拟内存管理系统下,就应用程序而言,不存在物理内存碎片的情况。应用程序分配的每个页面都可以占用物理内存中的任何位置,因此没有理由为什么虚拟内存中的两个连续页面在物理内存中需要具有任何特定的紧密度。

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

  • 准虚拟化,由虚拟机决定谁拥有哪个物理页面,其粒度大于一个页面。
  • 同样,几个节点共享同一RAM池的群集
  • 外设使用的内存,通常确实需要大的连续缓冲区。
  • 优化,例如大页面

在没有“复杂”场景的情况下,物理内存碎片可能会导致连接需要连续内存池的新设备出现问题(内核为此保留了这些池,但是如果驱动程序突然变大,则可能需要扩大它们)请求)。如果设备使用率恒定,则物理碎片将无关紧要,尤其不会导致应用程序运行缓慢或空间不足。

物理地址空间的碎片化可能会导致内核中使用更多内存来表示空闲列表。我不相信Linux中会出现这种情况,但我距离它的内存管理专家还很遥远。

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

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

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


每个答案如何引出新问题不是很有趣吗?现在,我发现自己对操作的内存管理顺序以及在达到内存不足状态之前释放内存的哪些技术失败感到好奇。我的假设是缓存最不重要,并且会先被转储。我知道这里有一个真相(双关语意)。;-)
极客长老2015年

@ElderGeek- Documentation / cgroups / memory.txt可能是一个不错的起点。尽管它已经过时了,但它确实很好地概述了内核内存控制器。
mikeserv

@mikeserv谢谢你。我还发现了-landley.net/writing/memory-faq.txt,它看起来也“非常过时”,但至少看来我的理论是先将逻辑上的高速缓存逻辑转储到可用RAM上,然后再采取杀死措施过程是准确的。我怀疑在不深入研究代码本身的情况下会学到更多。这可能超出我的范围,因为数十年来我除了bash脚本外还没有编写任何代码……
Geek老人
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.