TL;博士
内核源文件`net / packet / af_packet.c中有各种自旋锁和互斥锁,我可以读取源并查看哪些函数使用锁以及它们被调用的顺序,但我可以'通过阅读代码来判断锁是否旋转或持续多长时间。我需要看看在运行时实际上是什么。
如何跟踪单个应用程序的自旋锁源?
背景
我写了一个基本的multi-threaded network traffic generator,我想知道导致它阻塞/停止的原因。 perf top
显示了大量(约25%)_raw_spin_lock_irqsave
和native_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_irqsave
和native_queued_spin_lock_slowpath
所以它看起来就像一个自旋锁或互斥锁在内核中阻塞(net/packet/af_packet.c
并且我想缩小确切的位置(确切地锁定或调用哪个函数。
我一直在尝试使用SystemTap来查找。如果有人敢于探测kernel.function("spin_lock")
或raw_spin_lock
/ _raw_spin_lock
/ __raw_spin_lock
等,您会看到难以排序的疯狂数量的输出或仅仅是完全崩溃/系统锁定。这很明显可以预期很多进程正在使用和轮询自旋锁。