因为大多数人认为交换=不好,如果您不减少交换性,系统将在实际上不需要时进行交换。这两者都不是真的。人们将交换与系统变得拥挤的时候联系在一起 - 然而,它主要是因为系统变得拥挤才进行交换,而不是相反。当系统进行交换时,它已经考虑到了性能成本,并决定不这样做会对系统性能或稳定性造成更大的整体损失。
总体而言,默认设置可以获得良好的性能和稳定性。我建议保持默认设置。Linux还有进一步改进内存管理以解决一些边缘情况的方法,但总体而言,交换性控制并不是一个好的解决办法 - 将其调整到一个方向可能修复一个问题,却会引发其他问题。如果可能的话,只需安装更多物理内存(并保持交换性不变)就能解决所有其他问题。
Linux如何使用RAM
任何未被应用程序使用的RAM都可以用作“缓存”。缓存对于快速、流畅运行的系统非常重要,可以加快对磁盘的读写速度。
如果您的应用程序增加了内存使用量,以至于几乎使用了所有的RAM,那么缓存将会减少,平均磁盘操作也会因此变慢。现在仅仅拥有几十兆字节或更少的缓存已经不够了。
如果应用程序进一步增加了内存使用量 - 假设您没有交换空间 - 您不仅没有空间来存储缓存,而且最终会耗尽内存,系统将不得不终止正在运行的进程。终止进程比减速更糟糕,因为它会导致系统不稳定、不可预测。
为了解决这两个问题,您的系统可以将一些很少使用的应用程序内存重新分配到磁盘上的交换空间中,从而释放RAM。额外的RAM可以防止进程因内存不足而死亡,并可以回收一些缓存,使磁盘操作更加顺畅。
这种重新分配并不是根据一个明确的截止点来进行的。在Linux开始交换之前,你并不会达到一定比例的分配。它采用了一种"模糊"算法。它考虑了很多因素,最好描述为"内存分配的压力有多大"。如果有很多"压力"来分配新的内存,那么它会增加一些被交换的机会以腾出更多空间。如果"压力"较小,则会减少这些机会。
您的系统有一个"swappiness"设置,可以帮助您调整如何计算这种"压力"。它经常被错误地表示为"RAM的百分比",但实际上它只是作为公式的一部分使用的值。建议的合理值在40到60之间,现在默认值是60。
让系统在需要时进行交换总体上是一件非常好的事情,即使您有很多RAM。如果系统需要时进行交换,可以让您放心,即使在临时低内存情况下(运行使用大量内存的短期进程时),您的系统也有第二次机会保持一切正常运行。如果您完全禁用交换,那么由于无法分配内存,您的进程可能会被终止。
当系统负载过重并且频繁进行交换时会发生什么?
交换是一个缓慢且代价高昂的操作,因此系统会避免使用它,除非计算结果显示在整体上通过牺牲缓存性能来弥补其不足,或者为了避免终止进程而必要。
很多时候,人们会看着他们的系统大量占用磁盘和交换空间,并将其归咎于交换。这是错误的方法。如果交换达到这种极端情况,说明交换是系统应对低内存问题的一种尝试,而不是问题的根本原因,没有交换,你的运行进程只会随机中断。
那桌面系统呢?它们需要采取不同的方法吗?
桌面系统的用户确实希望系统对用户发起的操作(如打开应用程序)有“即时响应”,这种操作有时会触发由于内存增加而引起的交换。
有些人尝试调整swappiness参数以增加系统对应用程序占用内存并且缓存空间不足的容忍度,以此来优化系统的反应速度。
然而,这只是在改变目标。第一个应用程序现在可能不需要进行交换操作就能加载,但它会为下一个加载的应用程序留下更少的空闲空间。同样的交换操作可能只会在你下次打开应用程序时发生。与此同时,由于缓存大小减小,系统性能总体上较低。因此,减少swappiness设置的任何好处可能很难衡量,有时可以减少交换延迟,但有时会导致其他性能下降。如果你知道自己在做什么,适当地减少swappiness可能是合理的,但将其降低到10以下可能会使系统对非常低的缓存大小具有容忍性,并且更容易在短时间内进行交换。
完全禁用交换应该避免,因为这样会失去对内存不足条件的额外保护,这可能导致进程崩溃或被终止。
迄今为止,最有效的解决方法是如果你负担得起的话,安装更多的RAM。
在已经有大量RAM的系统上是否可以禁用交换?
如果您的RAM比应用程序需要的要多得多,那么您很少需要交换空间。因此,在通常情况下禁用交换空间可能不会有任何影响。但是,如果您有足够的RAM,并且保持交换空间的启用状态也不会有任何惩罚,因为系统在不需要交换时不会进行交换。
唯一可能产生影响的情况是在系统内存不足并且缓存系统受到影响的情况下,这种情况下您可能需要交换空间。因此,当您有足够的内存时,可以放心地保持交换空间的正常设置,它永远不会对性能产生负面影响。
但是,交换空间如何加快系统速度?交换操作将数据从RAM转移到交换空间是一个缓慢的过程,但只有当内核非常确定通过保持合理的缓存大小所带来的整体益处大于此时才会进行。如果您的系统因磁盘读写过多而变得非常缓慢,那么交换空间并不是引起问题,而只是试图缓解问题。
一旦数据进入交换空间,它何时再次出来?
任何给定的内存部分只要被使用(读取或写入)就会从交换空间中返回。然而,通常被交换的内存是长时间未被访问且不会很快需要的内存。
将数据从交换空间转移出来与将其放入其中一样耗时。如果内核不需要,它就不会从交换空间中删除数据。当数据在交换空间中且未被使用时,它会为其他正在使用的内容和系统缓存腾出更多内存。
有哪些情况下降低交换性能是合适的呢?
是的。如果您运行的是专用于某个特定服务器应用程序的服务器,并且该应用程序不受系统缓存的影响。一些数据库服务器,如Oracle服务器、MySQL/MariaDB,在某些情况下建议将交换性能降低到1至10,因为这些数据库引擎使用自己的缓存。
请注意,这仅适用于您的系统专门用于执行该任务的情况,对于MySQL/MariaDB而言,仅当您使用纯粹的InnoDB或XtraDB而非MyISAM或Aria等引擎时才成立。如果您的系统的专用目的围绕着一个具有自己缓存且不受系统缓存影响的应用程序,降低交换性能可能是一个好主意。