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分区哟,这个很有意思,有时候也有点用处的^^

相关推荐
咖喱鱼蛋6 分钟前
Ubuntu安装Electron环境
linux·ubuntu·electron
ac.char10 分钟前
在 Ubuntu 系统上安装 npm 环境以及 nvm(Node Version Manager)
linux·ubuntu·npm
肖永威16 分钟前
CentOS环境上离线安装python3及相关包
linux·运维·机器学习·centos
tian2kong18 分钟前
Centos 7 修改YUM镜像源地址为阿里云镜像地址
linux·阿里云·centos
mengao123421 分钟前
centos 服务器 docker 使用代理
服务器·docker·centos
布鲁格若门22 分钟前
CentOS 7 桌面版安装 cuda 12.4
linux·运维·centos·cuda
C-cat.30 分钟前
Linux|进程程序替换
linux·服务器·microsoft
dessler30 分钟前
云计算&虚拟化-kvm-扩缩容cpu
linux·运维·云计算
怀澈12232 分钟前
高性能服务器模型之Reactor(单线程版本)
linux·服务器·网络·c++
DC_BLOG34 分钟前
Linux-Apache静态资源
linux·运维·apache