我们最近安装了一台 HP ProLiant DL360p 服务器,用于一些繁重的工作。出于某种原因,我们禁用了超线程在设置系统 BIOS 时。作为双 CPU 8 核系统,它为我们提供了 16 个硬件线程。32 GB RAM。我们运行的是 Ubuntu 12.04 64 位。
大部分工作由 VHDL“合成器”或编译器完成。它是一个 QT 应用程序,但通常以命令行模式运行(无 GUI)。在过去几周里,这个编译器运行良好,由持续集成系统(Jenkins)启动。
今天我们重新启用了超线程,以便访问所有 32 个硬件线程。但是现在,在我所能想到的所有情况下,此编译器都会挂起并出现以下错误:
QThread::start: Thread creation error: Resource temporarily unavailable
该进程似乎已停止,没有任何 CPU 处于繁忙状态,并且 ctrl-c 可中断它。
我在网上搜索了一下,似乎这可能与操作系统的最大线程限制有关,但我不确定如何更改它。默认值应该是 800 个线程左右,对于这个只运行少量线程(可能是 2 个?)的编译器来说,这应该足够了。
与此同时,我必须禁用超线程,但我想知道这是否是运行 64 位 Linux 的高端服务器的已知问题?是否有已知的解决方法?或者更可能是该特定应用程序的问题?
答案1
您能否描述一下这个过程是如何启动的,并为我们提供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.