Интерпретация взаимного вывода - PullRequest
0 голосов
/ 09 января 2019

Я реализовал многопоточное приложение, которое собирает низкоуровневые данные пакетов Ethernet (используя 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% блокировок были спорными. Единственное, что кажется выдающимся - это огромная разница между средними значениями. время блокировки и максимальное время блокировки. Кто-нибудь еще заметил огромные различия во времени блокировки? Возможно, это просто аномалия мутрации, а не то, о чем беспокоиться?

...