如何找出哪个内核自旋锁吃掉了大部分CPU?

How to find out which kernel spinlock eat up most of CPU?

我正在对 Linux 上 运行 并使用硬件加密加速设备的加密软件进行性能调整。

当负载超过某个阈值时,内核 _spn_lock 开始占用 CPU 的大部分时间。以下 perf top 屏幕截图显示 CPU 的约 30% 被 _spin_lock 占用,但如果负载增加且整体性能下降,它会上升超过 50%。

如果不找出是哪个自旋锁导致了这种情况,我就无法调整软件的性能。

我在 Whosebug 上查看了类似的问题,但我找不到关于如何发现哪个自旋锁自旋 的答案。 有什么办法可以定位自旋锁的位置吗?任何提示或建议将不胜感激。

   PerfTop:      81 irqs/sec  kernel:45.7%  exact:  0.0% [1000Hz cycles],  (all, CPU: 53)
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

             samples  pcnt function                DSO
             _______ _____ _______________________ __________________________

               44.00 27.2% _spin_lock              [kernel.kallsyms]
               30.00 18.5% sha512_block_data_order /usr/local/bin/cryptod
                6.00  3.7% _int_malloc             /lib64/libc-2.12.so
                5.00  3.1% __GI___libc_malloc      /lib64/libc-2.12.so



[root@qat ~]# uname -a
Linux qat 2.6.32-220.el6.tsx.65.x86_64 #68 SMP Fri Jan 26 17:45:32 KST 2018 x86_64 x86_64 x86_64 GNU/Linux

perf-lock 应该可以帮助您。您可以使用它捕获一些每个锁的统计信息。

你想找到调用 _spin_lock 的地方吗?

试试看 ftrace

#cd /sys/kernel/debug/tracing
#echo function_graph > current_tracer
#cat trace | grep -B 5 _spin_lock

有关 ftrace 的更多信息,请参阅此处https://lwn.net/Articles/365835/