上一篇 下一篇 分享链接 返回 返回顶部

swap 交换分区要不要开:性能权衡解析

发布人:用户运营 | 723 发布时间:3小时前 阅读量:1

该文章由AI生成,仅为SEO优化测试,相关内容不保证准确!!!

引言:swap 不是万能保险

很多新手拿到云服务器后第一件事就是问“要不要开 swap 交换分区”。swap 是把磁盘空间当作内存扩展使用:内存不够时,内核把不活跃的页换出到磁盘,腾出 RAM 给活跃进程。它能防止 OOM(内存耗尽杀进程),但代价是磁盘 I/O 远慢于内存——普通云硬盘随机读写往往只有几 MB/s 到几十 MB/s,一旦系统频繁换页(thrashing),整个服务可能卡到几乎不可用。所以 swap 的正确态度不是“开或不开”二选一,而是按业务场景做权衡。

什么时候建议开 swap

小内存机型(1GB、2GB 内存)建议配置 1~2GB swap:编译代码、PHP-FPM 峰值、MySQL 临时表都可能造成短时内存尖峰,少量 swap 可以吸收抖动,避免进程被直接 kill。此外,开启 swap 还能配合 vm.swappiness 控制换页倾向,例如sysctl vm.swappiness=10表示内存使用较高时才启用换页,兼顾安全和性能。创建方法很简单:fallocate -l 2G /swapfile && chmod 600 /swapfile && mkswap /swapfile && swapon /swapfile,再在 /etc/fstab 中追加一行/swapfile none swap sw 0 0实现开机自动挂载,最后用free -h确认生效。

什么时候不建议开或要限制 swap

数据库(MySQL、Redis)、高并发 Web 服务、实时计算等对延迟敏感的场景,swap 常常是性能杀手:一条热数据被换到磁盘,查询延迟会从毫秒级飙升到上百毫秒。这类服务器要么不配 swap,要么把 vm.swappiness 设为 1(几乎只在濒临 OOM 时才换页)。注意:完全无 swap 也有风险,内存一旦耗尽内核会触发 OOM Killer,可能误杀 MySQL 主进程。折中方案是保留小容量 swap(如 512MB~1GB)加上vm.swappiness=1和vm.overcommit_memory合理设置,既保住可用性又不牺牲性能。另外,容器/K8s 节点传统上建议关闭 swap,因为 kubelet 默认要求 node 不启用 swap(可用 failSwapOn 参数调整)。

如何判断和优化现有 swap

先用free -h和vmstat 1观察 si/so 列:持续非零说明正在频繁换页,这是性能告警信号,正确做法是升级内存或排查内存泄漏(如ps aux --sort=-%mem | head找出吃内存进程),而不是加大 swap。想临时清空换出的页可执行swapoff -a && swapon -a(会先换回内存,务必确保空闲内存充足)。还可以调整vm.vfs_cache_pressure(默认100,降低后更倾向保留 inode/dentry 缓存在内存)进一步优化小内存机型表现。监控上建议对 swap 使用率超过 50% 设置告警,提前介入。

总结

swap 的本质是“用慢速磁盘换取容错空间”:小内存、跑编译或偶发内存尖峰的服务器,配 1~2GB swap 并把 swappiness 调到 10 左右最稳妥;数据库与低延迟业务则以小 swap+swappiness=1 兜底防 OOM;频繁换页出现时,优先扩容内存而不是堆 swap。建议大家结合业务负载实测后再定配置,云服务器内存不足时升级配置通常比依赖 swap 划算得多。

目录结构
全文
微信公众号 微信公众号
抖音官方账号 抖音官方账号
CSDN官方账号 CSDN官方账号
经营主体身份码 经营主体身份码
电子邮箱: admin@2v8.cn

本页面部分展示信息可能存在偏差/错误