[转帖]系统中出现大量不可中断进程和僵尸进程

系统,出现,大量,不可,中断,进程,僵尸 · 浏览次数 : 0

小编点评

**生成内容时需要带简单的排版** **1. 排版标题** ``` # 进程资源使用情况分析报告 ``` **2. 排版进程信息** ``` # 进程ID # 进程名称 # 进程状态 # 进程父进程ID # 进程创建时间 # 进程内存使用情况 # 进程IO使用情况 ``` **3. 排版进程调用关系** ``` # 进程ID # 进程名称 # 进程调用关系 ``` **4. 排版 zombie进程信息** ``` # zombie进程ID # zombie进程名称 # zombie进程状态 # zombie进程创建时间 # zombie进程内存使用情况 # zombie进程IO使用情况 ``` **5. 排版代码解析** ``` # 代码分析 ``` **6. 排版报告** ``` # 进程资源使用情况分析报告 # 进程调用关系分析 # zombie进程分析 # 代码分析报告 ```

正文

https://www.jianshu.com/p/f76c54cd00fe

 

注:本文只是为了辅助自己分析而记录
首先我们来分析一下top命令:

[root@localhost ~]# top
top - 19:24:45 up 1 day,  6:05,  3 users,  load average: 0.00, 0.01, 0.05
Tasks: 419 total,   2 running, 417 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  1868660 total,   176700 free,   190944 used,  1501016 buff/cache
KiB Swap:  2097148 total,  2097096 free,       52 used.  1419080 avail Mem 

   PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                             
     1 root      20   0   44516   7232   2596 S  0.0  0.4   0:17.07 systemd                             
     2 root      20   0       0      0      0 S  0.0  0.0   0:00.12 kthreadd                            
     3 root      20   0       0      0      0 S  0.0  0.0   0:09.46 ksoftirqd/0                         
     7 root      rt   0       0      0      0 S  0.0  0.0   0:00.00 migration/0                         
     8 root      20   0       0      0      0 S  0.0  0.0   0:00.00 rcu_bh                              
     9 root      20   0       0      0      0 S  0.0  0.0   0:00.00 rcuob/0                             
    10 root      20   0       0      0      0 S  0.0  0.0   0:00.00 rcuob/1                             
    11 root      20   0       0      0      0 S  0.0  0.0   0:00.00 rcuob/2
  • 进程的状态:s列表示进程的状态
    • R:是Running或者Runnable的缩写,标识进程在cpu的就绪队列汇总,正在运行或者正在等待运行
    • D:是Disk Sleep的缩写,也就是不可中断状态睡眠(Uinterruptiable Sleep),表示进程正在跟硬件交互,并且交互过程不允许被其他进程或中断打断
    • Z: 是Zoombie的缩写,表示僵尸进程,也就是进程实际上已经结束了,但是父进程没有回收它的资源
    • S:是Interruptiable Sleep的缩写,也就是可中断状态睡眠,表示进程因为等待某个时间而被系统挂起。当进程等待的事件发生时,它会被唤醒并进入R状态
    • I:是idle的缩写,也就是空闲状态,用在不可中断睡眠的内核线程上。
    • T或者t:就是stopped或Traced的缩写,表示进程处于暂停或者跟踪的状态

案例:

 

 
image.png

问题分析:

 

  • 1.第一行的平均负载,过去一分钟、5分钟和15分钟内的平均负载在依次减小,说明平均负载在升高;且1分钟的平均负载已经达到系统的cpu个数,说明系统很可能已经有性能瓶颈
  • 2.第二行的Tasks,有1个正在运行的进程,但僵尸进程比较多,而且还在不停增加,说明有子进程在退出时没被清理
  • 3.接下来看两个cpu的使用率情况,用户cpu和系统cpu使用率都不高,但iowait分别是60%和95%,不正常
  • 4.有两个进程处于D状态,他们可能在等待I/O,但光凭这里不确定使它们导致的iowait升高

总结:
1、iowait太高,导致系统平均负载升高,达到了系统cpu的个数
2、僵尸进程在不断增多,说明有程序没能正确清理子进程的资源。

注:无法模拟上图的压力环境,所以只是介绍方法:

iowait分析

dstat
dstat可以同时查看cpu和I/O这两种资源的使用情况,便于对比分析;往往iowait升高,都伴随很高的读写请求

#每隔2秒加载1次,共加载10次
root@localhost ~]# dstat 2 10
You did not select any stats, using -cdngy by default.
----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system--
usr sys idl wai hiq siq| read  writ| recv  send|  in   out | int   csw 
  1   1  98   0   0   0|4570B  335k|   0     0 |   0     1B|  42    26k
  0   0 100   0   0   0|   0     0 |  60B  582B|   0     0 |  24    34 
  0   1 100   0   0   0|   0     0 |  60B  330B|   0     0 |  23    33 
  0   0 100   0   0   0|   0     0 |  60B  330B|   0     0 |  23    32 

pidstat
pidstat加上-d参数可以查看进程的资源使用情况,输出I/O使用情况

[root@localhost ~]# pidstat -d -p 80309 1 3
Linux 3.10.0-327.el7.x86_64 (localhost.localdomain)     02/13/23    _x86_64_    (1 CPU)

22:31:29      UID       PID   kB_rd/s   kB_wr/s kB_ccwr/s iodelay  Command
22:31:30        0     80309      0.00      0.00      0.00       0  sysbench
22:31:31        0     80309      0.00      0.00      0.00       0  sysbench
22:31:32        0     80309      0.00      0.00      0.00       0  sysbench
Average:        0     80309      0.00      0.00      0.00       0  sysbench
  • kB_rd表示每秒读的kb数,kB_wr表示每秒写的kb数,iodelay表示I/O的延迟。

strace
使用上面的工具发现造成iowait高的进程后,我们知道进程想要访问磁盘,就必须使用系统调用,所以接下来,重点就是找出app进程的系统调用了
使用strace跟踪进程系统调用

#-p 进程id
[root@localhost ~]# strace -p 847

perf
上面的strace找不到也可以使用perf

#实时查看
[root@localhost ~]#perf top -g -p pid
#生成报告查看
[root@localhost ~]#perf record -g
[root@localhost ~]#perf report
Samples: 5K of event 'cpu-clock', Event count (approx.): 1370500000                                      
  Children      Self  Command        Shared Object            Symbol                                     
+   34.80%     0.00%  stress-ng-cpu  [unknown]                [.] 0x41d8facbc1336cc9
+   34.80%     0.00%  stress-ng-cpu  [unknown]                [.] 0x00007f595a7dce28
+    9.56%     9.47%  stress-ng-cpu  stress-ng                [.] stress_cpu_crc16
+    7.04%     7.02%  stress-ng-cpu  stress-ng                [.] stress_cpu_correlate
+    6.71%     6.60%  stress-ng-cpu  stress-ng                [.] stress_cpu_dither
+    5.31%     5.29%  stress-ng-cpu  libm-2.17.so             [.] __kernel_rem_pio2
+    5.25%     5.22%  stress-ng-cpu  stress-ng                [.] stress_cpu_matrix_prod
+    4.91%     4.91%  stress-ng-cpu  stress-ng                [.] hanoi
+    4.62%     4.56%  stress-ng-cpu  libm-2.17.so             [.] __ieee754_log_avx
+    4.36%     4.32%  stress-ng-cpu  libm-2.17.so             [.] __ieee754_exp_avx
  • 找到相关进程,按回车键展开调用栈,就可以得到其调用关系,然后在具体分析其造成iowait升高的原因(可能是进程绕过系统缓存,对磁盘进行直接读写)

僵尸进程

pstree
处理僵尸进程问题,僵尸进程是因为父进程没有回收子进程的资源而出现的,那么要解决他们,就要找到其父进程,使用pstree命令:

#-a 表示输出命令行选项
#p表示pid
#s表示指定进程的父进程
[root@localhost ~]# pstree -aps 80363
systemd,1 --switched-root --system --deserialize 20
  └─sshd,1501 -D
      └─sshd,79264
          └─sshd,79268
              └─bash,79269
                  └─su,79308 - root
                      └─bash,79312
                          └─stress-ng,80362 -c 1
                              └─stress-ng-cpu,80363 -c 1
  • 找到其父进程80362,就可以去针对检查代码是有问题没了

与[转帖]系统中出现大量不可中断进程和僵尸进程相似的内容:

[转帖]系统中出现大量不可中断进程和僵尸进程

https://www.jianshu.com/p/f76c54cd00fe 注:本文只是为了辅助自己分析而记录首先我们来分析一下top命令: [root@localhost ~]# top top - 19:24:45 up 1 day, 6:05, 3 users, load average:

【转帖】【奇技淫巧】Linux | 安全保障防火墙-iptables

虽然说Linux在安全方面确实相当于windows要更加可靠一些,但一般使用其作为服务器的我们,也不能大意,也是需要严格限制网络传输过程中的出入规则。上篇文章我们有聊到统计网络的信息,这篇文章来学习一下比较著名的防火墙iptables,它已经有十几年的历史了,算是不折不扣的Linux系统的功臣。 一

[转帖]编译实战 | 手摸手教你在Windows环境下运行Redis6.x

原创:微信公众号 码农参上,欢迎分享,转载请保留出处。 哈喽大家好啊,我是没事就愿意瞎捣鼓的Hydra。 不知道有没有小伙伴像我一样,平常开发中用的是windows操作系统,有时候想装点什么软件,一看只支持linux系统,无奈要么启动虚拟机、要么装在云服务器上。 这不前几天又是这样,刚想用一下Red

[转帖]TiDB + TiFlash : 朝着真 HTAP 平台演进

https://zhuanlan.zhihu.com/p/80495479 作者介绍:韦万,PingCAP 数据库研发工程师,主要领域是数据库的存储引擎研发,以及系统性能优化。 一、为什么我们需要 HTAP 数据库? 在互联网浪潮出现之前,企业的数据量普遍不大,特别是核心的业务数据,通常一个单机的数

[转帖]系统明明有很多内存,却无法分配出一片大块内存?(一文搞定!)

https://zhuanlan.zhihu.com/p/614898901 什么是内存碎片? 内存碎片在Linux很早的时候就已经出现了,了解早期内存碎片产生的历史,有利于我们对它的理解。 假设现在有一块32MB大小的内存,一开始操作系统使用了最小的一块——4MB大小,剩余的内存要留给4个进程使用

[转帖] GC耗时高,原因竟是服务流量小?

原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处。 简介# 最近,我们系统配置了GC耗时的监控,但配置上之后,系统会偶尔出现GC耗时大于1s的报警,排查花了一些力气,故在这里分享下。 发现问题# 我们系统分多个环境部署,出现GC长耗时的是俄罗斯环境,其它环境没有这个问题,

[转帖]线上Java 高CPU占用、高内存占用排查思路

一、前言 处理过线上问题的同学基本上都会遇到系统突然运行缓慢,CPU 100%,以及Full GC次数过多的问题。当然,这些问题的最终导致的直观现象就是系统运行缓慢,并且有大量的报警。本文主要针对系统运行缓慢这一问题,提供该问题的排查思路,从而定位出问题的代码点,进而提供解决该问题的思路。 二、分析

[转帖]三星研发出首个基于存算一体技术的GPU大型计算系统 (收录于存算一体芯片赛道投资融资分析)

https://zhuanlan.zhihu.com/p/591850021 陈巍谈芯:产业巨头已经打通存算一体技术的落地通道,存算一体技术加快应用部署。与未使用HBM-PIM(HBM-PIM GPU v.s. HBM GPU)相比,仅用20nm工艺就使7nm集群计算性能提升了2.5倍。这个思路也是

[转帖] jq实现json文本对比

原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处。 简介# 近期,为了给一个核心系统减负,组内决定将一些调用量大的查询接口迁移到另一个系统,由于接口逻辑比较复杂,为了保证接口逻辑一致,我们决定将一周内的请求参数在两个接口重放,并用脚本校验两边接口的响应结果。接口返回数据是

[转帖]api网关介绍

https://www.cnblogs.com/jackssybin/p/16282788.html 1.什么是网关 API网关是一个系统的唯一入口。是众多分布式服务唯一的一个出口。它做到了物理隔离,内网服务只有通过网关才能暴露到外网被别人访问。简而言之:网关就是你家的大门 2.提供了哪些功能 身份