CentOS 中 Swap 与“碎片”的正确理解与处理
一、概念澄清
- Swap 并不管理内存碎片。内存碎片分为外部碎片(空闲块太小难以分配)与内部碎片(已分配块未充分利用)。Swap 的职责是在物理内存不足时把不活跃的页换出到磁盘,本身不参与内存分配器的碎片整理。因此不存在“对 Swap 做碎片整理”的常规操作或必要工具。若你关心的是性能,应把重点放在减少不必要的换入换出、优化内存分配与回收策略上。
二、立即可用的优化与“整理”手段
- 降低系统对 Swap 的依赖(减少换出,缓解性能波动)
- 查看与调整:
- 查看:cat /proc/sys/vm/swappiness
- 临时:sysctl vm.swappiness=10
- 持久:echo “vm.swappiness=10” >> /etc/sysctl.conf && sysctl -p
- 说明:较低的 swappiness(如 10) 会让内核更倾向于使用物理内存,只有在必要时才使用 Swap,从而降低因频繁换入换出导致的性能抖动。
- 触发内存“压实”(Compaction,缓解物理内存碎片)
- 执行:echo 1 > /proc/sys/vm/compact_memory
- 说明:该接口会尝试把可移动的页面向高端地址“压实”,以获得更大的连续空闲页,便于大块分配。此操作对运行中的服务影响有限,但在高负载或低内存紧张时可能带来短暂停顿,建议在维护窗口执行。
- 清理页面缓存(释放可回收的 Page Cache/Dentry/Inode,间接降低换出压力)
- 执行:sync && echo 3 > /proc/sys/vm/drop_caches
- 说明:仅清理可回收缓存,不会回收正在使用的进程内存;对性能影响短暂,适合在磁盘/内存紧张、准备做备份或压测前使用。
- 重置 Swap(相当于“重建”交换空间,常用于清理已换出的脏页与旧映射)
- 执行:swapoff -a && swapon -a
- 说明:会先停用全部 Swap,再重新启用。此操作要求有足够的空闲物理内存来容纳当前被换出的页;在内存紧张时可能失败或导致抖动,务必谨慎评估与在维护窗口执行。
三、何时考虑重建或调整 Swap 配置
- 当前 Swap 使用长期偏高且物理内存充足:优先通过降低 swappiness、优化应用内存占用、排查内存泄漏来减少换出,而不是频繁重建 Swap。
- 需要扩容/更换介质(如从文件改为分区、或调整优先级):
- 扩容思路:创建新的 swap 文件/分区 → mkswap → swapon → 在 /etc/fstab 中配置开机启用;如需移除旧 swap,先 swapoff 再删除对应条目。
- 优先级:在 /etc/fstab 中使用 “pri=xxx” 设置多个 swap 的优先级,数值越大优先级越高(如 /swapfile swap swap defaults,pri=10 0 0)。
- 重要提示:重建/调整 Swap 并不能“整理碎片”,其主要价值是调整容量、介质与启用顺序,从而改善性能与可靠性。
四、监控与排错建议
- 快速观测:
- free -h(整体内存与 Swap 使用)
- swapon -s(各 Swap 源与使用情况)
- top/htop(进程级内存占用)
- 判断思路:
- 若 Swap 使用高且 si/so(换入/换出)长期不为 0,说明物理内存偏紧或存在内存泄漏,应先从应用与内存配置入手,再考虑 Swap 调整。
- 若只是 Page Cache 占用高,优先使用 drop_caches 清理可回收缓存,而非动 Swap。
- 风险提示:
- 执行 swapoff -a 前确保有足够的空闲物理内存;在生产环境建议安排在低峰维护窗口,并做好回滚预案(保留原有 swap 配置直至验证新配置稳定)。