赞成和反对为云实例设置交互空间的理由

译文
系统 Linux
要不要交换?这是个云问题。许多Linux发行版(包括Red Hat)建议所有系统使用交换(swap)内存。然而,如果您看一下各种发行版的大多数云实例,会发现没有交换内存。

[[406422]]

【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用户数据添加几行:

  1. swap: 
  2.     filename: /swapfile 
  3.     size: auto 
  4.     maxsize: 4294967296 

该配置告诉cloud-init在/swapfile创建一个自动大小(接近或小于4GB)的交换文件。自动交换大小的调整格式在cloud-init的源代码中:

  1. formulas = [ 
  2.     # < 1G: swap = double memory 
  3.     (1 * GB, lambda x: x * 2), 
  4.     # < 2G: swap = 2G 
  5.     (2 * GB, lambda x: 2 * GB), 
  6.     # < 4G: swap = memory 
  7.     (4 * GB, lambda x: x), 
  8.     # < 16G: 4G 
  9.     (16 * GB, lambda x: 4 * GB), 
  10.     # < 64G: 1/2 M up to max 
  11.     (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:参数手动指定交换内存(以字节为单位)

  1. swap: 
  2.     filename: /swapfile 
  3.     size: 2147483648  # 2 GiB 

配置现有云实例上的交换内存

针对现有实例,交换文件常常是启用交换内存的最容易的方法。在该例中,将2GB交换文件放入到/swapfile中:

  1. # BTRFS only ################################################################# 
  2. # We must disable copy-on-write updates for swap files on btrfs file systems. 
  3. # The 'swapon' step fails if you skip these steps. 
  4. truncate -s 0 /swapfile 
  5. chattr +C /swapfile 
  6. # BTRFS only ################################################################# 
  7. # A 2 GiB swap file. 
  8. dd if=/dev/zero of=/swapfile bs=1MiB count=2048 
  9. Set the correct permissions on the swap file. 
  10. chmod 0600 /swapfile 
  11. # Format the swapfile. 
  12. mkswap /swapfile 
  13. # Enable the swapfile. 
  14. swapon /swapfile 
  15. Add it to /etc/fstab to enable it after reboot. 
  16. echo "/swapfile none swap defaults 0 0" >> /etc/fstab 

查看交换内存是否准备就绪:

  1. $ cat /proc/swaps 
  2. Filename        Type    Size      Used    Priority 
  3. /swapfile       file    2097148   0       -2 

原文标题:Analyzing cases for and against setting swap space on cloud instances,作者:Major Hayden (Red Hat)

【51CTO译稿,合作站点转载请注明原文译者和出处为51CTO.com】

 

责任编辑:华轩 来源: 51CTO
相关推荐

2021-09-28 10:10:55

量子计算芯片超算

2020-08-11 15:54:15

数据中心整合数据中心

2009-12-03 08:55:12

Java EE 6

2009-03-11 08:38:18

RIM黑莓移动操作系统

2010-08-06 09:58:16

云计算

2022-10-28 12:10:03

云计算企业

2014-09-24 09:58:51

2020-01-03 16:16:15

云计算技术工具

2023-04-03 13:24:17

ChatGPTPNAS语言

2009-02-05 08:52:04

2021-12-08 10:33:19

桌面云

2018-05-12 20:22:19

华为3GPP5G

2016-11-09 15:11:17

安全云存储云服务

2013-09-02 11:06:03

2013-03-29 09:37:34

私有云公有云数据安全

2010-01-12 17:56:51

交换机网关设置IP设置

2013-02-21 10:00:51

服务器虚拟化

2015-12-11 15:52:47

盛大云
点赞
收藏

51CTO技术栈公众号