香港服务器Swap突然飙高怎么办?别急着重启,先这样优化内存调度
不少用户在使用香港物理服务器时,会遇到一个比较典型的问题:明明服务器还能访问,CPU也没有完全跑满,但后台操作开始变慢,数据库响应变迟,执行 free -h 一看,发现 swap 已经占用了不少。很多人第一反应是“内存不够了”,甚至直接重启服务器。其实,swap 占用过高不一定等于故障,关键要看它是“历史占用”,还是系统正在频繁把内存数据换入换出。
对于部署在香港物理服务器上的企业官网、跨境业务后台、API服务、数据库和缓存服务来说,内存调度策略会直接影响业务稳定性。比如 A5IDC 香港 AMD-02 这类配置,采用 AMD EPYC 4464P 12核24线程、32GB DDR5内存、960GB NVMe SSD,并搭配 15M 直连 CN2 与 100M BGP 线路,硬件基础已经比较适合中小型业务长期运行。但如果系统参数、数据库缓存、PHP-FPM进程数或容器内存限制设置不合理,依然可能出现 swap 越用越高、访问越来越慢的情况。
一、先判断:swap高不一定代表现在内存爆了
排查 swap 问题,不能只看一行“Swap used”。正确的判断方式是同时看内存、IO、负载和换页速度。
常用命令如下:
free -h
vmstat 1
top
sar -B 1 5
如果 free -h 显示 swap 已经使用了几GB,但 vmstat 1 里的 si、so 长时间接近 0,说明系统当前并没有频繁从 swap 读写数据,这可能只是过去某次内存压力留下的占用,不一定会明显影响现在的业务。
真正需要警惕的是下面几种情况:
vmstat 1
如果 si 和 so 持续不为 0,说明系统正在频繁进行 swap in / swap out。这个时候,用户访问变慢、数据库查询卡顿、SSH输入延迟、后台页面加载慢,就很可能和内存换页有关。
还要同时观察 wa 值。如果 wa 较高,说明 CPU 在等待磁盘 IO。即便服务器使用的是 NVMe SSD,swap 频繁读写依然比直接访问内存慢很多,业务体验会明显下降。
二、为什么香港物理服务器会出现swap占用过高?
第一类原因是业务进程本身吃内存。常见于 MySQL buffer pool 设置过大、Redis 没有限制 maxmemory、Java 服务 JVM 堆内存设置过高、PHP-FPM 子进程数量过多。表面看是“系统 swap 高”,实际是应用层内存规划不合理。
第二类原因是系统缓存和匿名内存争抢。Linux 会尽量利用空闲内存做 page cache,用来提升文件读取性能。但当数据库、Web进程、缓存服务同时运行时,如果内存回收策略不合适,系统可能较早把一部分匿名内存换到 swap。
第三类原因是突发流量或定时任务。比如凌晨备份、日志压缩、数据库导出、爬虫访问、批量图片处理,都可能在短时间内把内存打满。任务结束后,内存压力消失,但 swap 占用还留在那里,看起来就像“swap一直很高”。
第四类原因是服务器配置和业务不匹配。16GB 内存跑轻量网站一般够用,但如果同时部署 MySQL、Redis、Elasticsearch、多个站点、队列任务和监控组件,就容易被慢慢吃满。32GB 或 64GB 内存的物理服务器会更从容,但也需要合理分配。
三、不要盲目关闭swap
有些教程会建议直接执行:
swapoff -a
这并不是通用方案。关闭 swap 后,如果业务进程突然吃满内存,系统可能直接触发 OOM,把 MySQL、Java 或 Web 服务杀掉,故障反而更严重。
更稳妥的思路是:保留 swap 作为安全缓冲,但降低系统主动使用 swap 的倾向。也就是说,swap 可以存在,但不能让它过早、过频繁参与调度。
四、优化核心:调整vm.swappiness
vm.swappiness 可以理解为 Linux 使用 swap 的积极程度。数值越高,系统越倾向于把内存页换出到 swap;数值越低,系统越倾向于保留应用内存,优先回收缓存。
查看当前值:
cat /proc/sys/vm/swappiness
临时调整:
sysctl vm.swappiness=10
永久生效:
echo "vm.swappiness = 10" >> /etc/sysctl.conf
sysctl -p
对于数据库、业务后台、API服务这类对延迟敏感的场景,通常可以把 swappiness 设置在 10 到 20 之间。这样可以减少系统过早使用 swap 的概率。
如果是文件下载站、图片站、静态资源较多的业务,系统 page cache 的价值更高,可以适当设置为 20 到 30,不建议一味压得太低。
如果服务器内存本身偏小,又存在突发任务,设置为 1 或 0 可能并不稳妥,因为这会让系统在内存紧张时更容易直接面对 OOM 风险。
五、配合调整vfs_cache_pressure
除了 swappiness,还可以关注 vfs_cache_pressure。它影响系统回收 inode 和 dentry 缓存的倾向。对于大量小文件站点、图片站、WordPress多站点、日志文件较多的业务,如果设置过高,可能导致目录和文件元数据缓存被频繁回收,增加磁盘访问压力。
查看当前值:
cat /proc/sys/vm/vfs_cache_pressure
一般可以保持默认值 100。如果服务器文件访问频繁,可以测试调整到 50:
sysctl vm.vfs_cache_pressure=50
永久生效:
echo "vm.vfs_cache_pressure = 50" >> /etc/sysctl.conf
sysctl -p
这个参数不要盲目调得过低,否则系统可能保留过多缓存,反而影响业务进程可用内存。
六、从应用层减少内存挤压
系统参数只是调度策略,真正决定内存是否健康的,还是业务进程。
MySQL 建议检查:
SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
如果服务器是 32GB 内存,并且同时跑 Web、Redis、备份和监控,不建议把 MySQL buffer pool 直接设置到 24GB 以上。更稳妥的方式是给系统和其他服务预留足够空间。
Redis 建议设置最大内存:
maxmemory 4gb
maxmemory-policy allkeys-lru
PHP-FPM 要控制子进程数量。例如每个 PHP 进程平均占用 80MB,pm.max_children=100 理论上就可能占用 8GB 内存。很多 swap 问题不是服务器不行,而是进程数开得太激进。
Java 或容器服务也要限制内存。例如 JVM 应明确设置:
-Xms2g -Xmx4g
Docker 容器建议设置内存上限,避免单个容器把整机内存吃满。
七、swap已经很高时怎么处理?
如果确认当前 si、so 为 0,业务没有明显卡顿,可以先不急着清理 swap,而是观察一段时间。
如果确实想把 swap 中的数据迁回内存,必须先确认可用内存足够:
free -h
然后谨慎执行:
swapoff -a && swapon -a
这一步不建议在业务高峰期执行。如果可用内存不足,执行 swapoff 可能导致服务被 OOM 杀掉。
更推荐的顺序是:
-
找出高内存进程
-
优化应用配置
-
降低 swappiness
-
观察 si/so 和业务延迟
-
必要时再清理 swap
查找高内存进程可以使用:
ps aux --sort=-%mem | head
或者:
top
重点关注 MySQL、Redis、PHP-FPM、Java、Node.js、Python、容器进程等。
八、不同业务的建议策略
企业官网、WordPress、ZBlog、小型后台系统,可以设置 vm.swappiness=10,并重点控制 PHP-FPM、MySQL 和缓存插件。
数据库型业务建议设置 vm.swappiness=10,同时合理分配 MySQL buffer pool,避免数据库把系统内存吃满。
下载站、图片站、文件分发业务,可以设置在 20 到 30,并保留一定 page cache 空间,减少磁盘重复读取。
多容器业务要重点使用 cgroup 或 Docker 内存限制,避免某个容器异常占用内存,拖慢整台物理服务器。
AI、爬虫、批处理任务则要关注任务峰值内存。定时任务最好错峰执行,不要把备份、压缩、数据导出、日志分析同时放在一个时间点。
九、什么时候该升级内存?
如果服务器长期出现以下情况,就不只是调参问题了:
available 内存长期很低
swap 使用持续增长si/so 经常出现
数据库和 Web 服务经常被 OOM
业务高峰期 SSH 都明显卡顿
优化进程数后仍然不够用
这时应考虑升级到更高内存配置,例如从 16GB 升到 32GB,或者从 32GB 升到 64GB。对于香港物理服务器来说,内存升级的价值通常比盲目增加 CPU 更直接,因为很多网站卡顿并不是 CPU 不够,而是内存调度和 IO 等待被拖慢。
总结
香港物理服务器 swap 占用过高,不能简单理解为“服务器坏了”或者“必须重启”。正确的排查逻辑是先看 si/so 是否持续发生,再结合内存可用量、IO等待、进程占用和业务场景判断。
优化策略也不应该只停留在一个参数上。更合理的做法是:保留 swap 作为安全缓冲,降低 swappiness,控制数据库和应用进程内存,合理规划缓存,并对突发任务做错峰处理。
对于运行企业官网、跨境业务后台、API服务和数据库的香港物理服务器来说,稳定不只来自硬件配置,也来自长期可控的内存调度策略。硬件提供上限,系统参数和应用配置决定日常运行是否平稳。
