因为大多数人认为交换=不好,并且如果您不减少交换问题,那么系统将在真正不需要时进行交换。这些都不是真的。人们将交换与他们的系统陷入困境的时间联系在一起-但是,这主要是因为系统在陷入困境,而不是相反。当系统进行交换时,它将在决定交换时已经考虑了性能成本,并决定不这样做将对系统性能或稳定性造成更大的总体损失。
总体而言,默认设置可提供良好的总体性能和稳定性。我建议将其保留为默认值。Linux还有进一步的途径来改善其内存管理以解决某些极端情况,但是总的来说,交换控制不是一个好的解决方法-朝一个方向调整它,您可能会解决一个问题并造成其他问题。如果可能的话,只需安装更多的物理RAM(并保持交换能力),就会使所有其他补救措施黯然失色。
Linux如何使用RAM
应用程序未使用的任何RAM都可以用作“缓存”。高速缓存对于快速,平稳运行的系统非常重要,它可以加快磁盘的读写速度。
如果您的应用程序将其内存使用量增加到几乎使用所有RAM的程度,则缓存将减少,平均而言,磁盘操作将因此而变慢。如今仅拥有几十兆字节或更少的缓存是不够的。
如果应用程序进一步增加内存使用量(假设您没有交换空间),则不仅将没有缓存空间,而且最终将耗尽内存,系统将不得不终止正在运行的进程。杀死进程比放慢速度要糟,因为它会给您带来不稳定,不可预测的系统。
Linux如何使用交换
为了解决这两个问题,您的系统可以将一些很少使用的应用程序内存重新分配给磁盘上的交换空间,从而释放RAM。额外的RAM可以防止由于内存不足而导致进程死机,并可以回收少量缓存,从而使磁盘操作可以更平稳地运行。
但是,此重新分配并未根据明确的截止时间进行。Linux开始交换之后,您没有达到一定的分配百分比。它具有“模糊”算法。它考虑了很多事情,最好用“内存分配有多少压力”来描述。如果分配新内存的压力很大,那么将增加交换某些内存以腾出更多空间的机会。如果“压力”较小,则将减少这些机会。
您的系统具有“ swappiness”设置,可帮助您调整“压力”的计算方式。它通常被错误地表示为“ RAM的百分比”,但事实并非如此,它只是用作公式一部分的值。建议的理智值在40到60之间,当今是默认值60。
即使您有很多RAM,让系统在必要时进行交换也是一件好事。如果需要交换系统,可以让您高枕无忧,即使您暂时遇到内存不足的情况(在运行使用大量内存的较短进程时),系统也有第二次机会使所有内容保持运行。如果您要完全禁用交换,则可能会由于无法分配内存而导致进程被杀死。
当系统陷入瘫痪并大量交换时,会发生什么情况?
交换是一项缓慢且昂贵的操作,因此,除非系统计算出高速缓存性能的权衡将整体上弥补它,或者有必要避免终止进程,否则系统将避免这种交换。
很多时候,人们会看到严重破坏磁盘的系统,并使用大量的交换空间并为此指责交换。那是错误的方法。如果交换达到了这种极限,则意味着交换是系统处理内存不足问题的尝试,而不是问题的原因,并且如果不进行交换,则正在运行的进程将随机地死掉。
桌面系统呢?他们不是需要其他方法吗?
桌面系统的用户确实确实希望系统响应用户启动的操作(例如打开应用程序)而“响应”,由于打开的内存需要,这种操作有时会触发交换操作。
有人尝试进行调整的一种方法是减少swappiness参数,该参数可以提高系统对应用程序使用内存和缓存空间不足的容忍度。
但是,这只是在改变球门柱。现在,第一个应用程序可能无需进行交换操作即可加载,但是它将为下一个加载的应用程序留出更少的空闲时间。当您下次打开应用程序时,稍后可能会发生相同的交换。同时,由于减小的缓存大小,系统性能总体较低。因此,从降低的可交换性设置中获得的任何好处可能难以衡量,有时会减少交换延迟,但有时会导致其他性能下降。如果您知道自己在做什么,则稍微降低交换性可能是合理的,但是将交换性降低到10%可能会使系统对非常小的缓存大小保持容忍,并使系统更容易在短时间内进行交换。
应避免完全禁用交换,因为您失去了针对内存不足状况的额外保护,内存不足状况可能导致进程崩溃或被终止。
到目前为止,最有效的解决方法是在负担得起的情况下安装更多RAM。
可以在具有大量RAM的系统上禁用交换功能吗?
如果您的RAM远远超过应用程序可能需要的RAM,则几乎不需要交换。在大多数情况下,禁用交换可能不会有所作为。但是,如果您有足够的RAM,那么启用交换功能也不会带来任何损失,因为系统不需要时不会交换数据。
唯一会造成影响的情况是,在不太可能发生的情况下,系统发现自己的内存不足,因此缓存系统受到了阻碍,而在这种情况下,您最希望交换内存。因此,您可以安全地将swap保留在其常规设置上,以增加内心的平静,而不会在有大量内存时产生负面影响。
但是如何交换可以加快我的系统速度?难道不减慢速度吗?
将数据从RAM传输到交换的动作很慢,但是只有在内核完全确定由于保持合理的缓存大小而带来的总体收益将超过此收益时,才采取这种措施。
交换数据后,什么时候可以再次输出?
内存的任何给定部分将在使用后立即退出交换-读取或写入。但是,通常交换的内存是长时间未访问的内存,预计不会很快需要。
从交换中转移数据与将数据放入交换中一样耗时。如果不需要,您的内核不会从其中删除数据。虽然数据是在交换和不被使用,它留下的是其他的东西更多的内存的使用,更加系统缓存。
在任何情况下都应该减少交换性?
是。如果您正在运行专用于一个特定服务器应用程序的服务器,而该服务器无法从系统缓存中受益。某些数据库服务器(例如Oracle服务器,MySQL / MariaDB)在某些情况下建议将可交换性降低到1到10,因为这些数据库引擎使用自己的缓存。
请注意,仅当您的系统专用于该任务时才适用,对于MySQL / MariaDB,仅当您仅使用InnoDB或XtraDB,而不是MyISAM或Aria等时,才适用。