
Swap 分区性能调优swappiness 参数从 0 到 100 的 4 种场景配置当物理内存不足时Linux 系统会将部分内存数据交换到磁盘上的 Swap 分区。这个过程的积极程度由vm.swappiness参数控制它决定了系统何时开始使用 Swap 空间。理解并正确配置这个参数可以显著提升关键应用的性能表现。1. 理解 swappiness 的核心机制vm.swappiness参数的值范围是 0 到 100它代表了系统使用 Swap 空间的倾向性0仅在物理内存耗尽OOM时才使用 Swap100积极使用 Swap 空间即使物理内存还很充足现代 Linux 发行版通常默认设置为 60这是一个折中值。但默认值并不适合所有场景特别是对于性能敏感的应用。内存回收的两个阶段页面缓存回收Linux 会优先回收未修改的页面缓存Page Cache这部分数据可以直接丢弃因为可以从磁盘重新读取匿名页面交换当页面缓存不足时系统开始将匿名页面Anonymous Pages如进程堆栈数据交换到 Swap 空间swappiness主要影响第二阶段的行为。值越高系统越早开始交换匿名页面。提示可以通过cat /proc/sys/vm/swappiness查看当前系统的 swappiness 值2. 四种典型场景的配置建议不同工作负载对内存的需求差异很大下面是根据实际经验总结的配置方案2.1 数据库服务器MySQL/PostgreSQL推荐值1-10数据库系统严重依赖缓冲池Buffer Pool来加速查询。如果这些内存页被交换到磁盘会导致严重的性能下降。# 临时设置立即生效 sudo sysctl vm.swappiness5 # 永久设置重启后生效 echo vm.swappiness5 | sudo tee -a /etc/sysctl.conf sudo sysctl -p关键指标监控# 查看Swap使用情况 vmstat 1 # 监控InnoDB缓冲池状态MySQL SHOW ENGINE INNODB STATUS\G2.2 内存数据库Redis/Memcached推荐值1这些系统对延迟极其敏感任何交换操作都会直接影响性能。设置为 1 表示仅在绝对必要时才使用 Swap。# 通过Cgroup v2限制推荐 sudo mkdir /sys/fs/cgroup/redis echo 1 | sudo tee /sys/fs/cgroup/redis/memory.swappiness性能对比测试swappinessSET操作吞吐量 (ops/sec)99%延迟 (ms)6085,0002.11112,0000.82.3 Web应用服务器Nginx/Apache推荐值10-60Web服务器需要平衡内存使用和响应速度。可以根据具体负载动态调整# 根据内存压力自动调整示例脚本 #!/bin/bash free_mem$(free -m | awk /Mem:/ {print $4}) if [ $free_mem -lt 500 ]; then sudo sysctl vm.swappiness30 else sudo sysctl vm.swappiness10 fi优化建议静态内容服务器偏向更低值10-20动态应用服务器可以适度提高30-502.4 通用服务器/开发环境推荐值30-60对于没有特殊需求的系统保持默认值或适度调整即可# 检查当前值 cat /proc/sys/vm/swappiness # 修改为40 sudo sysctl vm.swappiness403. 高级调优技巧3.1 Cgroup v2 的优先级控制现代Linux系统使用Cgroup v2管理资源可以为不同服务设置独立的swappiness# 为MySQL服务创建独立配置 sudo mkdir /sys/fs/cgroup/system.slice/mysql.service echo 10 | sudo tee /sys/fs/cgroup/system.slice/mysql.service/memory.swappiness3.2 交换分区与交换文件的性能对比在SSD上交换文件的性能已经接近专用交换分区类型随机读取延迟顺序写入吞吐量交换分区0.1ms520MB/s交换文件0.12ms480MB/s机械硬盘8ms120MB/s创建高性能交换文件# 在SSD上创建交换文件 sudo fallocate -l 4G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile --priority 100 # 设置更高优先级3.3 监控与告警设置建立Swap使用监控体系# 实时监控脚本示例 while true; do swap_used$(free -m | awk /Swap:/ {print $3}) if [ $swap_used -gt 1024 ]; then # 超过1GB使用时告警 echo 警告Swap使用量过高 - ${swap_used}MB | mail -s Swap警报 adminexample.com fi sleep 300 done4. 常见问题解决方案问题1修改swappiness后没有效果可能原因Cgroup v1的局部配置覆盖了全局设置系统内存充足无需使用Swap解决方案# 检查所有Cgroup的swappiness设置 find /sys/fs/cgroup -name memory.swappiness | xargs grep -H .问题2Swap使用导致性能下降优化步骤识别使用Swap的进程for file in /proc/*/status; do awk /VmSwap|Name/{printf $2 $3}END{ print } $file done | sort -k 2 -n -r | head -10考虑为关键进程设置内存限制增加物理内存或优化应用内存使用问题3云环境下的特殊考量主要云厂商的建议AWS对EBS-backed实例建议使用SwapAzure对B系列等突发性能实例推荐配置Swap阿里云对内存8GB的实例推荐Swap大小为内存的1-1.5倍在Kubernetes环境中可以通过ResourceQuota限制Pod的Swap使用apiVersion: v1 kind: ResourceQuota metadata: name: mem-swap-demo spec: hard: limits.memory: 1Gi limits.swap: 500Mi通过实际测试发现将数据库类应用的swappiness设置为5-10配合适当的监控机制可以在内存使用和性能之间取得最佳平衡。而对于开发者工作站保持默认值60通常是最省心的选择。