麒麟系统如何优化由于多进程竞争锁导致的死锁

老瑶酱_2645

老瑶酱_2645

2026-09-13

480人浏览

原创

需从锁粒度、持有时间、获取顺序和进程调度四层面干预麒麟系统内核锁死锁,先启用lockdep机制定位环形依赖,再拆分锁、改用rcu、规范加锁顺序、引入超时与可中断锁。

麒麟系统如何优化由于多进程竞争锁导致的死锁

麒麟系统中因多进程频繁争抢同一内核锁(如自旋锁、互斥锁)引发死锁时,需从锁粒度、持有时间、获取顺序和进程调度四个层面切入干预,不能仅依赖重启或kill -9粗暴终止。

定位死锁源头进程与锁对象

执行 dmesg -T | grep -i "deadlock\|lockdep\|possible circular",查看内核是否已启用 lockdep 机制并输出环形依赖路径。若无输出,说明 lockdep 未开启,需重新编译内核或在启动参数中加入 lockdep=1 并重启——【未启用 lockdep 时无法自动检测锁循环,所有后续分析将失去依据】

运行 cat /proc/locks 查看当前全部锁状态,重点关注 type 字段为 ADVISORY 或 FLOCK 的条目,结合 pid 列反查对应进程命令: ps -p PID -o pid,comm,args

缩小锁保护范围并替换为更轻量同步原语

方法一:将全局大锁拆分为 per-CPU 或 per-bucket 锁。例如,原代码中对整个哈希表使用单一 mutex,应改用 struct mutex hash_bucket_lock[NR_CPUS],访问 key 时通过 hash(key) % NR_CPUS 映射到对应锁。

方法二:读多写少场景下,用 rcu_read_lock() + rcu_dereference() 替代读侧 mutex,写侧仍用 mutex 但仅在真正修改结构体指针时加锁——这能直接消除读进程间的锁竞争。

方法三:短临界区(mutex_lock() 替换为 spin_lock(),但必须确保临界区内不调用任何可能引起调度或阻塞的函数(如 copy_to_userkmalloc(GFP_KERNEL)),否则会导致 CPU 占满且不可中断。

统一锁获取顺序并避免嵌套

第一步:列出系统中所有被多个进程共用的锁,按内存地址升序编号(如 &dev->lock → L1,&bus->mutex → L2,&drv->probe_lock → L3)。

Face Swap Online
Face Swap Online

Face Swap Online是一款用于在线替换照片和视频中人脸的 AI 换脸工具。

下载

第二步:强制所有进程按 L1→L2→L3 顺序申请锁,禁止逆序(如先 L3 后 L1)或跳序(如只申请 L2 和 L3 而跳过 L1)。

第三步:在每个锁申请前插入校验宏:lockdep_assert_held(&L1);(若已持 L1 才允许申请 L2),该宏在 lockdep 开启时生效,编译期不产生开销。

注意:驱动 probe 函数中常见隐式嵌套——platform_driver_register() 内部会持 bus->mutex,若 probe 中又调用 device_lock(dev),而 dev 属于该 bus,则构成天然嵌套。此时应改用 device_lock_interruptible(dev),并在返回 -EINTR 时主动释放已持锁后重试。

调整进程实时性与锁超时策略

对持有锁时间超过 2ms 的关键进程(如实时音视频采集线程),用 chrt -f 50 PID 提升为 SCHED_FIFO 调度策略,防止被普通进程抢占导致锁持有时间不可控。

在用户态服务中,所有 pthread_mutex_lock 改为 pthread_mutex_timedlock,并设置 timeout 为 50ms:struct timespec abs_time; clock_gettime(CLOCK_MONOTONIC, &abs_time); abs_time.tv_sec += 0; abs_time.tv_nsec += 50000000;。超时后记录日志并回滚事务,而非无限等待。

内核模块中禁用 mutex_lock(),一律改用 mutex_lock_interruptible(),并在返回 -EINTR 时立即返回错误码,由上层决定重试或降级处理——【直接调用 mutex_lock() 在信号到来时仍会阻塞,是用户态触发内核死锁的常见入口】

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

2025.12.24

1009

20

java多线程相关教程合集
java多线程相关教程合集

本专题整合了java多线程相关教程,阅读专题下面的文章了解更多详细内容。

2026.01.21

343

30

C++多线程相关合集
C++多线程相关合集

本专题整合了C++多线程相关教程,阅读专题下面的的文章了解更多详细内容。

2026.01.21

479

24

C# 多线程与异步编程
C# 多线程与异步编程

本专题深入讲解 C# 中多线程与异步编程的核心概念与实战技巧,包括线程池管理、Task 类的使用、async/await 异步编程模式、并发控制与线程同步、死锁与竞态条件的解决方案。通过实际项目,帮助开发者掌握 如何在 C# 中构建高并发、低延迟的异步系统,提升应用性能和响应速度。

2026.02.06

329

20

C++多线程并发控制与线程安全设计实践
C++多线程并发控制与线程安全设计实践

本专题围绕 C++ 在高性能系统开发中的并发控制技术展开,系统讲解多线程编程模型与线程安全设计方法。内容包括互斥锁、读写锁、条件变量、原子操作以及线程池实现机制,同时结合实际案例分析并发竞争、死锁避免与性能优化策略。通过实践讲解,帮助开发者掌握构建稳定高效并发系统的关键技术。

2026.03.16

193

22

Java 多线程与并发编程实战
Java 多线程与并发编程实战

深入讲解 Java 并发编程体系,涵盖 Thread / Runnable / Callable 线程创建方式、线程生命周期与状态转换、synchronized 同步锁与 Lock/ReentrantLock 显式锁、volatile 可见性保证、ThreadPool 线程池配置与调优(核心参数/拒绝策略)、JUC 并发工具类(CountDownLatch/CyclicBarrier/Semaphore/ConcurrentHashMa

2026.04.17

289

31

C++ 多线程使用教程大全
C++ 多线程使用教程大全

系统讲解 C++11 及后续标准引入的多线程编程能力,涵盖 std::thread 线程创建与生命周期管理、std::mutex / shared_mutex 互斥锁与读写锁、std::condition_variable 条件变量同步、std::atomic 原子操作与内存序(memory_order)、std::future / promise / async 异步任务、线程池的设计与实现、死锁检测与避免策略,帮助开发者编写正确高效

2026.04.28

156

17

Python多线程、多进程与并发编程教程大全
Python多线程、多进程与并发编程教程大全

系统讲解 Python 的并发与并行编程体系,涵盖 GIL 全局解释器锁的原理与影响分析、threading 模块的线程创建/锁/事件/信号量、multiprocessing 模块的进程创建/进程间通信(Queue/Pipe/共享内存)、concurrent.futures 线程池与进程池的统一接口、I/O 密集型与 CPU 密集型任务的方案选择、多线程竞态条件排查与线程安全数据结构、subprocess 子进程管理,帮助开发者根据任务

2026.05.08

154

32

Java 并发编程高级实践
Java 并发编程高级实践

本专题深入讲解 Java 在高并发开发中的核心技术,涵盖线程模型、Thread 与 Runnable、Lock 与 synchronized、原子类、并发容器、线程池(Executor 框架)、阻塞队列、并发工具类(CountDownLatch、Semaphore)、以及高并发系统设计中的关键策略。通过实战案例帮助学习者全面掌握构建高性能并发应用的工程能力。

2025.12.01

503

16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.6万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.1万人学习