Linux-Swap分区使用与扩容

一、背景

在Linux系统中,swap空间(通常称为swap分区)是一个用于补充内存资源的重要组件。当系统的物理RAM不足时,Linux会将一部分不经常使用的内存页面移动到硬盘上的swap空间中,这个过程被称为分页(paging)或交换(swapping)。这样可以为更重要的进程腾出物理内存,从而保持系统的高效运行。

平时我们没太注意swap分区的作用以及如何扩容等操作,接下来进行详解。

swap分区大小设置规则,在生产环境中,交换分区的大小一般为真实物理内存的1.5~2倍,在Linux系统,我们可以参照Redhat公司为RHEL5、RHEL6推荐的SWAP空间的大小划分原则,在你没有其他特别需求时,可以作为很好的参考依据:

1、内存小于4GB时,推荐不少于2GB的swap空间;

2、内存4GB~16GB,推荐不少于4GB的swap空间;

3、内存16GB~64GB,推荐不少于8GB的swap空间;

4、内存64GB~256GB,推荐不少于16GB的swap空间。

二、应用场景

1、开启swap分区

1. 增加可用内存
  • 内存扩展:当物理内存不足时,swap分区可以作为一个虚拟内存扩展,允许操作系统将部分不活跃的数据从物理内存中移到磁盘上,从而释放物理内存供其他进程使用。
  • 提高并发能力:通过提供额外的内存空间,swap可以允许更多的进程同时运行,即使它们占用了大量的内存。
2. 提高系统稳定性
  • 防止内存耗尽:当系统面临内存压力时,swap可以作为最后一道防线,防止由于内存耗尽而导致的系统崩溃或不稳定。
  • 避免OOM killer:当系统内存非常紧张时,Linux的OOM killer(Out of Memory Killer)可能会终止某些进程以释放内存。而swap的存在可以缓解这种情况,降低进程被强制终止的风险。
3. 进程调度灵活性
  • 内存管理灵活性:swap分区的存在使得内核在进行内存管理时更加灵活,可以根据当前的内存使用情况动态调整哪些数据保留在内存中,哪些数据可以暂时移到磁盘上。
  • 负载均衡:通过swap机制,可以动态平衡系统中各个进程对内存的需求,从而达到更好的负载均衡。
4. 数据保护
  • 持久性存储:即使在系统重启之后,swap分区中的数据也会被清空,但至少在重启之前,它可以作为一个临时的存储空间来保护数据,防止因内存不足而导致的数据丢失。

2、关闭swap分区

1. 提高性能
  • 减少磁盘I/O:关闭swap可以减少磁盘输入输出(I/O)操作,因为没有数据会被频繁地交换到磁盘上。这对于那些对延迟敏感的应用尤其重要。
  • 减少碎片:频繁使用swap可能会导致磁盘上的数据碎片化,关闭swap可以减少这种碎片化的风险。

1、例如安装MySQL、Elastic、K8S等相对吃性能的服务和软件,通常建议就是执行swapoff -a关闭swap分区,从而提高性能。

没有了Swap分区,直接使用物理内存,从而减少磁盘IO的交互次数,提高性能.

2、现在内存卡很便宜, 说实在的, 控制程序使用内存合理, 从而避免OOM的方式相对比使用Swap来避免更为高效。

2. 提高安全性
  • 数据保密性:关闭swap可以防止敏感数据被写入磁盘,从而减少了数据泄露的风险。这对于处理机密数据的系统尤为重要。
  • 防止未授权访问:swap文件或分区中的数据可能包含敏感信息,关闭swap可以防止在磁盘上留下这些数据,从而提高系统的安全性。
3. 更好的内存管理
  • 内存利用率更高:关闭swap意味着所有运行中的进程必须完全驻留在物理内存中,这促使系统管理员更精细地管理内存资源,确保每个进程都能得到足够的内存。
  • 内存一致性:关闭swap可以确保内存的一致性,因为所有数据都在RAM中,不会出现由于swap导致的数据不同步问题。
4. 适合现代硬件配置
  • 充足的RAM:对于拥有大量RAM的现代服务器或工作站,关闭swap可以充分利用高速内存的优势,减少对较慢的磁盘存储的依赖。
  • 内存密集型应用:对于那些需要高度一致性和快速响应时间的应用程序,关闭swap可以提供更好的性能保障。
5. 便于故障排查
  • 简化调试:关闭swap可以简化系统调试过程,因为不再需要考虑swap对系统行为的影响。
  • 明确的内存使用模式:没有swap的情况下,内存使用模式更加明确,有助于诊断和解决问题。

三、硬盘分区扩容swap

出于某些原因,例如自己为了省钱买了国外的服务器1-2G内存, 像运行更多的程序,但是仅仅使用物理内存有不够,那么可以稍微扩容一下swap分区,能够支撑程序运行起来。

虽然性能会差一点,但是总归程序能跑起来吧,也能将就用一下。

1、针对硬盘划分分区

fdisk /dev/sdc

划分一个分区出来,大小自己定。例如我们的swap本来只有2G,现在想扩容后到4G,需要再扩2G. 所以再分一个2G分区出来:

此时分区默认的ID是83

2、更改分区ID从83变为82

我们可以查看fdisk的-l命令,看到分区类型不同ID代表的含义,82是swap分区类型的ID,需要改为82, 默认是83:

执行t, 输入分区编号, 输入83, 最后w保存即可。

3、mkswap格式化分区

和普通分区一样,要使用,需要进行格式化分区的文件系统,最后才能挂载使用。swap分区也是如此,只不过不再使用mkfs命令而是mkswap进行格式化。

mkswap /dev/sdc1

4、临时挂载: swapon /dev/sdc1

临时挂载swap分区进行扩容:

swapon /dev/sdc1

查看扩容后的结果:

5、永久挂载swap

修改/etc/fstab,将挂载命令写入即可,重启后才能正常应用,否则每次需要手动挂载.

四、单文件作为swap分区

1、需求

这个需求比较有意思。 情况是这样的,我购买的云服务器只有一个盘,这个盘还只分一个分区,这个分区挂在了/根分区上。

但是现在尴尬了,我的物理内存是1G,我想给2G的一个swap分区,又不想花钱再买一块盘了。那咋整?

可以使用单文件作为swap分区,这个就有意思了。 完全可以通过单文件充当swap分区

2、创建/swapfile单文件

fallocate -l 2G /swapfile

chmod 600 /swapfile

3、使用dd填充初始化文件

dd if=/dev/zero of=/swapfile bs=1M count=2048

4、mkswap格式化文件

mkswap /swapfile

5、swapon启用/swapfile分区

swapon /swapfile

6、永久启用swap文件

编辑/etc/fstab文件,文件追加写入即可

/swapfile none swap defaults 0 0

7、查看free -h ,已经添加了swap分区

五、总结

swap分区看情况吧,内存很富裕的情况下,并且对性能要求高,那么建议直接关闭算了,减少内存和硬盘IO交换的过程。

内存很紧缺的情况下, 并且对性能要求也没那么高,让多一点程序能跑起来,那么可以尝试开启swap分区或者扩容swap分区,勉强撑一下也行。

但是对于MySQL、Kafka、K8S节点这些,建议Swap关闭吧,毕竟性能还是要保证的,内存也不贵,这些服务也不至于给8G、16G的内存卡吧,好说歹说基本都是32G起步。

Swap分区不仅可以使用磁盘分区,还可以使用单文件作为swap分区哟,这个很有意思,有时候也有点用处的^^

相关推荐
勤奋的凯尔森同学1 小时前
webmin配置终端显示样式,模仿UbuntuDesktop终端
linux·运维·服务器·ubuntu·webmin
丁卯4042 小时前
Go语言中使用viper绑定结构体和yaml文件信息时,标签的使用
服务器·后端·golang
chengooooooo2 小时前
苍穹外卖day8 地址上传 用户下单 订单支付
java·服务器·数据库
希忘auto3 小时前
详解Redis在Centos上的安装
redis·centos
人间打气筒(Ada)3 小时前
MySQL主从架构
服务器·数据库·mysql
落笔画忧愁e4 小时前
FastGPT快速将消息发送至飞书
服务器·数据库·飞书
小冷爱学习!4 小时前
华为动态路由-OSPF-完全末梢区域
服务器·网络·华为
打不了嗝 ᥬ᭄5 小时前
Linux的权限
linux
落幕5 小时前
C语言-进程
linux·运维·服务器
深度Linux6 小时前
C++程序员内功修炼——Linux C/C++编程技术汇总
linux·项目实战·c/c++