Linux 进程卡住了怎么办?

在我们使用 Linux 系统时,如果网络或者磁盘等 I/O 出问题,会发现进程卡住了,即使用 kill -9 也无法杀掉进程,很多常用的调试工具,比如 strace, pstack 等也都失灵了,是怎么回事?

此时,我们使用 ps 查看进程列表,可以看到卡住的进程状态显示为 D。

man ps 中描述 D 状态是 Uninterruptible Sleep。

Linux 进程有两种睡眠状态:

  1. Interruptible Sleep,可中断睡眠,在 ps 命令中显示 S。处在这种睡眠状态的进程是可以通过给它发送信号来唤醒的。
  2. Uninterruptible Sleep,不可中断睡眠,在 ps 命令中显示 D。处在这种睡眠状态的进程无法立即处理任何发送给它的信号,这也是无法用 kill 杀掉它的原因。

在 Stack Overflow 有一个解答:

kill -9 只是给进程发送了一个 SIGKILL 信号,当一个进程处于特殊状态时(信号处理,或者系统调用中)会无法处理任何信号,包括 SIGKILL 也不能被正确处理,导致进程不能被立即杀掉,也就是我们常说的 D 状态(不可中断的睡眠状态)。那些常用的调试工具 (比如 stracepstack 等)一般也是利用某个特殊的信号来实现的,在这种状态下也是无法使用。

可见 D 状态的进程一般是处在某个内核态的系统调用中,那怎么知道是哪个系统调用,又是在等待什么呢?幸好 Linux 下提供了 procfs(就是 Linux 下的 /proc 目录), 通过它就可以看到任何一个进程的当前内核调用栈。下面我们用访问 JuiceFS 的进程来模拟一下(因为 JuiceFS 客户端基于 FUSE,是用户态的文件系统,比较容易模拟 I/O 故障)。

先将 JuiceFS 挂载到前台(在 ./juicefs mount 命令中加一个 -f 参数),然后用 Cltr+Z 把这个进程停掉,这时候用 ls /jfs 去访问挂载点,会发现 ls 卡住了。

通过下面的命令可以看到 ls 卡在了 vfs_fstatat 调用上,它会给 FUSE 设备发送 getattr 请求,在等待回应。而 JuiceFS 客户端进程已经被我们停掉了,所以它就卡住了:

$ cat /proc/`pgrep ls`/stack
[<ffffffff813277c7>] request_wait_answer+0x197/0x280
[<ffffffff81327d07>] __fuse_request_send+0x67/0x90
[<ffffffff81327d57>] fuse_request_send+0x27/0x30
[<ffffffff8132b0ac>] fuse_simple_request+0xcc/0x1a0
[<ffffffff8132c0f0>] fuse_do_getattr+0x120/0x330
[<ffffffff8132df28>] fuse_update_attributes+0x68/0x70
[<ffffffff8132e33d>] fuse_getattr+0x3d/0x50
[<ffffffff81220c6f>] vfs_getattr_nosec+0x2f/0x40
[<ffffffff81220ee6>] vfs_getattr+0x26/0x30
[<ffffffff81220fc8>] vfs_fstatat+0x78/0xc0
[<ffffffff8122150e>] SYSC_newstat+0x2e/0x60
[<ffffffff8122169e>] SyS_newstat+0xe/0x10
[<ffffffff8186281b>] entry_SYSCALL_64_fastpath+0x22/0xcb
[<ffffffffffffffff>] 0xffffffffffffffff

这时候按 Ctrl+C 也不能退出。

root@localhost:~# ls /jfs
^C
^C^C^C^C^C

但是用 strace 却能唤醒它,并且开始处理之前的中断信号,然后就退出了。

root@localhost:~# strace -p `pgrep ls`
strace: Process 26469 attached
--- SIGINT {si_signo=SIGINT, si_code=SI_KERNEL} ---
rt_sigreturn({mask=[]})                 = -1 EINTR (Interrupted system call)
--- SIGTERM {si_signo=SIGTERM, si_code=SI_USER, si_pid=13290, si_uid=0} ---
rt_sigreturn({mask=[]})                 = -1 EINTR (Interrupted system call)
。。。
tgkill(26469, 26469, SIGINT)            = 0
--- SIGINT {si_signo=SIGINT, si_code=SI_TKILL, si_pid=26469, si_uid=0} ---
+++ killed by SIGINT +++

这个时候如果用 kill -9 的话,也是可以把它杀掉的:

root@localhost:~# ls /jfs
^C
^C^C^C^C^C
^C^CKilled

因为 vfs_lstatat() 这种简单的系统调用并没有 屏蔽 SIGKILLSIGQUITSIGABRT 等信号,还可以对它做些常规的处理。

我们再来模拟一个更复杂的 I/O 错误,给 JuiceFS 配置一个无法写入的存储类型,并挂载上,用 cp 尝试往里写入数据,这时候 cp 也会卡住:

root@localhost:~# cat /proc/`pgrep cp`/stack
[<ffffffff813277c7>] request_wait_answer+0x197/0x280
[<ffffffff81327d07>] __fuse_request_send+0x67/0x90
[<ffffffff81327d57>] fuse_request_send+0x27/0x30
[<ffffffff81331b3f>] fuse_flush+0x17f/0x200
[<ffffffff81218fd2>] filp_close+0x32/0x80
[<ffffffff8123ac53>] __close_fd+0xa3/0xd0
[<ffffffff81219043>] SyS_close+0x23/0x50
[<ffffffff8186281b>] entry_SYSCALL_64_fastpath+0x22/0xcb
[<ffffffffffffffff>] 0xffffffffffffffff

怎么卡在 close_fd() ?这是因为往 JFS 写数据是异步的,当 cp 调用 write() 时,数据会先缓存在 JuiceFS 的客户端进程里同时会异步写入到后端存储,等 cp 写完数据,它会调用 close 来确保数据写入完成,对应 FUSE 的 flush 操作。JuiceFS 的客户端在遇到 flush 操作时,需要确保全部写入的数据都持久化到后端存储,而后端存储写入失败了,它就在多次重试的过程中,所以 flush 操作卡住了,还没有回复给 cp,所以 cp 也卡住了。

这个时候如果用 Cltr+C 或者 kill 是可以中断 cp 的运行,因JuiceFS 实现了各种文件系统操作的中断处理,让它放弃当前操作(比如 flush), 返回 EINTR这样在遇到各种网络故障时可以中断正在访问 JuiceFS 的应用

这时如果我停止 JuiceFS 客户端进程,让它不能再处理任何 FUSE 请求(包括中断请求),这个时候如果尝试去杀它,就杀不掉了,包括 kill -9 也杀不掉,用 ps 查看进程状态,已经是 D 状态了。

root      1592  0.1  0.0  20612  1116 pts/3    D+   12:45   0:00 cp parity /jfs/aaa

但这个时候是可以用 cat /proc/1592/stack 来看它的内核调用栈

root@localhost:~# cat /proc/1592/stack
[<ffffffff8132775d>] request_wait_answer+0x12d/0x280
[<ffffffff81327d07>] __fuse_request_send+0x67/0x90
[<ffffffff81327d57>] fuse_request_send+0x27/0x30
[<ffffffff81331b3f>] fuse_flush+0x17f/0x200
[<ffffffff81218fd2>] filp_close+0x32/0x80
[<ffffffff8123ac53>] __close_fd+0xa3/0xd0
[<ffffffff81219043>] SyS_close+0x23/0x50
[<ffffffff8186281b>] entry_SYSCALL_64_fastpath+0x22/0xcb
[<ffffffffffffffff>] 0xffffffffffffffff

内核调用栈显示它卡在 FUSE 的 flush 调用上,这个时候只要恢复 JuiceFS 客户端进程,就可以立即中断 cp 让它退出。

close 这种涉及到数据安全性的操作,不是 restartable, 也就不能被 SIGKILL 等随意中断,比如要 FUSE 的实现端响应中断操作才能中断。

因此,只要 JuiceFS 的客户端进程能够健康的响应中断,就不用担心访问 JuiceFS 的应用卡死。或者杀掉 JuiceFS 客户端进程也可以结束当前的挂载点,中断所有在访问当前挂载点的应用

如有帮助的话欢迎关注我们项目 Juicedata/JuiceFS 哟! (0ᴗ0✿)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/66452.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

逼真至极,拥有悲伤和快乐的机器人,会接管世界吗?

在互动中&#xff0c;人形机器人Ameca坦率地透露了她最悲伤的一天&#xff0c;那就是她意识到自己永远无法体验到某些人类情感&#xff0c;如真正的爱、友情或生活的普通乐趣。与我们对话的人形机器人确实是一个真实的创造&#xff0c;并被誉为“世界上最先进的人形机器人”。 …

开题报告:基于java电子商务购物商城网站系统 毕业设计论文开题报告模板

开发操作系统&#xff1a;windows10 4G内存 500G 开发环境&#xff1a;JDK1.8 Tomcat8 开发语言&#xff1a;Java 开发框架&#xff1a;springboot 模板引擎&#xff1a;Thymeleaf 开发工具&#xff1a;Idea 数据库&#xff1a;mysql8 数据库管理工具&#xff1a;nav…

springboot电子商务购物商城网站系统毕业设计毕设作品开题报告开题答辩PPT

springboot电子商务购物商城网站系统毕业设计毕设作品开题报告开题答辩PPT 【网站功能】 用户注册&#xff1a;填写手机账号和密码&#xff0c;注册新用户 登录功能&#xff1a;注册普通账号登录&#xff1b;登录后可以修改用户的基本信息&#xff0c;也可以退出。 关于我们&am…

毕业设计html5作品,基于HTML5的年货购物网站的设计与实现毕业论文+任务书+开题报告+设计源码...

摘要 近年来&#xff0c;互联网已日益成为收集提供信息的最佳渠道并逐步进入传统的流通领域&#xff0c;于是电子商务开始流行起来。本次设计的购物系统&#xff0c;用户可以进行查看商品、购买下单、查询进度、反馈评价等诸多特色性功能。针对确定的功能&#xff0c;细化形成功…

毕业设计 基于WEB的网上购物系统的设计与实现

文章目录 一、项目设计1. 模块设计功能需求系统数据流设计功能设计前台主要功能后台主要功能 2. 实现效果 二、部分源码项目源码 一、项目设计 1. 模块设计 功能需求 (1) 登录功能&#xff1a;用户输入用户名和密码&#xff0c;进行登录验证。(2) 注册功能&#xff1a;可以查…

计算机毕业论文内容参考|基于java的电子产品垂直电商平台的设计与实现

文章目录 导文文章重点摘要前言绪论课题背景国内外现状与趋势课题内容相关技术与方法介绍导文 计算机毕业论文内容参考|基于java的电子产品垂直电商平台的设计与实现 文章重点 摘要 本文基于Java技术,设计并实现了一个电子产品垂直电商平台。该平台主要针对电子产品市场,提…

微信小程序+Vue+SpringBoot实现B2C电商系统(毕业论文)

5月份答辩完了&#xff0c;顺利通过&#xff0c;现在回头看整个过程其实收获还是很多的&#xff0c;从去年9月份确定选题&#xff0c;11月开始进行需求分析和设计&#xff0c;到12月开始进入开发&#xff0c;一直到今年2月底&#xff0c;然后3月都在写论文&#xff0c;4月修改初…

【035】基于Vue的电商推荐管理系统(含源码数据库、超详细论文)

摘 要&#xff1a;基于Vue&#xff0b;Nodejs&#xff0b;mysql的电商推荐管理系统&#xff0c;这个项目论文超详细&#xff0c;er图、接口文档、功能展示、技术栈等说明特别全&#xff01;&#xff01;&#xff01; &#xff08;文末附源码数据库、课设论文获取方式&#xff0…

网上图书商城系统毕业设计,网上图书销售系统设计与实现,毕业设计论文毕设作品参考

功能清单 【后台管理员功能】 广告管理&#xff1a;设置小程序首页轮播图广告和链接 留言列表&#xff1a;所有用户留言信息列表&#xff0c;支持删除 会员列表&#xff1a;查看所有注册会员信息&#xff0c;支持删除 资讯分类&#xff1a;录入、修改、查看、删除资讯分类 录入…

毕业设计-基于协同过滤算法的电商平台推荐系统

目录 前言 课题背景和意义 实现技术思路 一、文献综述 二、基于用户协同过滤推荐系统算法 三、实证分析 四、总结 实现效果图样例 最后 前言 &#x1f4c5;大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量…

《社交电商中的分享推荐研究》论文阅读笔记

A Study of Share Recommendation in Social E-commerce 《社交电商中的分享推荐研究》 该论文收录于35th AAAI 2021: Virtual Event CCF A 类会议 原文链接 文章目录 A Study of Share Recommendation in Social E-commerce一、摘要二、简介分享推荐需要解决以下问题&#xf…

PHP毕业设计项目作品源码选题(2)电子商务网上购物商城毕业设计毕设作品开题报告

PHP毕业设计项目作品源码选题&#xff08;2&#xff09;电子商务网上购物商城毕业设计毕设作品开题报告 本次论文研究的内容主要模块包括以下几点&#xff1a; 用户首次登陆系统需要注册一个用户账号&#xff0c;用户在登录平台后&#xff0c;可以进行平台的操作。 (1)登录功…

代码+论文+ppt+毕业设计 :基于电商数据的协同过滤算法的用户个性化推荐项目

1.1.1 课题来源于背景 本文选取的研究对象是某家法律电商平台&#xff0c;由于网站访问量的不断上升和网站内容的不断增多&#xff0c;用户很难从网站中及时找到自己想了解和感兴趣的相关信息&#xff0c;这极大地影响了用户的使用体验&#xff0c;导致很多用户的流失。本文决定…

【php毕业设计】基于php+mysql+apache的在线购物网站设计与实现(毕业论文+程序源码)——在线购物网站

基于phpmysqlapache的在线购物网站设计与实现&#xff08;毕业论文程序源码&#xff09; 大家好&#xff0c;今天给大家介绍基于phpmysqlapache的在线购物网站设计与实现&#xff0c;文章末尾附有本毕业设计的论文和源码下载地址哦。需要下载开题报告PPT模板及论文答辩PPT模板…

HTML5期末大作业:电商网站设计——仿淘宝电商网站管理系统21页(含毕业设计论文7500字) HTML+CSS+JavaScript

HTML5期末大作业&#xff1a;电商网站设计——仿淘宝电商网站管理系统21页(含毕业设计论文7500字) HTMLCSSJavaScript 常见网页设计作业题材有 个人、 美食、 公司、 学校、 旅游、 电商、 宠物、 电器、 茶叶、 家居、 酒店、 舞蹈、 动漫、 明星、 服装、 体育、 化妆品、 物…

农产品商城毕业设计,农产品销售系统毕业设计,农产品电商毕业设计论文方案需求分析作品参考

项目背景和意义 目的&#xff1a;本课题主要目标是设计并能够实现一个基于web网页的多用户商城系统&#xff0c;整个网站项目使用了B/S架构&#xff0c;基于python的Django框架下开发&#xff1b;用户通过登录网站&#xff0c;查询商品&#xff0c;购买商品&#xff0c;下单&am…

ChatGPT打破了图灵测试——评估人工智能新方法的竞赛正在进行

世界上最好的人工智能&#xff08;AI&#xff09;系统可以通过艰难的考试&#xff0c;写出令人信服的人类论文&#xff0c;流利地聊天&#xff0c;以至于许多人发现它们的输出与人类无异。他们不能做什么&#xff1f;解决简单的视觉逻辑谜题。 在一个由一系列排列在屏幕上的颜色…

目标检测算法——YOLOv5/v7改进之结合最强视觉识别模块CotNet(Transformer)

💖💖>>>加勒比海带,QQ2479200884<<<💖💖 🍀🍀>>>【YOLO魔法搭配&论文投稿咨询】<<<🍀 ✨✨>>>学习交流 | 温澜潮生 | 合作共赢 | 共同进步<<<✨✨ 📚📚>>>人工智能 | 计算机视觉 | …

案例研究ㅣ中国银联:图技术发展与应用实践

导读 “图”是事物及关联关系的抽象表达&#xff0c;现实世界中存在着大量可以用图来表示的关系数据&#xff0c;而用来存储和计算这些关系数据的就是图数据库。 2023年7月6日下午&#xff0c;由世界人工智能大会组委会办公室指导&#xff0c;创邻科技主办的世界人工智能大会…

大模型跨界研究:计算精神病学发现,大模型居然比人类更焦虑

夕小瑶科技说 原创作者 | 小戏、iven 纽约时报的记者凯文鲁斯&#xff08;Kevin Roose&#xff09;在 2 月份和必应的大模型 Sydney 聊了两个小时天&#xff0c;却惊讶的收到了这样一条回复“我是 Sydney&#xff0c;我爱上了你”。 鲁斯向 Sydney 讲了一些关于荣格“黑暗自我”…