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