Проблема в (как вы сказали) syslogd. Пока ваш процесс выполняется с приоритетом RT, syslogd имеет значение , а не . Кроме того, syslogd не блокирует свою кучу и может (и будет) выгружаться ядром, особенно с очень немногими «клиентами».
Что вы можете попробовать:
Запустите другой поток для управления приоритетной очередью, попросите этот поток общаться с системным журналом. Ведение журнала тогда будет просто захватить блокировку и вставить что-то в список. При наличии только двух подписчиков не стоит тратить много времени на приобретение мьютекса.
Не используя syslog, внедрите собственную регистрацию (в основном первое предложение, за исключением разговора с syslog).
У меня была похожая проблема, и моя первая попытка ее исправить состояла в том, чтобы изменить сам syslogd для блокировки его кучи. Это была катастрофа. Затем я попробовал rsyslogd, который немного улучшился, но у меня все еще были случайные пики задержки. В итоге я просто реализовал свою собственную регистрацию с использованием очереди приоритетов, чтобы гарантировать, что более важные сообщения были действительно написаны первыми.
Обратите внимание: если вы не используете swap (вообще), кратчайший путь к исправлению - это, вероятно, реализация собственной регистрации.