当前位置: 首页 > Linux

【人间995】【Linux性能优化】系统中出现大量不间断进程和僵尸进程怎么办?

时间:2023-04-06 21:52:09 Linux

哔前言一直践行费曼学习法了解系统知识原理掌握性能分析工具多练习,多思考,多提问仅记录个人学习记录,欢迎指正1.进程状态R[Running/Runnable]:进程runningorwaitingtorunD[DiskSleep]:不可中断状态睡眠,一般表示进程正在与硬件交互,交互过程中不允许被其他进程打断或中断Z[Zombie]僵尸进程,也就是进程结束了,父进程还没有回收它的资源。S[InterruptibleSleep]可中断状态睡眠,表示进程因为等待事件而被系统挂起。当进程等待事件发生时,会被唤醒,进入R状态I[Idle]空闲状态,在不间断睡眠的内核线程上使用。D状态会导致loadaverage增加,I状态的过程不会。T/t[Stopped/Traced]进程处于挂起或traced状态[Trackingstate--特殊挂起状态]X[Dead]进程已经死亡,top/ps命令无法观察到死亡进程。交互时正常情况下:不可中断状态会在很短的时间内结束。这时,短期不可中断状态进程,我们一般可以忽略系统/硬件故障:进程会保持长期不可中断状态。需要注意是否出现系统I/O性能问题3.僵尸进程一般情况下:父进程创建子进程,然后通过系统调用等待子进程结束,回收子进程资源,并在子进程结束时,向父进程发送sigChld信号,父进程注册sigChld信号处理函数,异步回收资源。异常情况下:父进程不处理子进程,或者子进程执行速度比父进程快,很容易导致子进程成为僵尸进程。4.总结4.1.大量不间断进程和僵尸进程处理方式:iowait过高,导致平均负载增加,负载达到系统cpu的僵尸进程数量不断增加查看发现,当iowait上升时,磁盘读请求上升定位磁盘读进程,使用top命令查看不间断状态下进程的PID,查看对应进程的磁盘读写状态,使用pidstat-d查看I/O用法,发现处于不间断状态的进程都没有在进行磁盘读写。继续使用pidstat命令查看所有进程的I/O状态。可以定位到磁盘读写进程。使用strace查看进程的系统调用strace-ppsaux|grep发现进程处于Z状态,已经变成僵尸状态。如果top和pidstat都找不到问题,使用事件记录动态跟踪工具perfrecord&perfreport4.3。Zombieprocess僵尸进程的产生是因为父进程没有回收子进程的资源,所以可以使用pstree查看父进程,进而查看父进程的源码。案例实践1.运行案例应用dockerrun--privileged--name=app-itdfeisky/app:iowait2。输入ps命令,查看案例是否正常启动。命令:psaux|grep/appS可中断睡眠状态D不可中断睡眠状态Ss+,其中s表示该进程是会话领导进程;+表示前台进程组进程组:一组相互关联的进程,比如每个子进程都是父进程所属组的成员会话:指一个或多个进程组共享同一个控制终端3.使用top命令查看进程状态ioWaitpstat110#每1秒输出10组top命令,观察D进程的状态pidstat-d输出I/O使用情况。因此,我们从pidstat的输出中获取进程的PID号,比如6082,然后在终端运行strace命令,通过-p参数指定PID号:$strace-p97741strace:attach:ptrace(PTRACE_SEIZE,97741``):Operationnotpermitted这里有个奇怪的错误,strace命令失败,命令报错是没有权限。按理说,我们所有的操作都已经以root用户运行了,为什么还是没有权限呢?你也可以先想一想,遇到这种情况你会怎么处理?一般遇到这种问题,我都会先查看进程的状态是否正常。比如继续在终端运行ps命令,使用grep查找刚才的进程号6082:$psaux|grep97741root977410.00.000pts/0Z+13:430:00[app]使用perfrecord-gperfreport查看recordpstress命令找到父进程