linux 进程D状态的解决思路

news2024/11/29 8:54:29

同时做了录屏放到B站了,伙伴们视频给个3连支持一下

linux 进程D状态解决思路

1. 问题描述

在Linux系统环境,进程在内核模式下等待I/O完成时通常会进入不间断睡眠状态,此时使用ps或top命令输出的进程显示为D状态。当然我们也可以使用sysrq工具将有关进程的信息发送到/var/log/messages。

2. 问题分析

在正常情况下,不间断状态只持续几分之一秒。但是,异常情况下,进程可能会停留在此状态更长的时间或(在最坏的情况下)无限期地停留。这种状态下,即使使用“kill -9”也无法杀死进程,因为在进程唤醒之前,kill信号无法传递给进程。

3. 实验模拟

在CentOS 7.9环境模拟一个处于D状态的进程并进行实验分析:使用LVM卷的 suspend 特性,暂停IO,使得上层应用程序处于D状态。

3.1 使用losetup创建一个卷作为pv的磁盘。

losetup命令概述
losetup命令用来设置loop设备,loop设备可以将文件虚拟成块设备,这样用户就可以对其进行挂载,
比如常见的ISO光盘镜像、img镜像都可以被虚拟成块设备,然后进行挂载和访问。

# dd写入一个2G的文件
$ dd if=/dev/zero of=/tmp/diskfile count=2048 bs=1M
# 将2G的文件虚拟成块设备
$ losetup --show -f /tmp/diskfile

在这里插入图片描述

3.2 使用/dev/loop0块设备创建pv, vg和lv。

[root@node-1 ~]# pvcreate /dev/loop0
  Physical volume "/dev/loop0" successfully created.
[root@node-1 ~]# vgcreate vg01 /dev/loop0
  Volume group "vg01" successfully created
[root@node-1 ~]# lvcreate -n lv01 -L 1G vg01
  Logical volume "lv01" created.

3.3 使用刚创建的lv,创建一个文件系统并挂载到/mnt目录。

[root@node-1 ~]# mkfs.ext4 /dev/vg01/lv01
[root@node-1 ~]# mount /dev/vg01/lv01 /mnt

在这里插入图片描述

3.4 dmsetup suspend 命令暂停 lv 同时进行IO

[root@node-1 ~]# dmsetup suspend /dev/vg01/lv01 && dd if=/dev/urandom of=/mnt/iotest.img count=1024 bs=1M

此时,该进程就会处于D状态,命令不会返回到shell提示符。
在这里插入图片描述
可以通过另一个 shell 终端来查看这个进程:

[root@node-1 ~]# ps -aux | awk '$8 == "D+" {print $0}'
root       1685  0.0  0.0 108096   620 pts/0    D+   15:57   0:00 dd if=/dev/urandom of=/mnt/iotest.img count=1024 bs=1M

通过kill -9 1685也杀死不掉该进程

[root@node-1 ~]# kill -9 1685
[root@node-1 ~]# ps -aux | awk '$8 == "D+" {print $0}'
root       1685  0.0  0.0 108096   620 pts/0    D+   16:21   0:00 dd if=/dev/urandom of=/mnt/iotest.img count=1024 bs=1M

3.5 对/var/log/messages日志文件进行分析

看到“task dd:1685 blocked for more than 120 seconds.”这样的消息时,这通常意味着有一个名为dd的进程(进程ID为1685)在执行过程中被阻塞了超过120秒。
在这里插入图片描述

但dd进程为什么会被堵塞我们也不知道,应需要开发人员去分析call trace信息。但由于这是通过测试模拟的,我知道是什么原因堵塞,所以我们通过dmsetup resume命令进行恢复lv, 然后dd命令io就正常写入了,进程状态也由D变为R 。
[root@node-1 ~]# dmsetup resume /dev/vg01/lv01
在这里插入图片描述

4. 问题总节:

1、如果生产环境遇到进程一直处于D状态,无法kill 掉, 重启服务器解决
2、运维侧分析日志或者事件升级到研发,找到进程处于D状态的原因,让进程从D状态恢复到R状态。
通过sysrq工具进行手动从内核收集D进程信息转存到messages,拿到日志进一步分析或升级到研发分析:

# 启用sysrq的功能:
$ echo 1 > /proc/sys/kernel/sysrq

# 转储处于不可中断(阻塞)状态的任务。
$ echo w > /proc/sysrq-trigger

# 将当前任务列表及其信息转储到您的控制台。
$ echo t > /proc/sysrq-trigger

# 显示所有活动 CPU 的堆栈回溯。
$ echo l > /proc/sysrq-trigger
这会将任务和线程信息转储到/var/log/messages,进行进一步分析

5. linux常见几种状态

这里只列出4种状态

5.1 TASK_RUNNING:(R)

进程当前正在运行,或者正在运行队列中等待调度。只有在该状态的进程才可能在CPU上运行,同一时刻可能有多个进程处于运行状态。

5.2 TASK_INTERRUPTIBLE:(S)

进程处于睡眠状态,处于这个状态的进程因为等待某事件的发生(比如等待socket连接、等待信号量),而被挂起。当这些事件发生时,对应的等待队列中的一个或多个进程将被唤醒。一般情况下,进程列表中的绝大多数进程都处于TASK_INTERRUPTIBLE状态。进程可以被信号中断。接收到信号或被显式的唤醒呼叫唤醒之后,进程将转变为TASK_RUNNING 状态。

5.3 TASK_UNINTERRUPTIBLE:(D)

不可中断的睡眠状态,此进程状态类似于 TASK_INTERRUPTIBLE,只是它不会处理信号。不可中断,指的是进程不响应异步信号,无法用kill命令关闭处于TASK_UNINTERRUPTIBLE状态的进程。

5.4 EXIT_ZOMBIE:(Z)

进程已终止,它正等待其父进程收集关于它的一些统计信息。不可被kill, 即不响应任务信号, 无法用SIGKILL杀死

6. 关于SysRq:

6.1 什么是SysRq键?

“SysRq”键也称为“Print Screen”键,按下SysRq键,LINUX内核会响应,除非内核完全崩溃。关于SysRq的参考链接:参考点这里

6.2 如何启用SysRq键:

在配置LINUX内核时,如果对CONFIG_MAGIC_SYSRQ配置Y选项,完成内核编译后,可以通过/proc/sys/kernel/sysrq来调用SysRq 键调用的函数。

以下是 /proc/sys/kernel/sysrq 中支持的值列表:

0 完全禁用 sysrq。
1 启用 sysrq 的所有功能。
>1 允许的 sysrq 函数的位掩码

参考文献:LINUX云服务器进程D状态问题分析

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2059987.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Python flask的图书借阅管理系统的设计与实现

基于Python Flask的图书借阅管理系统旨在为图书馆或类似机构提供一个高效、便捷的管理平台,覆盖图书借阅的各个环节,帮助管理员和读者更好地管理和使用图书资源。该系统采用Python编程语言和Flask框架进行开发,结合了数据库管理、用户认证、数…

数字图像处理【13】图像特征概述。

前言概述 打算用几篇文章回顾OpenCV特征模块(features2d)当中的对象检测(object detection)概念,以及主要的经典算法。这些传统的算法相对于现在来讲,可能有些过时,但对于初学者来说还是有必要…

netty编程之广播消息

写在前面 本文看下使用netty如何实现广播消息,主要依赖于类io.netty.channel.group.ChannelGroup。 1:正戏 首先定义server: package com.dahuyou.netty.broadcastmsg;import io.netty.bootstrap.ServerBootstrap; import io.netty.chann…

Midjourney中文版教程:参数详解

1.长宽比 可以设置图片的纵横比。按照需求可以选择不同的尺寸,也可以自定义。 注意:--ar必须使用整数。使用139:100代替1.39:1。 长宽比会影响生成图像的形状和构图。 在放大时,某些长宽比可能会稍微改变。 较旧的…

「字符串」详解AC自动机并实现对应的功能 / 手撕数据结构(C++)

前置知识 在此前,你应该首先了解trie树(字典树)的概念: 「字符串」详解Trie(字典树|前缀树)并实现对应的功能 / 手撕数据结构(C) 我们建议你先阅读这篇文章,以了解我们…

C语言-用指向指针的指针的方法对n个整数排序并输出。要求将排序单独写成一个函数。n个整数在主函数中输入,最后在主函数中输出。

题目要求&#xff1a; 用指向指针的指针的方法对n个整数排序并输出。要求将排序单独写成一个函数。n个整数在主函数中输入&#xff0c;最后在主函数中输出。 程序&#xff1a; #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int main() {int arr[100];int* pa…

王者壁纸下载站照片墙-(HTML+CSS)

效果图&#xff1a; 参考源代码&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8" /><title>王者荣耀高清壁纸</title><style>#main{width:1366px;height:768px;margin-top:20px;}#main img{width:350px;}…

算法的学习笔记—从上往下打印二叉树(牛客JZ32)

&#x1f600;前言 在二叉树的遍历问题中&#xff0c;从上往下、从左到右打印出二叉树的每个节点值是一种常见的题目类型。这种遍历方式与广度优先搜索&#xff08;BFS&#xff09;密切相关&#xff0c;常常用于需要层次遍历&#xff08;Level-order Traversal&#xff09;的场…

PCIE-Precode

Transmitter Precode Request: Precoding可以有效的降低Burst errors&#xff08;突发连续&#xff09;的影响&#xff0c;但是Bit Error Rate&#xff08;BER&#xff09;将上升为之前的两倍. 32GT/s就必须使用这项功能吗&#xff1f;&#xff1f; [FPGA 实现及PCIe IP 核知…

SD 卡数据恢复免费版软件推荐及无法读取修复指南!

SD 卡数据怎么恢复&#xff1f;SD卡无法读取怎么修复&#xff1f;有没有SD卡数据恢复免费版&#xff1f; 在如今数字化的时代&#xff0c;SD 卡作为我们存储珍贵记忆和重要文件的常用工具&#xff0c;一旦出现数据丢失或无法读取的情况&#xff0c;往往会让人感到焦虑和无助。…

JAVA中的语序

目录 1. 顺序 2. 分支 2.1 if语句 2.1.1 单一条件的if语句 2.1.2 if-else语句 2.1.3 多层if-else语句 2.2 switch语句 3. 循环 3.1 for循环 3.2 while循环 3.3 do-while循环 3.4 break和continue 语序即代码运行的顺序&#xff0c;主要分为三种&#xff0c;顺序、分…

Java数组怎么转List,Stream的基本方法使用教程

Stream流 Java 的 Stream 流操作是一种简洁而强大的处理集合数据的方式,允许对数据进行高效的操作,如过滤、映射、排序和聚合。Stream API 于 Java 8 引入,极大地简化了对集合(如 List、Set)等数据的处理。 一、创建 Stream 从集合创建: List<String> list = Ar…

C#用户控件usercontrol中的子控件事件及属性的传递

也不知道这个标题怎么写&#xff0c;但是问题是个老问题&#xff0c;大家都可能遇到过&#xff0c;不过有同学问到&#xff0c;那就写出来。其实很简单。只不过有的同学看了其他博文后脑子还是懵懵的。所以这里就分两部分来说明一下。 文章目录 一、属性的传递1、原理2、步骤3…

一个实验带你全面学废网络OSPF协议内容

文章目录 一、OSPF实验与原理1. 多区域与虚链路配置及原理2. OSPF区域与接口认证的方法3. OSPF的Cost 值的作用4. 明白OSPF引入缺省、直连路由、宣告路由方法5. 描述OSPF区域间路由汇总和外部路由汇总6. 描述OSPF的5种类型的LSA区别&#xff0c;以及作用7. 控制OSPF的DR与BDR选…

微信小程序——弹出隐私指引教程(含代码)

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

【echarts】ECharts 解决地图标签重叠问题的技术实践

ECharts 解决地图标签重叠问题的技术实践 在使用 ECharts 绘制地图时&#xff0c;遇到的一个常见问题是某些地区的名称标签会因为地理位置接近而出现重叠&#xff0c;导致可读性变差。为了提升地图的展示效果&#xff0c;确保每个地区的名称都能清晰可见&#xff0c;我们可以通…

Java语言程序设计——篇十五(4)

&#xff1a; &#x1f33f;&#x1f33f;&#x1f33f;跟随博主脚步&#xff0c;从这里开始→博主主页&#x1f33f;&#x1f33f;&#x1f33f; 欢迎大家&#xff1a;这里是我的学习笔记、总结知识的地方&#xff0c;喜欢的话请三连&#xff0c;有问题可以私信&#x1f333;…

亦菲喊你来学习之机器学习(7)--逻辑回归内下采样

文章目录 下采样优缺点下采样步骤总结 下采样 在逻辑回归中&#xff0c;下采样是一种处理数据不平衡问题的方法&#xff0c;特别是在处理二分类问题时&#xff0c;如果某一类的样本数量远多于另一类&#xff0c;就可能导致模型偏向于多数类&#xff0c;从而忽略了少数类的特征…

基于推荐算法的景点攻略网站的设计与实现---附源码130855

摘 要 21世纪时信息化的时代&#xff0c;几乎任何一个行业都离不开计算机&#xff0c;将计算机运用于旅游景点分享也是十分常见的。过去使用传统广告方式对旅游景点进行推荐分享&#xff0c;造成了流程繁琐、难以维护&#xff0c;难于进准推荐给适合需求的人群等问题&#xff0…

java15-网络编程

一 网络编程概述 1.1 网络编程简介 其实&#xff0c;所谓的网络编程&#xff0c;就是编写程序&#xff0c;实现让同一个网络中的机器实现数据的传递&#xff0c;实现通信。 Java是 Internet 的语言&#xff0c;它从语言级上提供了对网络应用程序的支持。 Java提供的网络类库&a…