分析NAS故障导致服务器的io load异常

fengmian

问题现象:

服务器挂载的nas存储出现故障,服务器无法正常读写disk ,导致进程进入sleep状态或d状态(disk sleep),此时服务器进程会 处于休眠或终止状态;

服务器cpu使用不高的情况下,通过top命令,load 会显示高状态并持续升高

解决:

1、修复存储,确保存储卷访问正常;

2、在服务器无法重启时,此时大部分进程可以从sleep状态转成就绪R状态,并继续运行;

3、问题进程并不会自动关闭,需要手动找出并kill进程;

如何找出系统中 load 高时处于运行队列的进程通过前面的讲解,我们已经明白有可能系统有很高的负载但是 CPU 使用率却很低, 或者负载很低而 CPU 利用率很高,这两者没有直接关系,如何用脚本统计出来处于 运行队列的进程呢? 每隔 1s 统计一次:

#!/bin/bash
LANG=C
PATH=/sbin:/usr/sbin:/bin:/usr/bin
interval=1
length=86400
for i in $(seq 1 $(expr ${length} / ${interval}));do
date
LANG=C ps -eTo stat,pid,tid,ppid,comm –no-header | sed -e ‘s/^ \*//’ |
perl -nE ‘chomp;say if (m!^\S*[RD]+\S*!)’
date
cat /proc/loadavg
echo -e “\n”
sleep ${interval}
done

 在 load 比较高的时候,有大量的 nginx 处于 R 或者 D 状态,他们才是造成 load 上 升的元凶,和我们底层的负载确实是没有关系的。

最后也给大家 share 一下查 CPU 使用率比较高的线程小脚本

#!/bin/bash
LANG=C
PATH=/sbin:/usr/sbin:/bin:/usr/bin

interval=1
length=86400
for i in $(seq 1 $(expr ${length} / ${interval}));do
date
LANG=C ps -eT -o%cpu,pid,tid,ppid,comm | grep -v CPU | sort -n -r | head -20
date
LANG=C cat /proc/loadavg
{ LANG=C ps -eT -o%cpu,pid,tid,ppid,comm | sed -e ‘s/^ *//’ | tr -s ‘ ‘ |
grep -v CPU | sort -n -r | cut -d ‘ ‘ -f 1 | xargs -I{} echo -n “{} + ” &&
echo ‘0’; } | bc -l
sleep ${interval}
done
fuser -k $0

分析NAS故障导致服务器的io load异常

发表回复

滚动到顶部