D死锁和R死锁

作者:【吴业亮】

博客:https://wuyeliang.blog.csdn.net/

死锁
  死锁是指多个进程(线程)因为长久等待已被其他进程占有的的资源而陷入阻塞的一种状态。当等待的资源一直得不到释放,死锁会一直持续下去。死锁一旦发生,程序本身是解决不了的,只能依靠外部力量使得程序恢复运行,例如重启,开门狗复位等。

Linux 提供了检测死锁的机制,主要分为 D 状态死锁和 R 状态死锁。

D 状态死锁
进程等待 I/O 资源无法得到满足,长时间(系统默认配置 120 秒)处于 TASK_UNINTERRUPTIBLE 睡眠状态,这种状态下进程不响应异步信号(包括 kill -9)。如:进程与外设硬件的交互(如 read),通常使用这种状态来保证进程与设备的交互过程不被打断,否则设备可能处于不可控的状态。对于这种死锁的检测 Linux 提供的是 hung task 机制。触发该问题成因比较复杂多样,可能因为 synchronized_irq、mutex lock、内存不足等。D 状态死锁只是局部多进程间互锁,一般来说只是 hang 机、冻屏,机器某些功能没法使用,但不会导致没喂狗而系统死机。
在这里插入图片描述

R 状态死锁
进程长时间(系统默认配置 60 秒)处于 TASK_RUNNING 状态垄断 CPU 而不发生切换,一般情况下是进程关抢占或关中断后长时候执行任务、死循环,此时往往会导致多 CPU 间互锁,整个系统无法正常调度,导致喂狗线程无法执行,无法喂狗而最终看门狗复位的重启。该问题多为原子操作,spinlock 等 CPU 间并发操作处理不当造成。
在这里插入图片描述
参考:
https://blog.csdn.net/luckyapple1028/article/details/51931210
https://blog.csdn.net/luckyapple1028/article/details/51932414

### 如何查询MySQL中的历史死锁记录及分析 在MySQL中,可以通过`INFORMATION_SCHEMA.INNODB_TRX`、`INFORMATION_SCHEMA.INNODB_LOCKS`以及`INFORMATION_SCHEMA.INNODB_LOCK_WAITS`表来获取当前存在的定信息[^1]。然而,这些表格仅提供实时数据,并不保存历史记录。 对于历史死锁信息的查询,可以利用MySQL自带的功能——通过设置参数`innodb_print_all_deadlocks=ON`使得所有发生的死锁都被记录到错误日志文件中[^3]。一旦启用了此选项,在每次检测到死锁之后都会自动生成详细的报告并存储于指定的日志位置。这有助于后续对过去一段时间内所遇到的问题进行回顾性调查。 另外,还可以借助第三方工具如Percona Toolkit中的pt-deadlock-logger命令行实用程序定期轮询服务器并将结果存入专门设计用于收集此类事件的数据表里;或者采用监控平台集成插件实现自动化采集与可视化展示功能[^2]。 为了更方便地解析理解来自官方渠道或其他途径获得的文字描述形式的日志条目,下面给出一段Python脚本作为例子: ```python import re from datetime import datetime def parse_mysql_deadlock_log(log_content): """Parse MySQL deadlock log content into structured data.""" pattern = r'\n----------'\ r'LATEST\sDEADLOCK\sINFO.*?'\ r'Transaction\s(\d+),\sACTIVE\s\d+\sms,\sid=\d+,'\ r'.*?mysql tables in use (\d+),'\ r'\stransactions:\n(.*)' matches = re.findall(pattern, log_content, flags=re.DOTALL) parsed_logs = [] for match in matches: trx_id, table_count, transactions_info = match # Extract transaction details using regex or string operations. entry = { 'transaction_id': int(trx_id), 'tables_involved': int(table_count), 'timestamp': str(datetime.now()), # Replace with actual timestamp extraction logic, 'transactions_details': transactions_info.strip() } parsed_logs.append(entry) return parsed_logs ``` 该函数接受原始日志文本字符串输入,并返回包含结构化字段字典列表的结果集。注意这里的时间戳部分需要依据实际情况调整为提取真实的日期时间值而不是简单地使用当前时刻替代。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值