Linux的;如何调试spin_lock source

时间:2017-09-17 18:28:07

标签: linux linux-kernel spinlock systemtap

TL;博士

内核源文件`net / packet / af_packet.c中有各种自旋锁和互斥锁,我可以读取源并查看哪些函数使用锁以及它们被调用的顺序,但我可以'通过阅读代码来判断锁是否旋转或持续多长时间。我需要看看在运行时实际上是什么。

如何跟踪单个应用程序的自旋锁源?

背景

我写了一个基本的multi-threaded network traffic generator,我想知道导致它阻塞/停止的原因。 perf top显示了大量(约25%)_raw_spin_lock_irqsavenative_queued_spin_lock_slowpath

当我使用单个工作线程运行流量生成器,固定到单个CPU核心时,传输速率约为6.5Gbps,工作线程核心的运行利用率约为35%。处理NET_RX软IRQ(处理传输流量的清理操作,因此不要被名称混淆!)的核心运行在100%,所以看起来内核可以&#39 ; t由于内核中的Tx路径(af_packet.c)"某处"。

,每秒处理更多数据包

当我使用第二个工作线程运行流量生成器应用程序时,每个线程被固定到单独的核心,每个核心的运行利用率约为35%。另外两个核心现在以100%的速度运行,固定到它们的NET_RX软IRQ(处理来自两个工作线程的内核中的传输清理操作)。因此,应用程序使用了两倍的CPU利用率,NET_RX IRQ也是如此,但传输速率仅从6.5Gbps增加到7Gbps(CPU利用率增加了100%,但传输流量仅增加了约10%) )现在在perf top我看到高达25%的_raw_spin_lock_irqsavenative_queued_spin_lock_slowpath所以它看起来就像一个自旋锁或互斥锁在内核中阻塞(net/packet/af_packet.c并且我想缩小确切的位置(确切地锁定或调用哪个函数。

我一直在尝试使用SystemTap来查找。如果有人敢于探测kernel.function("spin_lock")raw_spin_lock / _raw_spin_lock / __raw_spin_lock等,您会看到难以排序的疯狂数量的输出或仅仅是完全崩溃/系统锁定。这很明显可以预期很多进程正在使用和轮询自旋锁。

0 个答案:

没有答案