Система Linux (Gentoo x64), код C ++. У меня есть приложение-демон, несколько экземпляров которого выполняются на одной машине. Приложение является многопоточным само по себе. В течение некоторого времени я наблюдал странные задержки в его работе.
После добавления некоторого кода отладки я обнаружил странную вещь, когда несколько экземпляров демона буквально блокируются одновременно, что предположительно вызвано какой-то внешней причиной или чем-то другим. Проще говоря, у меня есть такая последовательность:
std::list::push_back()
/pop_back()
(т.е. очень простая математика)Время от времени я ясно вижу, что вышеприведенная последовательность, выполняемая в нескольких независимых (!) Блоках процессов на шаге 2 (или, вероятно, на шаге 4), в течение некоторого действительно чрезмерного времени относительно математики на шаге 3 (например, 0,5 — 1,0 секунды ). В качестве доказательства я вижу, что t2 в логах все процессы буквально одинаковы (различаются за несколько микросекунд). Похоже, что некоторые потоки процессов входят в раздел в относительно разное время (я четко вижу разницу в 0,5 — 1 секунды для t1), заблокируйте мьютекс и разблокируйте в то же время, якобы проведя в замке неоправданно много времени согласно журналу (t2 — t1 разница). Выглядит жутко для меня.
Проявление проблемы встречается относительно редко, примерно раз в 5-10 минут при умеренной нагрузке. Никакие сдвиги времени NTP не регистрируются в тесте (это была моя первая идея на самом деле). Если бы это был NTP, не было бы фактических задержек в обслуживании, только неправильные времена в журнале.
С чего мне начать? Начать настройку планировщика? Что теоретически может блокировать весь многопоточный процесс в Linux?
запустите вашу программу с:
valgrind --tool=helgrind ./your_program
Вы найдете больше проблем, которые вы ожидаете.
Valgrind (Helgrind) предоставит вам подробный сценарий вашего многопоточного приложения, который в настоящее время является обязательным до развертывания.
Других решений пока нет …