Недавно мы установили сервер HP ProLiant DL360p для тяжелой работы. По той или иной причине мы отключили гиперпоточность в BIOS системы при настройке. Будучи двухъядерной 8-ядерной системой, мы получили 16 аппаратных потоков. 32 ГБ оперативной памяти. Мы используем 64-разрядную версию Ubuntu 12.04.
Основная часть работы выполняется «синтезатором» VHDL или компилятором. Это приложение QT, но обычно оно запускается в режиме командной строки (без графического интерфейса). Этот компилятор хорошо работает последние несколько недель, благодаря системе непрерывной интеграции (Jenkins).
Сегодня мы снова включили гиперпоточность, чтобы получить доступ ко всем 32 аппаратным потокам. Однако теперь этот компилятор зависает со следующей ошибкой в каждом случае, который я могу придумать:
QThread::start: Thread creation error: Resource temporarily unavailable
Кажется, что процесс остановлен, не занят ни одним процессором, и ctrl-c его прерывает.
Я поискал в Интернете, и, похоже, это может быть связано с максимальными ограничениями потоков ОС, но я не уверен, как это изменить. В любом случае по умолчанию предполагается около 800 потоков, что должно быть более чем достаточно для этого компилятора, который выполняет только небольшое количество (может быть, 2?).
А пока мне придется отключить гиперпоточность, но мне было интересно, является ли это известной проблемой с высокопроизводительными серверами под управлением 64-разрядной Linux? Есть ли известный обходной путь? Или это, скорее, проблема с конкретным приложением?
Не могли бы вы описать, как запускается этот процесс, и предоставить нам результат ulimit -a
из контекста, максимально близкого к этому?
Так как pthread_create(3)
объясняет, вы столкнулись с:
ERRORS
EAGAIN Insufficient resources to create another thread, or a system-
imposed limit on the number of threads was encountered. The
latter case may occur in two ways: the RLIMIT_NPROC soft
resource limit (set via setrlimit(2)), which limits the number
of process for a real user ID, was reached; or the kernel's
system-wide limit on the number of threads, /proc/sys/ker‐
nel/threads-max, was reached.