接着上篇博客(https://www.chengpei.top/archives/aliyun-ecs-exception),我在2C2G的阿里云服务器上搭建了博客,但是在服务器内存满载的情况下,服务器出现CPU占用异常、磁盘读取BPS异常的问题,并且ssh无法登录的问题,当然最直接的方案当然是加购内存,奈何家境贫寒搭建个博客而已不愿再多付出成本,于是开始寻找其他解决方案。
异常复现
上篇博客提到CPU、磁盘读取异常的原因可能是内存占用满了,导致系统频繁使用 swap(交换分区)进行内存交换,导致 CPU、BPS 和 IOPS 增高。但是这也只是我的猜测,具体情况我准备直接给服务器加压看是否可以得到复现,于是我在服务器上启动了一个Java服务并且持续调用,很快内存暂用就超过了90%,手机也及时收到了告警短信,说明昨天博客里配置的报警规则是有效的,紧接着服务器上响应明显变慢,CPU磁盘读取开始迅速上升,服务器load很高
解决方案
异常得到了复现,同时我在htop里观察到Swap并没有启用,全部使用的都是物理内存,所以想到如果我启用虚拟内存,是不是能缓解这种情况,于是在阿里云上找到一篇文档添加swap分区的方法,具体操作如下:
# 创建swap文件夹
sudo mkdir -v /var/cache/swap
# 进入swap文件夹
cd /var/cache/swap
# 创建swap文件,1K * 4M,大概会创建4G大小的虚拟内存文件
sudo dd if=/dev/zero of=swapfile bs=1K count=4M
# 将新建的文件转换为swap文件
sudo mkswap swapfile
# 给文件授权
sudo chmod 600 swapfile
# 启用swap分区
sudo swapon swapfile
# 将该分区设置成开机自启
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
加载修改
完成所有设置后,再次给服务器加压,以下是服务器资源变化
九点半左右的情况是swap设置之前,加压导致cpu、读取字节居高不下,10点左右是设置了swap之后,虽然cpu、磁盘io依旧有波动,但是也是在我加压情况下的正常波动,服务器load也没有升高,响应也正常了,物理内存占用甚至下降了,因为有30%的内存进入到了虚拟内存,服务器也没有明显的卡顿现象,虽然虚拟内存的使用可能会导致系统性能下降,毕竟内存数据放磁盘上了,读写肯定会慢很多,但是对于我来说系统没有挂掉应该很好了,这次优化非常满意了
评论区