记录一次排查服务器卡顿原因的过程

提出问题

今天在服务器上运行一个程序很慢,执行命令半天没反应,内存还有很多,cpu也并不高

寻找原因

通过top命令发现cpu等待磁盘io时间过长(wa表示io阻塞造成的cpu空闲与cpu总空闲时间比,一般来说若>5则应该引起重视)

swap分区

并且,我发现swap分区使用率一直为100%,猜测可能是交换分区导致的,因为我的实际内存较大(250g),还有很多没用到,故应该尽量使用物理内存。系统环境中有个变量 vm.swappiness 可以用来控制物理内存与交换分区占用情况,可以使用命令 sysctl vm.swappiness 来查看,它的取值为 0-100,当取0时即尽可能使用物理内存,取100则表示尽可能使用交换分区,默认情况下是60,我这里直接将其修改为1,因为系统中有些程序必须要用交换内存,否则会出错。修改方式为:

  1. 临时修改命令:sysctl vm.swappiness=1,立即生效,无需重启系统
  2. 永久修改方案:修改配置文件 sudo echo "vm.swappiness=1" >> /etc/sysctl.conf,然后使用 sudo sysctl -p 使其生效

但这样做之后,一段时间后物理内存使用率确实上去了,但情况并没有什么改善,所以应该不是交换分区io的问题。

iostat

iostat命令可以查看io的使用情况,使用该命令需要先安装 sysstat 工具包 sudo apt install -y sysstat

使用 iostat 命令可以查看当前磁盘io的使用情况,加上 -x 可以查看更多额外的信息,比如某磁盘的io利用率。

这是相对空闲的机器io情况

这是较为繁忙的机器情况

可以看到卡顿的机器磁盘io很高,流量也很大,接下来去查看是什么应用导致这么大的io

可以使用 iotop 命令来查看各个软件的io情况,需手动安装 sudo apt install -y iotop。该命令的执行需要管理员权限

你也可以通过 -u 命令来查看某个用户的应用io情况 iotop -u xxx

由此,我发现了某账户执行的一些程序一直在高强度io,导致系统卡顿

问题解决

应该是模型训练过程中需要不断加载数据导致的,既然这个磁盘出现了io问题,解决办法就是把数据和程序放到别的磁盘再运行。

Leave a Comment