ARTICLE · 1040295
Linux 6.12 源码深度剖析: try_to_wake_up
Linux 6.12 源码深度剖析: try_to_wake_up
前阵子排查高并发服务 CPU 暴涨,最后发现根子在 Linux 内核的 try_to_wake_up 函数上。
这函数专门负责把睡眠的任务唤醒。它得抢锁、加内存屏障、挑 CPU,还得防着多核乱序。活儿又杂又重,平时看不出啥,一遇高并发就容易被压垮。
最典型的就是“惊群效应”。比如多个 worker 线程等同一个网络事件,数据一来,内核可能把这一窝线程全叫醒。结果只有一个真有活干,剩下的白折腾一圈,又接着睡。
这一通瞎折腾代价极大。大量线程同时抢锁,还会频繁跨 CPU 迁移,导致缓存失效、上下文切换飙升。这时候用 perf 或 ftrace 抓,能看到内核态 CPU 和迁移线程占用奇高。
想治这毛病,最直接的是给 epoll 加上 EPOLLEXCLUSIVE 标志,保证每次只叫醒一个线程。别盲目堆线程池,关键服务甚至可以绑死 CPU 核心。
原文Linux 6.12 源码深度剖析: try_to_wake_up
作者提示: 个人观点,仅供参考
四川,5分钟前,