当前位置: 首页 > news >正文

postgresql僵尸进程的处理思路

简介

僵尸进程(zombie process)是指一个已经终止但仍然在进程表中保留条目的进程。正常情况下,当一个进程完成执行并退出时,操作系统会通过父进程调用的wait()或waitpid()系统调用来收集该子进程的退出状态。如果父进程未及时调用这些函数,子进程的状态信息就无法从内核中移除,导致进程在内核中以“僵尸”状态存在。此状态下的子进程,使用kill -9 就是“鞭尸”,是无法移除僵尸进程的

僵尸进程的主要特点是它们不再消耗CPU或内存资源,因为其已终止,只保留一个进程号(PID)和少量的状态信息。然而,过多的僵尸进程会使系统的进程号资源耗尽,阻止新进程的创建,影响系统稳定性。

产生僵尸进程的常见原因包括:父进程未能及时俘获到子进程得退出信息,并对其进程信息进行处理,导致子进程进入、“僵尸状态”。本文以postgres 进行举例

“t” 状态解决办法

使用gdb挂住postgres(主进程),此时数据库得主进程处于t状态。将子进程kill 掉此时,子进程就会变成僵尸状态。
image.png
此状态下现存的客户端进程会一直保持写入状态。Wal文件持续增长中。此时主进程状态处于t状态。

ps -o pid,ppid,cmd,state,etime -p 1797

t状态表示进程被跟踪并停止(Traced and stopped)
使用ps -ef |grep 1797查看调用postgres(主进程的程序)的进程 ,将其kill 掉,postgresql运行会恢复正常。子进程会被重新拉起。此时主进程状态会恢复到S状态。
image.png

“T” 状态解决办法

“T”状态 表示进程被停止。
使用kill -19 1797 stop掉主进程,然后kill -9杀掉所有的子进程。模拟僵尸僵尸状态
image.png
此时父进程状态为T 状态,kill -19 之后,父进程将无法再处理子进程的退出消息。此时对父进程发送继续进程的指令kill -18 ,此时父进程会重新运行,并进行处理消息列表的信号。
image.png

“Z” 僵尸状态

进程已经终止,但父进程尚未回收它的退出状态,导致该进程变成僵尸进程。
image.png,当然在以上的两个状态中,子进程也是处于“Z”状态,但是我们可以通过父进程进行判断僵尸进程的原因,使用危害较小的方式进行处理,如果此时的父进程state处于正常状态,但是子进程处于“Z”状态,此时引发原因就变得难以追踪。
模拟父进程没通过wait(),waipid()进行处理子进程退出信息,引发僵尸进程
编辑脚本zombie_process.py
使用一下指令进行调用

python3 zombie_process.py

脚本内容如下:

import os
import timedef create_zombie():pid = os.fork()  # 创建子进程if pid > 0:# 父进程:故意不处理子进程的退出状态print(f"父进程 PID: {os.getpid()}")print(f"子进程 PID: {pid}")print("子进程变为僵尸进程(父进程不回收子进程)。")time.sleep(60)  # 父进程休眠,保持子进程为僵尸进程elif pid == 0:# 子进程print(f"子进程 PID: {os.getpid()} 终止")os._exit(0)  # 子进程结束if __name__ == "__main__":create_zombie()

image.png
此时子进程处于“Z”状态,但是父进程确实正常state 状态,此时需要。kill父进程,让其由systemd一号进程进行接管,编处理僵尸进程的退出状况。

http://www.lryc.cn/news/450682.html

相关文章:

  • Springboot 练习
  • ISA-95制造业中企业和控制系统的集成的国际标准-(3)
  • MATLAB中图形导出功能的详细使用指南
  • 助农小程序|助农扶贫系统|基于java的助农扶贫系统小程序设计与实现(源码+数据库+文档)
  • SpringBoot上传图片实现本地存储以及实现直接上传阿里云OSS
  • git clone或repo init 时报错:fatal: 协议错误:错误的行长度 xxx
  • SpringBoot2(Spring Boot 的Web开发 springMVC 请求处理 参数绑定 常用注解 数据传递 文件上传)
  • 成都网安周暨CCS2024 | 大模型安全与产业应用创新研讨活动成功举办
  • React 解释常见的 hooks: useState / useRef / useContext / useReducer
  • telnet发送邮件教程:安全配置与操作指南?
  • 超强大的 Nginx 可视化管理工具
  • Android 安装应用-提交阶段之后剩下的操作
  • buuctf [ACTF2020 新生赛]Include
  • JS使用MutationObserver接口来监听DOM的更新
  • 图解C#高级教程(三):泛型
  • 240930_CycleGAN循环生成对抗网络
  • ide 使用技巧与插件推荐
  • 【node】 cnpm|npm查看、修改镜像地址操作 换源操作
  • 大数据-152 Apache Druid 集群模式 配置启动【下篇】 超详细!
  • IDE 使用技巧与插件推荐全面指南
  • java-快速将普通main类变为javafx类,并加载自定义fxml
  • 数据结构之——单循环链表和双向循环链表
  • Git Stash: 管理临时更改的利器
  • ELK--收集日志demo
  • Redis的主要特点及运用场景
  • 与我免费ai书童拆解《坚持》创作历程
  • 昇思MindSpore进阶教程--下沉模式
  • Hive SQL业务场景:连续5天涨幅超过5%股票
  • Java 如何从图片上提取文字
  • C#进阶-读写Excel常用框架及其使用方式