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

香港服务器Swap突然飙高怎么办?别急着重启,先这样优化内存调度

发布人:Minchunlin 发布时间:2026-06-10 09:07 阅读量:262

不少用户在使用香港物理服务器时,会遇到一个比较典型的问题:明明服务器还能访问,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 里的 siso 长时间接近 0,说明系统当前并没有频繁从 swap 读写数据,这可能只是过去某次内存压力留下的占用,不一定会明显影响现在的业务。

真正需要警惕的是下面几种情况:

vmstat 1

如果 siso 持续不为 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已经很高时怎么处理?

如果确认当前 siso 为 0,业务没有明显卡顿,可以先不急着清理 swap,而是观察一段时间。

如果确实想把 swap 中的数据迁回内存,必须先确认可用内存足够:

free -h

然后谨慎执行:

swapoff -a && swapon -a

这一步不建议在业务高峰期执行。如果可用内存不足,执行 swapoff 可能导致服务被 OOM 杀掉。

更推荐的顺序是:

  1. 找出高内存进程

  2. 优化应用配置

  3. 降低 swappiness

  4. 观察 si/so 和业务延迟

  5. 必要时再清理 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服务和数据库的香港物理服务器来说,稳定不只来自硬件配置,也来自长期可控的内存调度策略。硬件提供上限,系统参数和应用配置决定日常运行是否平稳。

目录结构
全文