myfreax

Linux性能:为什么你应该添加交换空间swap

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

7 min read
By myfreax
Linux性能:为什么你应该添加交换空间swap
Linux性能:为什么你应该添加交换空间swap

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

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

在本教程中,我们将说明为什么你应该添加交换空间swap,使用swap交换空间的优点,在不使用交换空间时将有那些区别与缺点。

如何在内存和交换空间使用上作出取舍,理解频繁使用交换空间带来的性能影响。

如何配置vfs_cache_pressure与swappiness值,应优先调整内存回收速度,如何确定频繁使用交换空间。

交换空间是否降低Linux性能

请查看以下数据,该数据是从运行一个月后的实时聊天服务器获取的。以下数据来自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过滤输出来确认。

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

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

使用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打开文件。添加或替换vm.swappinessvm.vfs_cache_pressure值。

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服务器性能。

如何在交换空间和内存的使用上作出取舍,如你有任何疑问,请在评论反馈。