加载笔记内容...
加载笔记内容...
SWAP(交换空间) 是 Linux 内存管理系统的核心组件,其本质是通过存储介质(硬盘/SSD)扩展内存容量的虚拟化技术。现代操作系统采用分页内存管理机制,当物理内存(RAM)不足时,内核的页面置换算法会将不活跃的内存页(Page)写入 SWAP 空间,释放 RAM 供新进程使用。
Linux 内核将内存页分为三类:
内核通过LRU(Least Recently Used)算法和Refault Distance机制决定置换优先级。当发生内存颠簸(Thrashing) 时,系统会频繁在 RAM 和 SWAP 之间交换数据,导致性能急剧下降。
1# 查看内存页状态
2grep -E 'Active|Inactive|Swap' /proc/meminfo
类型 | 创建方式 | 性能表现 | 灵活性 | 适用场景 |
---|---|---|---|---|
传统分区 | fdisk 创建独立分区 | 中等 | 低 | 机械硬盘时代方案 |
文件型 SWAP | dd 创建稀疏文件 | 较低 | 高 | 临时扩容场景 |
Zswap | 压缩缓存层 | 高 | 中 | 现代系统首选 |
ZRAM | 内存内压缩交换 | 最高 | 高 | 嵌入式/低内存设备 |
争议点:在 SSD 普及的今天,传统观点认为频繁写入会缩短 SSD 寿命。但实测表明,现代 SSD 的耐久度足以应对常规 SWAP 使用(需配合 TRIM 指令)。
1# 动态计算推荐值(单位:GB)
2ram_gb=$(free -g | awk '/Mem:/ {print $2}')
3swap_size=$(( ram_gb < 4 ? ram_gb*2 : (ram_gb > 16 ? 16 : ram_gb) ))
1# 临时调整
2sysctl vm.swappiness=10
3# 永久生效
4echo "vm.swappiness=10" >> /etc/sysctl.conf
调优建议:数据库服务器建议设置 swappiness=1,Kubernetes 节点建议配合 cgroup v2 做内存限制。
1# 实时监控
2vmstat 1 # 查看si/so字段
3sar -B 1 # 查看页面置换率
4
5# 历史分析
6grep -i swap /var/log/kern.log
当触发 Out-Of-Memory 时:
/var/log/messages
中的 kill 记录dmesg -T | grep oom
1echo -1000 > /proc/[pid]/oom_score_adj
行业案例:Google 数据中心通过 Zswap 将交换吞吐量提升 3 倍,Facebook 使用 Memory-Tiering 实现冷热数据分层。
1cryptsetup luksFormat /dev/sdX
2mkswap /dev/mapper/encrypted-swap
延伸阅读: