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