1. Linux系统Swap空间扩容实战指南
作为一名运维工程师,我经常遇到服务器内存不足的情况。上周刚处理完一个Java应用频繁OOM的问题,根本原因就是Swap空间设置不足。今天我就来分享一个完整的在线扩容Swap空间的实操方案,这个方案在我们生产环境已经验证过几十次,稳定可靠。
Swap空间相当于Windows的虚拟内存,当物理内存不足时,系统会将部分内存数据交换到磁盘上的Swap分区。合理设置Swap空间能有效防止内存耗尽导致的进程被杀,特别是对于数据库、Java应用等内存大户尤为重要。下面我将从检查当前状态到完成扩容,一步步详细说明。
2. 环境检查与准备工作
2.1 检查当前内存和Swap使用情况
首先我们需要了解系统的当前状态。执行以下命令查看内存和Swap使用情况:
bash复制free -g
输出示例:
code复制 total used free shared buff/cache available
Mem: 62 11 2 0 48 49
Swap: 7 0 7
这里显示物理内存62GB,Swap空间7GB(实际使用0GB)。-g参数表示以GB为单位显示,更直观。如果想看精确值可以用-m(MB)或不用参数(KB)。
提示:如果
free显示Swap空间为0,说明系统当前没有启用Swap,需要先创建Swap分区。
2.2 确认Swap分区信息
进一步查看Swap分区的详细信息:
bash复制swapon -s
输出类似:
code复制Filename Type Size Used Priority
/dev/dm-1 partition 8388604 0 -2
这里显示当前Swap分区设备是/dev/dm-1,大小8GB(8388604KB)。这个设备名可能是LVM逻辑卷的映射名,我们需要确认其真实路径。
2.3 检查fstab配置
查看/etc/fstab文件确认系统启动时加载的Swap配置:
bash复制grep swap /etc/fstab
输出示例:
code复制/dev/mapper/vg00-swap none swap sw 0 0
这表示系统使用的Swap设备实际是LVM逻辑卷/dev/mapper/vg00-swap。记住这个路径,后续操作将基于此。
3. Swap扩容详细步骤
3.1 禁用当前Swap分区
在调整Swap分区前,必须先禁用当前Swap:
bash复制swapoff /dev/vg00/swap
这个操作可能需要一些时间,特别是当Swap中有数据时。建议在业务低峰期操作,避免影响性能。
重要:如果Swap中有大量数据被使用,禁用Swap会导致这些数据被移回内存,可能导致内存不足。务必先确保物理内存有足够空闲空间。
3.2 检查卷组剩余空间
扩容前需要确认卷组有足够空间。查看卷组信息:
bash复制vgdisplay vg00
重点关注以下信息:
code复制 Free PE / Size 5999 / 23.43 GiB
这表示vg00卷组还有23.43GB空闲空间。如果需要扩容的空间超过这个值,需要先扩展卷组或清理空间。
3.3 扩展逻辑卷
现在开始扩展Swap逻辑卷。假设我们要从8GB扩展到31GB(增加23GB):
bash复制lvextend -L +23g /dev/vg00/swap
如果知道最终需要的总大小,也可以用:
bash复制lvextend -L 31g /dev/vg00/swap
成功后会显示:
code复制 Size of logical volume vg00/swap changed from 8.00 GiB (2048 extents) to 31.00 GiB (7936 extents).
Logical volume vg00/swap successfully resized.
3.4 重新创建Swap空间
扩容物理空间后,需要在新空间上创建Swap文件系统:
bash复制mkswap /dev/vg00/swap
输出示例:
code复制Setting up swapspace version 1, size = 31 GiB (33285996544 bytes)
no label, UUID=3a3b3c3d-4e4f-5a5b-6c6d-7e7f8f9f0a0b
注意记录这个UUID,如果和原来的不同,需要更新fstab文件。
3.5 激活Swap分区
现在可以重新启用Swap:
bash复制swapon /dev/vg00/swap
3.6 验证扩容结果
检查Swap是否已成功扩展:
bash复制free -g
输出应显示Swap大小已更新:
code复制Swap: 30 0 30
同时确认Swap分区信息:
bash复制swapon -s
应显示新的Swap大小和可能的UUID变化。
4. 配置持久化与优化
4.1 更新fstab文件
如果Swap设备的UUID发生了变化(执行blkid /dev/vg00/swap查看当前UUID),需要更新/etc/fstab:
bash复制vim /etc/fstab
将原来的Swap行更新为新的UUID:
code复制UUID=3a3b3c3d-4e4f-5a5b-6c6d-7e7f8f9f0a0b none swap sw 0 0
或者保持设备路径方式(推荐):
code复制/dev/mapper/vg00-swap none swap sw 0 0
建议:使用设备路径而不是UUID,这样即使UUID变化也不需要修改fstab,只要设备路径不变即可。
4.2 多Swap分区优先级设置
如果系统有多个Swap分区(如SSD和HDD),可以设置优先级优化性能:
bash复制swapon -p 100 /dev/ssd/swap # SSD设为高优先级
swapon -p 10 /dev/hdd/swap # HDD设为低优先级
系统会优先使用高优先级的Swap分区。
5. 生产环境注意事项
5.1 操作时机选择
Swap调整可能影响系统性能,建议:
- 在业务低峰期操作
- 提前通知相关团队
- 准备好回滚方案
- 避免在内存使用高峰时操作
5.2 监控与调优
扩容后需要监控Swap使用情况:
bash复制watch -n 1 'free -m; swapon -s'
观察Swap使用趋势,如果频繁使用Swap,说明物理内存不足,应考虑:
- 增加物理内存
- 优化应用内存使用
- 调整swappiness参数(
/proc/sys/vm/swappiness)
5.3 常见问题排查
问题1:swapoff耗时过长
- 原因:Swap中有大量数据需要移回内存
- 解决:提前减少Swap使用(清理内存),或在单用户模式操作
问题2:lvextend失败
- 原因:卷组空间不足
- 解决:
vgextend扩展卷组,或清理空间
问题3:重启后Swap未启用
- 原因:fstab配置错误
- 解决:检查
/etc/fstab,确认设备路径或UUID正确
6. Swap配置最佳实践
根据多年运维经验,分享几个Swap配置建议:
-
大小设置:
- 物理内存<8GB:Swap=1.5倍内存
- 物理内存8-64GB:Swap=8-16GB
- 物理内存>64GB:Swap=16-32GB
-
性能优化:
- 将Swap放在SSD上
- 避免使用文件型Swap(性能差于分区型)
- 适当降低swappiness(默认60,数据库服务器可设为10-30)
-
监控告警:
- 设置Swap使用率>50%的告警
- 定期检查Swap I/O压力
-
特殊场景:
- Kubernetes节点建议禁用Swap
- 数据库服务器需要谨慎设置Swap
我在实际运维中发现,很多Java应用在内存压力大时会频繁使用Swap,导致性能下降。这时正确的做法不是禁用Swap,而是:
- 先适当增加物理内存
- 优化JVM内存参数
- 设置合理的Swap空间和swappiness
- 最后考虑使用cgroup限制内存使用