CPU和IO空闲但负载较高问题排查解决

服务器出现高负载问题,CPU和IO使用率却低,发现大量ps和pidof进程处于不可中断的休眠(D状态)。D状态进程通常因等待IO引起,无法直接kill。高负载源于Linux系统将IO等待状态纳入负载计算。问题可能是监控调用异常导致内核IO死锁。处理D状态进程需判断IO故障或内核死锁,严重时可能需重启机器。
摘要由CSDN通过智能技术生成

CPU和IO空闲但负载较高问题排查这里写自定义目录标题

背景

一台线上服务器,监控告警显示服务器负载较高,达到了100多。登录机器使用top命令查看,CPU和IO使用率均较低。同时,发现系统中存在较多pspidof的进程,且他们的进程状态均为D,使用kill命令无法杀死这些进程。

问题分析

初步怀疑是这些进程状态为D的大量pspidof的进程导致的负载较高。

通过man ps查询进程的状态描述信息:

D    uninterruptible sleep (usually IO)
R    running or runnable (on run queue)
S    interruptible sleep (waiting for an event to complete)
T    stopped, either by a job control signal or because it is being traced
W    paging (not valid since the 2.6.xx kernel)
X    dead (should never be seen)
Z    defunct ("zombie") process, terminated but not reaped by its parent

根据描述,进程状态D表示uninterruptible sleep (usually IO),即不可中断的休眠,通常是IO操作导致。

查阅资料得知,处于D状态的进程通常是在等待 IO,比如磁盘 IO,网络 IO,其他外设 IO。处在这种状态的进程不接受外来的任何信号,故而无法通过kill来杀死它。

那么,为什么处于D状态的进程会导致机器平均负载升高呢?

系统平均负载的计算

以单CPU是为例,比如过去的平均一分钟里面,判断系统处于运行或者等待状态的进程数则表示系统的平均负载。但是在linux系统下稍有不同,那些处于IO等待状态的进程也会被纳入计算。所以CPU利用率和平均负载很不同,在大部分进程都在做IO处理的时候,可能CPU利用率很低,但是平均负载很大。

在我们的场景中,存在大量处于D状态的进程,这些进程本质上都处于IO等待状态,会被纳入到平均负载的计算当中。故而,到最后了机器平均负载升高。

为什么会存在大量D状态的进程

处于D状态的进程通常是在等待 IO,出现大量进程处于D状态通常有两种原因,一是IO设备故障,二是内核IO操作死锁。在我们的场景中就是由于集团监控端和我们自己的监控端都在频繁调用pspidof,其内部异常导致内核IO操作死锁。

处理D状态的进程

首先需要判断是否是IO设备故障,如果是IO设备故障,只能尝试修复IO设备。

如果是内核IO操作死锁,可以尝试杀死所有异常进程看是否能够释放锁。

由于处理D状态的进程没法直接kill,可以尝试修改进程状态,然后kill掉进程,具体操作如下:

1、编写内核模块

源码文件: killd.c

#include <linux/init.h>
#include <linux/module.h>
#include <linux/sched.h>
MODULE_LICENSE("BSD");
static int pid = -1;
module_param(pid, int, S_IRUGO);
static int killd_init(void)
{
    struct task_struct * p;
    // force D status process to death
    for_each_process(p){
        if(p->pid == pid){
            set_task_state(p, TASK_STOPPED);
            return 0;
        }
    }
    return 0;
}
static void killd_exit(void)
{
    // do nothing
}
module_init(killd_init);
module_exit(killd_exit);

2、编译内核模块

2.1 Makefile文件:

bj-m := killd.o

2.2 获取kernel名称:

uname -r

2.3 编译:

make -C /lib/modules/<kernel名称>/build M=`pwd` modules

3 加入模块的时候传入进程号,将进程状态转换为stopped状态

3.1 创建pids文件,进程号按行加入到文件中
3.2 创建stop.sh文件:

cat pids | while read line
do
    echo $line
    insmod ./killd.ko pid=$line && rmmod killd
    kill -9 $line
done

3.3 执行

chmod 755 stop.sh && ./stop.sh

通过杀死uninterruptible sleep状态进程的方式,极有可能无法解决IO操作的死锁问题,甚至可能会引起其他的一些系统异常,最简单的有效的方式是reboot重启机器。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
排查解决TiDB中TiKV CPU使用率过问题时,可以按照以下步骤进行: 1. 查看TiKV的监控指标:首先,通过监控系统查看TiKV的CPU使用率和其他相关指标,如内存使用率、磁盘IO等。确定CPU使用率是否真的过以及其他指标是否异常。 2. 检查TiKV配置:检查TiKV的配置文件,包括CPU相关的配置项,比如线程数、并发度等。确保配置项与硬件环境相匹配,且没有设置过的值导致CPU占用过。 3. 检查TiDB版本:确保使用的TiDB版本是最新的稳定版本,因为一些旧版本可能存在CPU占用的bug或性能问题。如果是旧版本,可以尝试升级到最新版本以修复问题。 4. 检查TiKV日志:查看TiKV的日志,特别是错误日志或警告信息,以了解是否有异常发生。错误日志可能提供有关CPU占用过的更多线索。 5. 检查TiDB查询语句:排查是否有复杂或低效的查询语句导致TiKV的CPU占用过。可以通过优化查询语句、增加索引或调整TiDB的配置来改善查询性能。 6. 调整TiKV参数:根据实际情况,可以尝试调整TiKV的一些参数,如region和raft的配置参数,以优化性能并减少CPU的使用率。 7. 分析性能剖面数据:如果以上步骤无法解决问题,可以使用TiDB提供的性能剖面功能,对TiKV进行深入分析。这将帮助您确定具体的热点和性能瓶颈,并采取相应的措施进行优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值