0

当我的 httpd 一次连接数超过 500 时冻结并停止响应,请帮助我调整我的服务器。

自 2008 年以来我一直使用相同的配置,现在添加了一些 RAM,现在我在两台服务器上各有 32 Gb

第一个安装了 RHEL 5 64 位 2.6.18-53.1.4.el5xen,它将 jnlp 提供给连接到第二台服务器后的客户端

Apache 2.2.3 httpd.conf

<IfModule prefork.c>
StartServers       8
MinSpareServers   10
MaxSpareServers   75
ServerLimit      1100
MaxClients       1100
MaxRequestsPerChild  4000
</IfModule>

<IfModule worker.c>
StartServers         2
MaxClients         150
MinSpareThreads     25
MaxSpareThreads     75
ThreadsPerChild     25
MaxRequestsPerChild  0
</IfModule>

具有以下参数的 java 1.6.0_27 进程

java -server -Xmx1280M -XX:MaxPermSize=256M -Djava.awt.headless=true ...

带有以下参数的tomcat server.xml

 ...   connectionTimeout="12000" maxSpareThreads="250" protocol="AJP/1.3" 
 maxHttpHeaderSize="8192" disableUploadTimeout="true" minSpareThreads="25" 
 useBodyEncodingForURI="true" maxThreads="500" acceptCount="100" 
 enableLookups="false" ...

第二台服务器只有 JVM java 进程 HW 当连接的用户数超过 600 时冻结,我昨天将 Xmx 从 4000m 更改为 26g,希望这将允许为该进程使用更多 RAM。但不要看到它在顶部使用超过 4g。

java -server -Xmx26g -Djava.awt.headless=true -Dfile.encoding=UTF-8 -jar

top - 01:34:10 up 252 days,  8:02,  1 user,  load average: 0.00, 0.02, 0.00
Tasks: 127 total,   1 running, 126 sleeping,   0 stopped,   0 zombie
Cpu(s):  1.8%us,  0.2%sy,  0.0%ni, 97.7%id,  0.2%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:  37049860k total,  3225916k used, 33823944k free,   331836k buffers
Swap: 10223608k total,        0k used, 10223608k free,  2409808k cached

top - 03:57:04 up 252 days,  8:02,  1 user,  load average: 0.01, 0.02, 0.00
Tasks: 145 total,   1 running, 144 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.0%sy,  0.0%ni, 99.8%id,  0.2%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:  37108368k total, 36117600k used,   990768k free,   218364k buffers
Swap:  2031608k total,      120k used,  2031488k free, 33518948k cached

请帮我解决这个问题。我计划升级所有这些,但不确定我的 java 程序是否可以与新版本的 rhel apache tomcat 和 jvm 一起使用。

4

1 回答 1

0

这很可能是您在 Tomcat 方面的问题

maxThreads="500"

在 server.xml... 提高它,这将允许更多的并发连接。

最大线程数

此连接器要创建的最大请求处理线程数,因此决定了可以处理的最大并发请求数。如果未指定,则此属性设置为 200。如果执行器与此连接器关联,则忽略此属性,因为连接器将使用执行器而不是内部线程池执行任务。

来自 Apache Tomcat 文档

另外,这部分解释了为什么 600 个客户端可以连接:

acceptCount="100"

这使得另外 100 个客户端可以在队列中等待直到服务

接受计数

当所有可能的请求处理线程都在使用时,传入连接请求的最大队列长度。队列已满时收到的任何请求都将被拒绝。默认值为 100。

注意:为了能够验证内存情况,您可以使用 JMX(jconsole、jvisualvm 等)连接到 Tomcat,此外,您可以检查很多实际设置,如监控 Tomcat中所述常见问题解答

于 2016-08-11T19:12:40.017 回答