如何分析D状态进程

本文涉及的产品
云原生多模数据库 Lindorm,多引擎 多规格 0-4节点
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云数据库 MongoDB,通用型 2核4GB
简介:

在使用top查看进程状态时,我们有时候会看到D状态的进程。

       w: S  --  Process Status
          The status of the task which can be one of:
             ’D’ = uninterruptible sleep
             ’R’ = running
             ’S’ = sleeping
             ’T’ = traced or stopped
             ’Z’ = zombie

D是一种不可中断的sleep,如果你发现大量的D状态的进程,这个时候这些进程实际上是没有在处理业务逻辑的。
例如使用PostgreSQL时,批量的往数据库导入数据,如果导入的数据量大到OS脏页回写的速度赶不上写入的速度时,并且用户刷dirty page的阈值到达,用户进程会需要主动刷脏页。

vm.dirty_background_ratio = 10
vm.dirty_background_bytes = 0
vm.dirty_ratio = 20
vm.dirty_bytes = 0
vm.dirty_writeback_centisecs = 50
vm.dirty_expire_centisecs = 6000  

例如以上配置,OS脏页超过20%时,用户调write也需要主动的刷脏页,就会看到进程处于D状态,直到脏页水位下降到10%以下。
当然还有其他的原因会导致进程进入D状态,我们需要观察进程的stack,看看它处于什么状态。
例如处于R状态的COPY PostgreSQL进程,它的stack是什么样的?

cat /proc/17944/status ; echo -e "\n"; cat /proc/17944/stack
Name:   postgres
State:  R (running)
Tgid:   17944
Pid:    17944
PPid:   57925
TracerPid:      0
Uid:    123293  123293  123293  123293
Gid:    100     100     100     100
Utrace: 0
FDSize: 64
Groups: 100 19001 
VmPeak: 272294920 kB
VmSize:   119788 kB
VmLck:         0 kB
VmHWM:      3244 kB
VmRSS:      2812 kB
VmData:     2140 kB
VmStk:       152 kB
VmExe:      5852 kB
VmLib:      2400 kB
VmPTE:        64 kB
VmSwap:        0 kB
Threads:        1
SigQ:   0/4131614
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000001301800
SigCgt: 0000000180006287
CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 0000000000000000
CapBnd: ffffffffffffffff
Cpus_allowed:   ffffffff,ffffffff
Cpus_allowed_list:      0-63
Mems_allowed:   00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000001
Mems_allowed_list:      0
voluntary_ctxt_switches:        55758
nonvoluntary_ctxt_switches:     103995


[<ffffffff8121b40a>] sys_semtimedop+0x81a/0x840
[<ffffffffffffffff>] 0xffffffffffffffff

例如处于D状态的COPY PostgreSQL进程,它的stack是什么样的?
可以看到它处于刷脏页速度受限的状态,与ext4内核有关。

cat /proc/17944/status ; echo -e "\n"; cat /proc/17944/stack
Name:   postgres
State:  D (disk sleep)
Tgid:   17944
Pid:    17944
PPid:   57925
TracerPid:      0
Uid:    123293  123293  123293  123293
Gid:    100     100     100     100
Utrace: 0
FDSize: 64
Groups: 100 19001 
VmPeak: 272294920 kB
VmSize:   119788 kB
VmLck:         0 kB
VmHWM:      3244 kB
VmRSS:      2812 kB
VmData:     2140 kB
VmStk:       152 kB
VmExe:      5852 kB
VmLib:      2400 kB
VmPTE:        64 kB
VmSwap:        0 kB
Threads:        1
SigQ:   0/4131614
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000001301800
SigCgt: 0000000180006287
CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 0000000000000000
CapBnd: ffffffffffffffff
Cpus_allowed:   ffffffff,ffffffff
Cpus_allowed_list:      0-63
Mems_allowed:   00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000001
Mems_allowed_list:      0
voluntary_ctxt_switches:        55922
nonvoluntary_ctxt_switches:     104189


[<ffffffff81133cf0>] balance_dirty_pages_ratelimited_nr+0x2d0/0x9a0
[<ffffffff8111f19a>] generic_file_buffered_write+0x1da/0x2e0
[<ffffffff81120fe0>] __generic_file_aio_write+0x260/0x490
[<ffffffff81121298>] generic_file_aio_write+0x88/0x100
[<ffffffffa00b9463>] ext4_file_write+0x43/0xe0 [ext4]
[<ffffffff8118863a>] do_sync_write+0xfa/0x140
[<ffffffff81188938>] vfs_write+0xb8/0x1a0
[<ffffffff81189231>] sys_write+0x51/0x90
[<ffffffff8100c072>] system_call_fastpath+0x16/0x1b
[<ffffffffffffffff>] 0xffffffffffffffff
相关文章
|
1月前
|
Linux
一个进程最多可以创建多少个线程基本分析
一个进程最多可以创建多少个线程基本分析
39 1
|
28天前
|
监控 Linux Shell
Linux 进程问题调查探秘:分析和排查频繁创建进程问题
Linux 进程问题调查探秘:分析和排查频繁创建进程问题
39 0
|
28天前
|
消息中间件 存储 网络协议
Linux IPC 进程间通讯方式的深入对比与分析和权衡
Linux IPC 进程间通讯方式的深入对比与分析和权衡
67 0
|
28天前
|
存储 算法 Linux
【Linux 系统标准 进程资源】Linux 创建一个最基本的进程所需的资源分析,以及线程资源与之的差异
【Linux 系统标准 进程资源】Linux 创建一个最基本的进程所需的资源分析,以及线程资源与之的差异
25 0
|
2月前
|
分布式计算 并行计算 大数据
Python多进程在数据处理和大数据分析中的应用
Python多进程在数据处理和大数据分析中的应用
|
4月前
|
消息中间件 数据库连接 数据库
py 多进程 引发的 各种数据库连接 消息队列连接 异常问题 简单分析
py 多进程 引发的 各种数据库连接 消息队列连接 异常问题 简单分析
38 0
|
7月前
|
消息中间件 Linux 测试技术
【Linux系统】一个常驻进程问题的再次分析
问题发生在两年前,回顾当时,问题排查缓慢,最终还是其他同学解决了问题,主要还是因为对底层原理了解不够,另外问题分析思路也不够清晰。线上问题,尤其是涉及底层内存、共享内存、进程等等的问题,还是必须要对这些基本原理和运行机制有足够的了解,才能够快速定位并解决实际问题。
65 0
|
SQL 缓存 运维
【大数据开发运维解决方案】GoldenGate replicat进程延迟分析步骤
GoldenGate几乎支持市面上流行的所有主流的操作系统平台和数据库。 博主所在单位目前使用Oracle GoldenGate将各个业务生产库汇聚到一起做数仓***实时ODS平台***, 我们采用异构同步,即源端同步过来的表在ODS新增了一个etltime字段,用来记录当前数据变更时间。 为了记录数据的事务变更历史记录,我们将数据的变更记录映射同步到一张tab_name_audit表中。为了防止源端业务库误删数据,我们将被删除的数据映射同步到一张tab_name_his表中。原表映射到ods后还是正常的映射同步dml操作。
【大数据开发运维解决方案】GoldenGate replicat进程延迟分析步骤
|
Linux C语言
Linux系统调用一、系统调用与C库函数的关系 —— 从进程虚拟地址空间和文件描述符的角度分析
Linux系统调用一、系统调用与C库函数的关系 —— 从进程虚拟地址空间和文件描述符的角度分析
167 0
Linux系统调用一、系统调用与C库函数的关系 —— 从进程虚拟地址空间和文件描述符的角度分析
|
调度
0_进程、线程、协程对比分析
进程、线程、协程对比分析
98 0

相关实验场景

更多