我们有一个服务器应用程序在 ubuntu 和旧的 Mandrake Linux 上运行良好,但在 Redhat Enterprise Linux(准确地说是 RHEL 4 Update 8,内核 2.6.9-89)上始终失败。在 RHEL 上,服务器通常运行 40 天或更长时间,之后它将停止响应传入连接。
我们注意到,在 ubuntu 上,对于大约 5000 个传入连接,服务器仅创建大约 50 个唯一线程 ID。同时,在 RHEL 上,对于相同数量的传入连接,有数千个线程 ID。我认为这可能是这些服务器挂起的原因。
有什么方法可以检查是否是这个原因?也许有一些工具可以显示系统中“空闲”线程的数量,或者可以显示服务器中“线程泄漏”的工具?是否有系统设置控制线程的分配和释放方式?也许有一些设置可以将特定线程“绑定”到传入的 TCP 连接,并且这在 ubuntu 和 RHEL 中的工作方式有所不同?
聚苯乙烯
我忘了提到,在 RHEL 上,线程 ID 通常看起来像 xxxx004 或 xxxx005,其中 x 是一些十六进制数字,例如 1E8004 和 750005,并且它们总是随着时间的推移而增加。
答案1
/进程
这听起来像是您正在触及线程最大限制。您可以在此处检查此参数:
$ cat /proc/sys/kernel/threads-max
12345
您可以使用以下命令更改此值:
$ sudo echo <number> > /proc/sys/kernel/threads-max
要使其永久重新启动,请编辑此文件,/etc/sysctl.conf
并添加以下行:
kernel.threads-max = 50000
然后运行这个命令:
$ sudo sysctl -p
附加内核参数
您可以使用命令查看内核的其他配置sysctl -a
。
例如,以下是所有“线程”参数:
$ sudo sysctl -a|grep thread
kernel.threads-max = 7514
kernel.slow-work.min-threads = 2
kernel.slow-work.max-threads = 16
vm.nr_pdflush_threads = 0
2.6 与 3.x 内核
在使用过时的 2.6 内核和 glibc 库的 RHEL 4.x 与较新的 3.x 之间进行比较就像将苹果与橙子进行比较一样。内核发生了许多变化,因此我不希望它们中的任何一个以类似的方式运行。