首页 > 系统相关 >linux 性能自我学习 ———— 不可中断进程和僵尸进程 [四]

linux 性能自我学习 ———— 不可中断进程和僵尸进程 [四]

时间:2023-06-02 20:11:06浏览次数:48  
标签:状态 那么 僵尸 中断 app linux 进程

前言

简单介绍一下不可中断进程和僵尸进程。

正文

先来看下进程的状态:

那么这一列的状态是什么呢?

R 是Running 或 Runnable 的缩写, 表示进程在cpu 的就绪队列中,正在运行或者正在等待运行。

D 是disk sleep 的缩写,也就是不可中断睡眠,一般表示进程正在跟硬件交互,并且交互过程不允许其他进程或者中断打断。

Z 是Zombie 的缩写,表示僵尸进程,表示进程已经介绍了,但是父进程还没有回收它的资源

S 是interruptible sleep 缩写,也就是可中断状态睡眠,表示进程因为等待某个事件而被系统挂起。当进程等待的事件发生时, 他会被唤醒并进入R状态

I 是 idle的缩写, 也就是空闲状态,用在不可中断睡眠的内核线程上。前面说了,硬件交互导致不可中断进程用D 表示,但是某些内核线程来说,他们可能实际并没有任何负载,用idle 就是为了区分。

D 状态的进程会导致平均负载升高,i 状态的进程不会。

还有两种状态,一种是T 状态,另外一种是X状态。

X 是状态为死亡,一般看不到。

另外一种是T 状态,表示是stopped 或者 traced 状态。

比如我们进程调试就是T状态,发送一个信号sigstop,然后就会停止。再发送sigcont 信号,这个时候就会继续运行。

该篇的主题是不可中断进程和僵尸进程。

前面结束了,不可中断进程,一般是在进行系统调用。

僵尸进程是怎么样的呢? 僵尸进程在多进程中可能遇到。

正常情况下,当用给进程创建了子进程后,它应该通过系统调用wait() 或者 waitpid() 等待子进程结束,回收子进程资源。

而子进程结束时候,会向父进程发送sigchld信号,所以父进程还可以注册sigchld 信号的畜栏里函数,异步回收资源。

如果父进程没有那么做,或者子进程执行太快。父进程还没来得及处理子进程状态,那么子进程就已经提前推出,那么这个时候子进程就会变成僵尸进程。

通常,僵尸进程持续时间很短,如果父进程一直没有处理子进程的终止,那么就会一直保持运行状态,这个时候就会占用pid 进程号,导致新的进程不能创建。

实验

docker run --privileged --name=app -itd feisky/app:iowait

top 一下:

僵尸进程特别多。

然后我们还发现了,Ss+ 和D+

这个+ 是什么意思呢?

有两个概念。

进程组表示一组相互关联的进程,比如每个子进程都是父进程所在组的成员

会话指共享一个控制终端的一个或者多个进程组。

那么这个时候,我们如何来分析呢?

yum install dstat

当iowait 升高时候,read 会很大,说明iowait 升高跟磁盘的读请求相关,可能是磁盘读导致的。

那么可以使用top 命令,观察d状态的进程。

然后通过pidstat

pidstat -d -p 4344 1 3

发现其并不高。

那么直接用pidstat 查看全部的:

pdistat -d 1 20

发现的确是app导致的。

然后就可以用strace 追踪代码了。

strace -p 6082

这种情况如果是root 用户查看不了的话,那么可能这个进程不存在或者已经Z状态了。

那么这个时候可以使用perf来搞定。

这个时候你就的确发现其在系统读取了。

那么僵尸进程怎么解决呢?

前面已经发现了僵尸进程了。

那么可以找到其父进程:

pstree -aps 3084

可以看到程序还是app进程了。

然后就可以去检查代码部分了。

下一节linux 软中断。

标签:状态,那么,僵尸,中断,app,linux,进程
From: https://www.cnblogs.com/aoximin/p/17450501.html

相关文章

  • Sysmon 使用查询进程名称获取 DNS 查询日志==》看来早些版本是不支持溯源的!
    浏览器打开的域名: ss的请求:   svchost出去的也有:    系统更新,也是svchost发出去的:   ping的:    nslookup的,看不到:GG!!!    这是一个简单的“pinggoogle.com”命令,导致事件22记录在SysmonWindows事件日志中:它可以监视几乎任何支持网络的Windows客户端软件......
  • archlinux中如何添加第三方库位置
    现象linux中有部分软件在安装或编译时,并未将需要的库放在标准位置,如:/usr/lib上,导致部分程序不能正确工作。解决办法在/etc/ld.so.conf.d目录下新建xxx.conf文件,这里xxx表示任意的文件名,在其中写入某个库所在的全路径,如:/usr/local/lib,/usr/lib/R/lib等等。然后运行:sudoldconfi......
  • Linux 编译安装 php 扩展 amqp
    这里最大的坑,就是  rabbitmq-c和amqp扩展版本不符,导致的各种bug。其他也没啥,这里简单记录下:我这里使用的环境:php7.4  、rabbitmq-c0.7.1、amqp1.9.4. 安装rabbitmq-c(注意记住你的安装位置,下一步要用)wgethttps://github.com/alanxz/rabbitmq-c/releases/download......
  • linux 数组
    目录一、数组  1.定义数组  2.用索引定义数组  3.数组长度    4.数据类型二、遍历三、数组切片四、数组替换五、数组删除 六、追加数组 七、数组传参八、冒泡排序   一、数组 概念:一次性定义多个变量1.定义数组......
  • (三) linux离线克隆conda
    项目场景:我们用Anaconda创建了虚拟环境,并且想通过U盘拷贝的方式实现虚拟环境的迁移,可以通过虚拟环境打包的方式来实现。迁移环境打包1.首先要安装一个打包工具condainstall-cconda-forgeconda-pack2.进入到开发环境进入到开发环境中去sourceactivate****或者con......
  • Rabbitmq在linux服务器的安装步骤
    Linux系统:CentOS7.x(如果是CentOS8.x的话,需要修改下面两个环境版本号中的el7为el8)Erlang:erlang-22.3.4.12-1.el7.x86_64.rpmRabbitMQ:rabbitmq-server-3.8.13-1.el7.noarch.rpm 1安装erlang Linux系统:CentOS7.x(如果是CentOS8.x的话,需要修改下面两个环境版本号中的el7为e......
  • Linux 安装 mongodb
    1.下载wgethttps://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-6.0.6.tgz2.安装依赖yuminstalllibcurlopensslxz-libs3.解压tar-zxvfmongodb-linux-x86_64-rhel70-6.0.6.tgz4.复制文件并改名mvmongodb-linux-x86_64-rhel70-6.0.6/usr/local/mo......
  • 深入剖析Linux IO原理和几种零拷贝机制的实现
    https://www.cnblogs.com/lsgxeva/p/11619464.html来源 https://zhuanlan.zhihu.com/p/83398714零壹技术栈   公众号【零壹技术栈】前言零拷贝(Zero-copy)技术指在计算机执行操作时,CPU不需要先将数据从一个内存区域复制到另一个内存区域,从而可以减少上下文切......
  • 恒创科技:提高国外云主机性能(Linux系统)的 4 个步骤
    ​随着外贸业务的兴起及不断发展,越来越多的企业和个人开始使用国外VPS云主机来部署自己的应用程序和网站。其中,Linux系统的国外VPS云主机创造了众多的可能性和功能,但仍有一些方法可以进一步提高LinuxVPS的整体性能。下面我们将通过简单的4个步骤告诉您如何实现它。......
  • [linux]undefined reference to `__gxx_personality_v0'
    linux程序 #include#include#includeintcount=0;voidctrl_c_count(int);intmain(void){intc;void(*old_handler)(int);old_handler=signal(SIGINT,ctrl_c_count);while((c=getchar()!=''));printf("Ctrl_Ccount=%d",count);......