我已经实现了多线程软件应用程序,该应用程序捕获低级以太网数据包数据(使用pcap
)并将这些数据包放入环形缓冲区。在单独的线程中,将数据包从环形缓冲区中删除并进行处理。
即我有一个LIFO队列,其中一个线程添加数据,另一个线程取出数据。
性能分析表明,环形缓冲区会很快填满,即,无法像添加数据包一样快地删除数据包。即使在我注释掉接收数据包的线程中的所有处理时,也就是将应用程序简化为仅添加和接收数据包,而不执行其他处理。
我认为可能导致该问题的一件事是队列上的互斥锁争用。
我用mutrace
运行了该应用程序,并得到以下输出:
mutrace: Showing 2 most contended mutexes:
Mutex # Locked Changed Cont. tot.Time[ms] avg.Time[ms] max.Time[ms] Flags
6 27740 209 35 75.672 0.003 59.944 M-.--.
5 19 13 0 0.021 0.001 0.004 M-.--.
这似乎表明用于添加/获取数据包的互斥锁(互斥锁6)的争用还算不错,只有0.1%的锁有争执。似乎唯一脱颖而出的是平均值之间的巨大差异。锁定时间和最大锁定时间。其他人是否注意到锁定时间上的巨大差异?可能只是异常现象而已,无需关注吗?