Я работаю над встроенным приложением C++, работающим на Linux. Недавно я столкнулся с некоторыми действительно странными проблемами производительности с pthreads.Производительность потока Linux очень быстро под GDB, но очень медленно, иначе
В моей системе имеется 8 потоков, передающих информацию взад и вперед, защищенную с помощью блокировки мьютекса pthread. При автономном выполнении моего приложения производительность потока крайне затруднительна при блокировке мьютекса. Блокировка и разблокировка мьютекса ~ 200 раз занимает 2,4 секунды на плате ARM на 500 МГц и дольше на моей плате 200 МГц.
Странно, что при запуске приложения под GDB приложение работает очень быстро. Тот же блок кода, который занимал 2,4 секунды автономно, занимает около 2 мс при запуске GDB.
Я тестировал это поведение на двух разных SBC на базе ARM: один работает под управлением Linux 2.4.26 с gcc 3.4.4 и glibc 2.3.2, а другой с Linux 2.6.21 также с gcc 3.4.4 и glibc 2.3.2.
После тщательного тестирования я подозреваю, что проблема заключается в библиотеке pthreads, которая, как оказалось, является той же версией на инструментальных цепочках обеих плат. Это было бы неудачно, так как мой поставщик SBC не предлагает очень широкий набор инструментов для своей платы, и я боюсь, что у всех это будет проблема. Кто-нибудь знает, что может привести к низкой производительности, когда не работает под GDB?
Вы были правы, это было не сломано, конечно. :) Я сузил проблему до сторонней структуры, которую мы используем для функций конечного автомата. Он использовал стандартный мьютез pthread вместо рекурсивного. Изменение мьютекса на рекурсивное приводит к тому, что программа работает так же, как в GDB. Спасибо за ваш отзыв! – Maha