案例分析 | 对kernel percpu_rwsem 锁优化

104 阅读1分钟

问题现象:
连续启动/退出测试中,主线程不少长帧是由于 composer 在 percpu_rwsem_wait 上阻塞引起: composer 等读锁,lmkd或Oomadjuster 等操作Cgroup 接口的线程在等写锁,而写锁则是被多个低优先级的后台线程的读锁占用。

如下图所示: image.png

lmkd 或OomAdjuster 写入cgroup.procs 会申请全局大锁rwsem。

社区近期在kernel 6.18上引入一个优化:
cgroup: replace global percpu_rwsem with per threadgroup resem when writing to cgroup.procs
新增了per-threadgroup rwsem,降低持锁粒度从而改善锁竞争情况。

此外,针对这种情况,OEM 厂商一种常见的优化手段:
针对写在等的这种情况,允许vip 线程进入临界区,hook 这个接口trace_android_vh_percpu_rwsem_down_read 即可,然后判断下是否是写在等待,增加一个reader并发 ,基本没啥额外开销,修改比较简单,这里不展开讨论。