我们知道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
这里的数据显示使用了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_pressure
和swappiness
的值。
请使用你喜欢的编辑器打开/etc/sysctl.conf
文件。在本教程中我们将使用vim打开文件。添加或替换vm.swappiness
和vm.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服务器在具有大量空闲可用的内存,你可以尝试将swappiness
和vfs_cache_pressure
修改为以下值。
vm.swappiness=10
vm.vfs_cache_pressure=50
这将降低缓存压力。由于缓存对性能有好处,我们希望将缓存数据在内存中保留更长时间。由于缓存会变大,我们仍然希望减少交换空间的使用,从而降低磁盘I/O。
你可以使用以下cat命令查看swappiness
和vfs_cache_pressure
的当前值:
sudo cat /proc/sys/vm/swappiness
sudo cat /proc/sys/vm/vfs_cache_pressure
如果你要在不重新启动Linux服务器的情况下临时启用并设置swappiness
和vfs_cache_pressure
的值,请运行以下sysctl
命令:
sudo sysctl -w vm.swappiness=10
sudo sysctl -w vm.vfs_cache_pressure=50
结论
至此,你应该了解在Linux上使用和不使用交换空间的区别,在使用交换空间时你将获得更多反应时间与更好的Linux服务器性能。
如何在交换空间和内存的使用上作出取舍,如你有任何疑问,请在评论反馈。