我现在回想起来,其实觉得很有必要记录一下我碰到的关于服务器磁盘I/O异常的问题。
这个问题现在看来其实很典型,而我恰好碰到了。但是对于当时的我来说还并不能理解为什么会出现这样的情况,了解了存储的知识之后,现在再来看就显得清晰多了。
问题简介
我一开始用的是阿里云的2g2h的轻量服务器,在这个服务器里我先后尝试部署了astrbot和个人博客页;
读入异常的情况出现在我部署完博客界面,并又重新挂载上astrbot的时候,一开始是发现群机器人无响应了,我尝试ssh登录,结果发现ssh也登录不了。于是登录管理页面查看服务器状态,便发现:

聪明的你应该一眼就能发现,在17:00时,cpu,内存,和系统盘读取都很明显不正常。在内存近乎满载的情况下,出现了cpu占用100%,磁盘读写异常的情况。
问题原因
咱们先说结论吧
出现这个原因实际上就是因为内存占用近乎满了,这导致系统频繁使用 Swap(交换分区)进行内存交换,导致 CPU、BPS 和 IOPS 增高。
从根本上来说,实际上就是 Swap 导致的:
当内存不足时,Linux 会把一部分 RAM 中的数据暂时搬到磁盘上的 Swap。当程序又需要这些数据时,就必须把它们从 Swap 搬回来。
此时,如果 RAM 太小,系统就会不断地在 RAM 和磁盘之间搬运数据。于是产生大量磁盘 I/O,IOPS 和 BPS 升高;同时 CPU 需要处理大量缺页异常、内核调度和内存管理工作,因此 CPU 使用率也可能上升。
一来二去,就卡住了。
解决方法
实际上解决方法也很简单,既然 RAM 不够,那我们可以使用“钞能力”,让RAM足够就好了。
然而很明显,对我我只能购买2g2h的人来说,我的经济显然是吃紧的。
那难道就没有办法了吗?有的兄弟有的,我们还可以牺牲一部分磁盘空间来当作 “RAM” 用,也就是设置虚拟内存:
sudo mkdir -v /var/cache/swap # 创建swap文件夹
cd /var/cache/swap # 进入swap文件夹
sudo dd if=/dev/zero of=swapfile bs=1K count=4M # 创建swap文件,1K * 4M,大概会创建4G大小的虚拟内存文件
sudo mkswap swapfile # 将新建的文件转换为swap文件
sudo chmod 600 swapfile # 给文件授权
sudo swapon swapfile # 启用swap分区
echo "/var/cache/swap/swapfile none swap sw 0 0" | sudo tee -a /etc/fstab # 将该分区设置成开机自启
完成以上设置后,编辑/etc/sysctl.conf文件,修改vm.swappiness值为30,相当于当物理内存超过60%就开始使用swap分区,执行sudo sysctl -p 加载修改
总结
事实上也确实证明,这样解决是有效的。设置完之后,便没再出现过之前的问题。设置虚拟内存肯定是有性能损耗的,相对于磁盘来说,RAM的速度可快多了,但是总比卡住好。
在那之后我又购置了一台香港的4h4g服务器,用来专门跑astrbot(2h2g挂俩还是太吃力了xwx)
实际上我解决的过程并没那么顺风顺水,我差不多花了1周的时间才勉强搞清楚发生了什么。当时的我并不能理解什么是RAM,什么是 Swap,为什么明明内存占用没满也会被卡住。这些内容对当时的我来说太专业了!问ai,我也完全搞不清楚它在说个什么,还挺令人头疼的。
但我在网络上漫无目的的寻找解决方法的时候,意外看到了这篇博客:
https://www.chengpei.top/archives/aliyun-ecs-exception-resolve
这不完全就是我也碰到的问题吗!?
他也是和我碰到同一个问题的人,他给我提供了直接的思路,我几乎不费什么力气,按照他的路径就解决了我的问题!因此解决方案部份我就直接照搬他的来了,毕竟我并不算了解这些内容。我还特别致了谢(
=w=