我们知道Linux内核使用交换空间而不是RAM内存的时候会严重降低性能。那么,有人可能会问,既然我有足够多的可用内存,删除交换空间不是更好吗?

简短的回答是不会。反而启用交换空间会带来性能优势。即使您的Linux服务器有足够多的可用内存,您也会经常发现Linux服务器长时间运行后会使用交换空间。

在本教程中,我们将说明为什么你应该添加交换空间swap,使用swap交换空间的优点,在不使用交换空间时将有那些区别与缺点,如何在内存和交换空间使用上作出取舍,理解频繁使用交换空间带来的性能影响,如何配置vfs_cache_pressure与swappiness值,应优先调整内存回收速度,如何确定频繁使用交换空间。

请查看以下数据,该数据是从运行一个月后的实时聊天服务器获取的。以下数据来自free命令的结果:

              total        used        free      shared  buff/cache   available
Mem:           3.7G        1.0G        445M         84M        2.2G        2.2G
Swap:          1.8G        308M        1.5G
free -h

这里的数据显示使用了308M的交换空间。当我运行swapping检查时,没有迹象表明进行或不合时宜使用交互空间I/O的活动。

除此此外kswap服务并没有消耗太多CPU时间。使用top命令按CPU时间排序的查找顶级进程中也找不到kswap进程。为了确认kswap进程是否繁忙。我们还使用了ps命令并通过grep过滤输出来确认。

ps -A | grep kswap
40 ? 00:00:29 kswapd0

所以在这种情况下,swap使用不会降低Linux服务器的性能。现在,让我们看看交换空间实际上如何改善Linux服务器性能。

使用swap交换空间的优点

Linux系统使用一些swap是正常的事,也是一件好事。Linux内核会将几乎从未使用过的内存页面移动到交换空间中,以确保在内存为更频繁使用内存页面的进程提供更多可用的缓存空间。

当内核被迫不断地将内存页面移入和移出内存和交换空间swap时,交换空间使用会成为一个性能问题。

另一个优点是交换空间swap让管理员有时间对低内存问题做出反应。我们经常会注意到服务器运行缓慢,并且在登录时会注意到大量使用交换空间。如果没有交换,内存不足会产生更加突然和严重的连锁反应。

所以我们会建议将交换空间设置为您最大进程的大小。比如mysql在my.cnf中配置的内存。有些人建议不要交换空间或交换空间大小略大于总内存。如果您能为此提出正当理由,那么这可能是您的选择。

但是,这在服务器上几乎不是这种情况,您应该在交换空间对您的应用程序的影响之间取得平衡。交换空间不会改变服务器所需的内存总量。它旨在改善系统的性能。

总的来说,即使仍有足够多可用的内存RAM,Linux内核也会将几乎从未使用过的内存页移动到交换空间中。

最好换出一段时间不活动的内存页面,将经常使用的数据保留在缓存中,这应该发生在服务器最空闲的时候,这是Linux内核目标与该做的事。也避免将交换空间设置得过大,否则会导致性能问题、中断或响应时间加长。

交换空间与不使用交换空间区别

上面所说是你有足够多可用内存。但实际情况是我们经常会遇到内存不够用的时候。当您的服务器没有足够的内存时,在内存需求高峰期间,交换空间将被频繁使用并且明显增多。

如果您没有足够的内存并且没有交换空间,这通常会导致无法为需要更多内存的进程分配内存,作为最后的手段,内核将部署OOM杀手来终止高内存使用的进程,比如MySQL、Java。

要更详细地了解Linux交换空间Swap,请阅读Linux内核文档中的交换空间管理Page Frame回收文档。如果您的交换空间已使用始终为0,那么您确实有大量空闲可用的内存RAM,在这种情况下,删除交换空间可能是最好的。

总的来说:交换空间I/O的性能很差。如果Linux服务器确实有大量空闲可用的内存RAM,则应调整或禁用交换空间。禁用交换空间后,当服务器急剧需要内存时,将缺少更多的反应时间,OOM杀手可能会不等你就将消耗大量内存的进程杀死。

内核缓存压力和交换空间

假设您已启用交换空间。可以考虑按照以下教程调整服务器的缓存压力和交换空间的swappiness值。

vfs_cache_pressure控制内核回收内存的频率,用于缓存页面和inode对象。默认值是100。我们推荐设置50到200。

swappiness此值用于定义内核交换内存页面的频繁程度。较高的值会导致频繁使用交换空间,从而影响Linux服务器性能。较低的值会减少使用交换空间的频率。默认值是60,我们推荐设置1到60之间。

如果你需要改变vfs_cache_pressureswappiness的值。您可以使用你喜欢的编辑器打开/etc/sysctl.conf文件。在本教程中我们将使用vim打开文件

sudo vim /etc/sysctl.conf

添加或替换以下行值:

vm.swappiness=10
vm.vfs_cache_pressure=200

例如,如果您在内存不足时,您可以尝试将swappiness值设置为10,vfs_cache_pressure的值设置200。

这将会使内存回收变得更快,增加内存缓存压力。我们知道缓存对性能有好处,快速的内存回收会适得其反。但是与过于频繁的使用交换空间相比,增大vfs_cache_pressure值会更好一点。

因此,不在内存中保留尽可能多的缓存将有助于减少使用交换空间的频率。此外,将 vm.swappiness设置为10,将减少交换空间的使用。

假如你的Linux服务器在具有大量空闲可用的内存,你可以尝试将swappinessvfs_cache_pressure修改为以下值:

vm.swappiness=10
vm.vfs_cache_pressure=50

这将降低缓存压力。由于缓存对性能有好处,我们希望将缓存数据在内存中保留更长时间。由于缓存会变大,我们仍然希望减少交换空间的使用,从而降低磁盘I/O。

你可以使用以下cat命令查看swappinessvfs_cache_pressure的当前值:

sudo cat /proc/sys/vm/swappiness
sudo cat /proc/sys/vm/vfs_cache_pressure

如果你要在不重新启动Linux服务器的情况下临时启用并设置swappinessvfs_cache_pressure的值,请运行以下sysctl命令:

sudo sysctl -w vm.swappiness=10
sudo sysctl -w vm.vfs_cache_pressure=50

结论

至此,你应该了解在Linux上使用和不使用交换空间的区别,在使用交换空间时你将获得更多反应时间与更好的Linux服务器性能,如何在交换空间和内存的使用上作出取舍,如你有任何疑问,请在评论反馈。