【51CTO.com快译】许多Linux发行版(包括Red Hat)建议所有系统使用交换(swap)内存。然而,如果您看一下各种发行版的大多数云实例,会发现没有交换内存。
概况介绍
交换内存在大多数系统上作为磁盘上的一个分区而存在。分区后,管理员用mkswap格式化分区,用swapon启用它,内核立即看到可用的交换内存。没有可用分区的系统可使用交换文件,这是用mkswap格式化并启用的现有文件系统上的一个文件而已。
这两种方法都很好,但在分区上设置交换内存可带来更好的性能,因为您避免了现有分区上交换文件的开销。
系统RAM不足时,Linux可将内存页存储到交换空间中,避免进程杀死、系统崩溃。磁盘的速度比系统RAM慢得多,这降低了系统性能,直到系统RAM释放出来。如果内存使用量继续攀升到系统RAM和交换内存完全耗尽的地步,致命的内存不足(OOM)就会出现,并开始杀死进程,直到足够的RAM可用。
交换空间大小方面历来的建议是系统RAM大小的两倍。比如,为拥有1GB系统RAM的系统分配2GB的交换空间。该比率适用于较小的系统,无法适用于拥有数百GB系统 RAM的系统。
赞成为云设置交换空间的理由
微服务的兴起促使许多公司部署大量较小的实例。较小的实例随带较少的系统RAM,这增加了致命的OOM出现的风险:杀死进程,直到系统有足够的可用内存。
为这些系统添加交换空间在两个方面有帮助:
首先,进程可以在高负载期间从系统RAM临时转入到交换空间。管理员可从监控系统了解这些事件,他们有时间分析系统上发生这种情况的原因。万一内存泄漏,开发人员可以检查进程,在进程仍运行期间了解出了什么问题。这也可能表明:随着应用程序变庞大,管理员需要为它分配更大的实例。
其次,Linux内核会监视很少使用的内存页,并将它们发送到交换空间,以保留宝贵的系统RAM。sysctl设置vm.swappiness可控制内核将内存页发送到交换空间的愿望。这可以通过将最活跃的页留在系统RAM中,而将很少使用的页发送到交换内存来帮助云实例。
反对为云设置交换空间的理由
管理员禁止交换空间,因为他们可以自动用新的实例替换异常的实例。随着时间的推移,他们的监控指标显示因OOM导致应用程序下线而需要更换的实例有所增加。解决方案可能是更大的实例或进一步调查高负载下的内存泄漏。Systemd也会在可能的情况下快速重启这些进程。
在云实例上选择交换内存位置需要更全面的思考和规划。在物理服务器上,本地连接的非易失性内存快速(NVMe) 磁盘上的交换内存足够快,但是装有外部存储的云实例(比如AWS的弹性块存储即EBS)又如何?EBS上的性能取决于您选择哪种类型的EBS和系统上的邻居。系统出现RAM溢出时,远程存储系统上的交换内存可能导致实例性能欠佳。管理员可以选择RAM溢出时忽略交换内存并替换这些实例,而不是应对性能糟糕的处理请求的服务器。
最后,许多云实例成为Kubernetes和OpenShift集群的一部分,它们在处理交换内存时面临难题。关于适当处理交换内存,GitHub上有一个问题单。
部署使用交换内存的云实例
如果您认为提供交换内存对应用程序有益,cloud-init 使您能够使用mounts模块在第一次启动时提供交换内存。只需为现有的cloud-config用户数据添加几行:
- swap:
- filename: /swapfile
- size: auto
- maxsize: 4294967296
该配置告诉cloud-init在/swapfile创建一个自动大小(接近或小于4GB)的交换文件。自动交换大小的调整格式在cloud-init的源代码中:
- formulas = [
- # < 1G: swap = double memory
- (1 * GB, lambda x: x * 2),
- # < 2G: swap = 2G
- (2 * GB, lambda x: 2 * GB),
- # < 4G: swap = memory
- (4 * GB, lambda x: x),
- # < 16G: 4G
- (16 * GB, lambda x: 4 * GB),
- # < 64G: 1/2 M up to max
- (64 * GB, lambda x: x / 2),
- ]
Red Hat建议的交换大小略有不同:
- 2GB或更少的系统RAM:2x RAM
- 大于2GB至8GB: 1x RAM
- 大于8GB至 64GB:至少4 GB
- 大于64GB:至少4GB
您可以在cloud-config中用size:参数手动指定交换内存(以字节为单位)
- swap:
- filename: /swapfile
- size: 2147483648 # 2 GiB
配置现有云实例上的交换内存
针对现有实例,交换文件常常是启用交换内存的最容易的方法。在该例中,将2GB交换文件放入到/swapfile中:
- # BTRFS only #################################################################
- # We must disable copy-on-write updates for swap files on btrfs file systems.
- # The 'swapon' step fails if you skip these steps.
- truncate -s 0 /swapfile
- chattr +C /swapfile
- # BTRFS only #################################################################
- # A 2 GiB swap file.
- dd if=/dev/zero of=/swapfile bs=1MiB count=2048
- # Set the correct permissions on the swap file.
- chmod 0600 /swapfile
- # Format the swapfile.
- mkswap /swapfile
- # Enable the swapfile.
- swapon /swapfile
- # Add it to /etc/fstab to enable it after reboot.
- echo "/swapfile none swap defaults 0 0" >> /etc/fstab
查看交换内存是否准备就绪:
- $ cat /proc/swaps
- Filename Type Size Used Priority
- /swapfile file 2097148 0 -2
原文Analyzing cases for and against setting swap space on cloud instances,作者:Major Hayden (Red Hat)
【51CTO译稿,合作站点转载请注明原文译者和出处为51CTO.com】