Независимые многопоточные процессы блокируются одновременно

Система Linux (Gentoo x64), код C ++. У меня есть приложение-демон, несколько экземпляров которого выполняются на одной машине. Приложение является многопоточным само по себе. В течение некоторого времени я наблюдал странные задержки в его работе.

После добавления некоторого кода отладки я обнаружил странную вещь, когда несколько экземпляров демона буквально блокируются одновременно, что предположительно вызвано какой-то внешней причиной или чем-то другим. Проще говоря, у меня есть такая последовательность:

  1. время записи (t1)
  2. заблокировать мьютекс
  3. вызов C ++ std::list::push_back()/pop_back() (т.е. очень простая математика)
  4. разблокировать мьютекс
  5. время записи (t2)

Время от времени я ясно вижу, что вышеприведенная последовательность, выполняемая в нескольких независимых (!) Блоках процессов на шаге 2 (или, вероятно, на шаге 4), в течение некоторого действительно чрезмерного времени относительно математики на шаге 3 (например, 0,5 — 1,0 секунды ). В качестве доказательства я вижу, что t2 в логах все процессы буквально одинаковы (различаются за несколько микросекунд). Похоже, что некоторые потоки процессов входят в раздел в относительно разное время (я четко вижу разницу в 0,5 — 1 секунды для t1), заблокируйте мьютекс и разблокируйте в то же время, якобы проведя в замке неоправданно много времени согласно журналу (t2t1 разница). Выглядит жутко для меня.

Проявление проблемы встречается относительно редко, примерно раз в 5-10 минут при умеренной нагрузке. Никакие сдвиги времени NTP не регистрируются в тесте (это была моя первая идея на самом деле). Если бы это был NTP, не было бы фактических задержек в обслуживании, только неправильные времена в журнале.

С чего мне начать? Начать настройку планировщика? Что теоретически может блокировать весь многопоточный процесс в Linux?

8

Решение

запустите вашу программу с:

valgrind --tool=helgrind ./your_program

Вы найдете больше проблем, которые вы ожидаете.

Valgrind (Helgrind) предоставит вам подробный сценарий вашего многопоточного приложения, который в настоящее время является обязательным до развертывания.

1

Другие решения

Других решений пока нет …