问题再现
阿里云诊断提示IO延迟过长,导致读写受限
最近迁入阿里云主机(99计划2H+2G)后经常发现会出现死机的情况,呈现的状态就是网站无法访问,阿里云实例监控查看,是实例云盘读写 BPS 100M以上。
进行了健康诊断:
严重实例云盘读写受限
当前实例的云盘在2024年8月19日 13:01:00出现读写IO延迟过长,或达到了该云盘类型的IOPS上限,导致实例云盘读写受限。查看实例更多监控信息
异常详情
为避免该情况再次发生,请降低云盘的读写频率或升级为更高性能的云盘类型。
修复建议
不同云盘的读写性能指标可参考:块存储性能
告警检查系统是否发生过OOM
当前实例Guest OS内部曾经发生了OOM(out-of-memory)问题。
系统最近一次发生OOM的时间和详情日志如下,请您检查当前实例内存大小是否足以支撑实例上运行的业务,必要的情况下,请升级配置提升实例内存。
异常详情
Aug 19 11:42:15 iZ2ze108t1lzhuz1m7023rZ kernel: AliYunDunMonito invoked oom-killer: gfp_mask=0x140cca(GFP_HIGHUSER_MOVABLE|__GFP_COMP), order=0, oom_score_adj=0
Aug 19 11:42:15 iZ2ze108t1lzhuz1m7023rZ kernel: Out of memory: Killed process 38146 ((sd-pam)) total-vm:106820kB, anon-rss:3816kB, file-rss:128kB, shmem-rss:0kB, UID:0 pgtables:88kB oom_score_adj:100
Aug 19 11:42:15 iZ2ze108t1lzhuz1m7023rZ kernel: systemd invoked oom-killer: gfp_mask=0x140cca(GFP_HIGHUSER_MOVABLE|__GFP_COMP), order=0, oom_score_adj=100
修复建议
分析OOM的根因并解决的方法可参考:Linux实例存在OOM问题的处理方法
搜索了下相关问题,遇到此类情况的网友还真不少。
如下:
关于阿里云磁盘不定期出现IO过高的问题_问答-阿里云开发者社区 (aliyun.com)
关于阿里云轻量云云盘读写IOPS超过上限导致卡死的问题_问答-阿里云开发者社区 (aliyun.com)
服务器崩溃、远程无法访问、阿里云诊断提示IO延迟过长,导致读写受限 | Laravel | Laravel China 社区 (learnku.com)
但是好像都并没有得到实质性的解决。
解决方向
1、调整交换分区减缓瞬时内存压力
既然发生了OOM,那必然是内存捉襟见肘了。这里先根据网友 @慧眼见真 增加 swap 试试看。
以下均为 root 权限执行
# 查看系统内存情况
free -h
# 查看交换内容情况
swapon --show
# 指定 swap 文件并分配 3G 大小
fallocate -l 3G /swapfile
# 修改权限
chmod 600 /swapfile
# 格式化为 swap
mkswap /swapfile
# 启用 swap
swapon /swapfile
# 永久启用
echo '/swapfile swap swap defaults 0 0' >> /etc/fstab
重要!接下来需要调整内存交换性
# 查看交换分区积极性,当为 0 表示不使用交换分区
cat /proc/sys/vm/swappiness
# 临时调整
# 可以简单理解为当内存占用 (100-10)% 时开始使用交换分区
sysctl vm.swappiness=10
# 永久调整
vim /etc/sysctl.conf
vm.swappiness=10
# 重新加载内核参数配置
sysctl -p
禁用dnf的自动更新
# 确认相关任务存在
systemctl list-timers 'dnf-*'
# 禁用任务
systemctl stop dnf-makecache.timer
systemctl disable dnf-makecache.timer
# 之后我们可以手动更新
dnf check-update
参考文章
阿里云 系统磁盘总读BPS 突然增长很高,导致网站502 Bad Gateway_问答-阿里云开发者社区 (aliyun.com)
如何在 Linux 上创建和使用交换文件 (linux-console.net)
后话:
当然,如果你的程序确实有较大占用内存的如MySQL,可以适当配置参数降低占用。
不同内存大小的MySQL配置方案 – wking’s blog (wkings.blog)
1核1G内存云服务器的mysql5.7内存占用过大参数优化