C++ библиотека, вызываю ее методы с помощью CGO. Библиотека имеет в своей логике Thread Pool, при старте можно задать количество потоков.
Задаю, например, ThreadPool = 4. При старте всего сервиса в htop видно 12 потоков (8 по GOMAXPROCS и 4, которые я задал для библиотеки). Потом со временем некоторые C++ потоки начинают часто уходить в статус D (uninterruptible sleep) и в итоге весь сервис начинает сильно тормозить. Я так понимаю проблема в том, что блокируются потоки и Go код выполняется с задержками.
Может кто-то направить в какую сторону копать, чтобы это победить?
С чего вдруг потоки в библиотеке должны влиять на go? Гадая на кофейной гуще, uninterruptable state обычно означает, что поток застрял в ядре. Нередко, например, из-за page fault и последующим походом в своп. Соответственно, вопрос -- память точно есть свободная?
память есть. Занято меньше половины. Библиотека ходит в сеть и я так понимаю ждет IO
Обсуждают сегодня