Linux性能:为什么你应该添加交换空间swap
我们知道使用Linux交换空间而不是 RAM(内存)会严重降低性能。那么,有人可能会问,既然我有足够多的可用内存,删除交换空间不是更好吗?简短的回答是不会。启用交换空间会带来性能优势,即使您有足够多的内存。
即使安装了足够多的服务器内存,您也会经常发现在长时间正常运行后会使用交换空间。请参阅以下来自具有大约一个月正常运行时间的实时聊天服务器的示例:
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检查时,没有迹象表明正在进行或不合时宜的swap I/O活动。此外,kswap服务并没有消耗太多 CPU 时间。实际上,在top(按 CPU 时间排序的顶级进程)中找不到kswap进程。为了确认,我使用了 ps命令:
ps -A | grep kswap
40 ? 00:00: 29 kswapd0
...所以在这种情况下,与许多情况一样,swap使用不会降低Linux服务器的性能。现在,让我们看看交换空间实际上如何改善Linux服务器性能。
在具有足够RAM的系统上交换空间的优点
即使仍有可用的 RAM,Linux系统使用一些swap也是正常的并且是一件好事。Linux 内核会将 几乎从未使用过的内存页面移动到交换空间中,以确保在内存中为更频繁使用的内存页面提供更多可缓存空间(一个页面就是一块内存)。当内核被迫不断地将内存页面移入和移出内存和交换空间swap时,交换使用会成为一个性能问题。
另一个优点是swap让管理员有时间对低内存问题做出反应。我们经常会注意到服务器运行缓慢,并且在登录时会注意到大量交换。如果没有交换(如下一节所述),内存不足会产生更加突然和严重的连锁反应。所以我会建议将交换空间设置为您最大进程的大小。比如mysql在my.cnf中配置的内存。
有些人建议不要交换或交换大小略大于总RAM。如果您能为此提出正当理由,那么这可能是您的选择。但是,这在服务器上几乎不是这种情况,您应该在您的决定与 Swap对您的特定应用程序的影响之间取得平衡。 Swap不会改变服务器所需的 RAM 量。它旨在改善系统的性能。
总结:
— 即使仍有可用的RAM,Linux内核也会将几乎从未使用过的内存页移动到交换空间中。
— 最好换出一段时间不活动的内存页,将经常使用的数据保留在缓存中,这应该发生在服务器最空闲的时候,这是内核的目标。
— 避免将交换空间设置得太大,否则会导致性能问题、中断或响应时间延长。
当可用内存不足时,交换空间与不使用交换空间
与上面的情况不同,如果您没有足够的内存,则在任何内存需求高峰期间,交换将被频繁使用并且明显更多。如果您没有足够的内存并且没有交换空间,这通常会导致无法为需要更多内存页的请求分配内存。作为最后的手段,内核将部署 OOM杀手来攻击高内存进程(通常是 MySQL、java 等)。
要更详细地了解Linux交换空间 Swap,请阅读 Kernel.org文档中的 交换管理和Page Frame 回收章节。如果您的交换空间“已使用”始终为“0”,那么您确实有大量自由可用的 RAM,在这种情况下,删除交换空间可能是最好的。
总结:
— Swap I/O的扩展性很差。如果仅在服务器空闲时无法交换内存页,则应调整或禁用 Swap。
— 禁用 Swap后,性能问题会很快变得明显,OOM杀手可能会抓住你!:)
为了进行比较,以下是在同一服务器上使用来自 procps-ng-3.3.1的旧版free的输出:
total used free shared buffers cached
Mem: 3.7G 3.3G 445M 0B 4.2M 1.7G
-/+ buffers/cache: 1.6G 2.1G
Swap: 1.8G 308M 1.5G
内核缓存压力和交换
现在您已启用交换。考虑按照以下指南调整服务器的缓存压力和swap vm.swappiness。
vfs_cache_pressure – 控制内核回收内存的频率,用于缓存目录和inode对象。(默认值 = 100,推荐值 50 到 200)
swappiness – 此值用于定义内核交换内存页面的积极程度。较高的值会增加攻击性;较低的值会减少交换量。(默认值 = 60,推荐值在 1 到 60 之间)删除 0 值的交换,但在大多数情况下通常不推荐。
要编辑,您可以在 /etc/sysctl.conf文件中添加或替换这些行 。例如,如果您在升级前内存不足,您可以尝试以下操作:
vm.swappiness=10
vm.vfs_cache_pressure=200
这将增加缓存压力,这似乎有些适得其反,因为缓存对性能有好处。但是,过于频繁的交换会显着降低服务器的整体性能。因此,不在内存中保留尽可能多的缓存将有助于减少交换活动。此外,将 vm.swappiness设置为10或低至 1,将减少磁盘交换。
在具有大量可用内存的服务器上,使用以下命令:
vm.swappiness=10
vm.vfs_cache_pressure=50
这将降低缓存压力。由于缓存对性能有好处,我们希望将缓存数据在内存中保留更长时间。由于缓存会变大,我们仍然希望减少交换以不增加交换 I/O。
要使用这些命令检查当前值,请使用:
sudo cat /proc/sys/vm/swappiness
sudo cat /proc/sys/vm/vfs_cache_pressure
要在不重新启动的情况下临时启用这些设置,请使用以下命令:
sudo sysctl -w vm.swappiness=10
sudo sysctl -w vm.vfs_cache_pressure=50