起因:
随着Centos系统官方宣布停止维护,宝塔面板官方也将主要推荐运行系统改为了Debian12。按理说Debian对机器配置要求低一些。但博主使用阿里云ECS在同样的配置下,经常遇到宕机情况。经ECS健康诊断排查,出现宕机情况时,出现异常项清单报错,内容如下:
【严重】实例云盘读写受限
该实例出现磁盘 IO 读写受限,可能影响业务正常运行
异常详情
该实例在 2026年X月XX日 21:00:00 出现磁盘 IO 读写受限,请检查业务与磁盘性能是否相匹配,并根据业务按需升级云盘规格(若达到实例规格上限时,需要同步升级实例规格)。
经最终锁定问题:
1、阿里云ECS内存长时间不足会触发内核kswap机制,该机制类似于swap交换分区。只是这个kswap是内核触发,内核为了保护自己的运行正常不会因为内存被强占导致内核崩溃,所以会在内存不足时触发kswap脏页交换。将内存脏页刷写到磁盘中,从而引起的磁盘读写BPS超限,因为不论如何刷写当时的内存都是不足的,程序侧依然还在频繁调用,从而引发了恶性循环导致系统负载升高,BPS持续打满,引发系统夯死。
2、在宝塔面板(v12.0.0)里,使用命令:
cat /proc/sys/vm/swappiness
查询出数值为“0”
原因是宝塔官方运维认为“本来就是虚拟机,再使用虚拟内存,那就更慢了。”(我真的哭死,强烈建议宝塔在Linux工具箱的“Swap/虚拟内存”增加个swappiness参数,那句“若您不需要swap,请将容量设为0”导致我总以为配置了容量,而且偶尔能看到系统有使用就算正确开启了SWAP。哪知道swappiness参数0是最大程度使用ECS内存的罪魁祸首。)
解决方案:
方案一:修改swappiness参数,提高使用虚拟内存权重,命令如下:
1、检查当前swappiness参数,执行命令如下:
cat /proc/sys/vm/swappiness
*宝塔面板一般默认值是“0”,看见不要惊讶!!!
2、永久修改swappiness参数,执行命令如下:
echo "vm.swappiness=30" >> /etc/sysctl.conf
*该代码里的“30”,是博主使用的参数!你可以改成0-100任意值。0代表尽量使用机器内存,100代表尽最大程度提高虚拟内存使用,但毕竟SWAP是放在储存盘里的虚拟内存,不如ECS购买的运存速度快。数值越大,爆内存的情况能缓解,但程序运行的速度会下降,所以“适当”很重要。
*阿里云购买ECS时的加带SWAP,官方默认swappiness参数是“60”。但可参考如下进行设置:
| 应用场景 | 推荐swappiness值 |
| 数据库 (MySQL, PostgreSQL) | 1-10 |
| 内存数据库 (Redis, Memcached) | 1 |
| Web应用服务器 (Nginx, Apache) | 10-60 |
| 阿里云ECS镜像安装的SWAP默认值 | 60 |
3、重载配置(使其生效)
sysctl -p
4、检查是否生效(再次确认)
cat /proc/sys/vm/swappiness
*看是不是你修改成的那个数值了,如果是就成功了!(如果有强迫症,还可以重启一下ECS!)
*如果还是“0”,没成功,检查服务器“/etc/sysctl.conf”文件有没有读写权限(如果开启了“宝塔系统加固”,可能需要临时关闭一下相关功能)。然后再重新执行一次上面的步骤!(依然,如果有强迫症,还可以重启一下ECS!)
方案二:升级ECS实例配置(如果配置了swappiness参数,还是因为内存宕机的话!只能乖乖升配置了!)
纯新手,各操作步骤图文教程如下:
一、环境约定
系统:Debian12
宝塔面板:稳定版 12.0.0
二、各步骤图文演示
