如何检测 Rust 中的锁争用?


问题:我的应用程序是一个Tonic服务器,它与redis对话以回复客户的请求。它运行在tokio运行时间上。

不知何故,在一个有64个核心的服务器上,无论我如何努力向服务器发送负载,我都无法将cpu推到40%以上。我看了看网络,它没有接近饱和状态。我怀疑有锁的争夺发生。在Rust中检测锁争夺的最好方法是什么?我有pprof,它允许我对cpu进行剖析,但我不知道如何检测锁的争夺。

答:
1、可以尝试https://github.com/tokio-rs/console来调试和分析程序中 tokio 任务发生的情况。
如果它真的是“本机”锁争用,您可以尝试使用例如 Intel VTune(或 AMD uProf),它们应该能够很好地显示这一点。

2、要调试锁争用,最好的办法是使用 Linux 通过 perf 提供的工具。有几种方法。我建议使用谷歌搜索“Linux perf debug lock contention”之类的内容。
也就是说,除了未使 CPU 最大化的锁争用之外,还有其他潜在原因。您可能受 I/O 限制、内存限制或其他因素限制。在解决它之前,您首先需要确定该因素。

如果您受 cpu 限制,请查看配置文件,否则请查看跟踪记录。围绕您的 Redis 请求、CPU 绑定部分和锁定使用情况添加跟踪范围。
您可能会发现 Redis 可能是您的瓶颈,请求延迟会急剧上升。