我们在进行负载测试时遇到Apache的性能问题,并且想知道是否存在我们缺少的配置。在我们的环境中,Apache提供静态UI内容,并平衡少数Tomcat服务器之间的负载。
我们的应用程序的一个主要组件是处理大量文件的大量同时上传。这些上传请求命中了Apache,它将请求代理到Tomcat服务器,在那里将文件保存到磁盘并完成其他一些小操作。由于文件的大小,单个上载请求可能需要一段时间。在我们的负载测试中,我们试图找到一次可以处理多少上传的限制。
我们所有的服务器都是Windows,因此mpm的唯一选择是mpm_winnt。使用mpm_winnt,每个孩子的最大线程数为1920,因此最大可能的配置似乎是:
<IfModule mpm_winnt.c>
ThreadsPerChild 1920
MaxRequestsPerChild 0
</IfModule>
当我们增加负载以进行数千次同步上传时,事情就会陷入困境并变得无法应对。如果我们在负载测试期间直接访问Tomcat,我们会得到快速响应,因此瓶颈似乎是Apache。
我们启用了mod_status,而/ server-status页面显示以下内容,这似乎证明Apache正在最大化:
1920 requests currently being processed, 0 idle workers
运行的Apache服务器不会从CPU,内存或网络角度征税。看起来我们的硬件应该能够处理更多的负载,但是我们遇到了来自mpm_winnt模块的1920个请求的这种看似人为的限制。
我们可以做些什么来提高这个门槛?我们希望限制因素与硬件相关(即最大网络流量,CPU,内存等)。任何想法或想法将不胜感激。
答案 0 :(得分:1)
事实证明,1920是默认的线程限制,每个子元素的值不能超过线程限制,这就是为什么我不能超过1920个线程。我无法在任何配置文件中找到线程限制配置,这有点奇怪,因为Apache中的大多数设置通常都是默认值或在配置文件中注释掉。无论如何,我添加了它,如下所示,并且能够将线程数增加到15,000,这是mpm_winnt的最大值。
<IfModule mpm_winnt_module>
ThreadLimit 15000
ThreadsPerChild 15000
MaxConnectionsPerChild 0
</IfModule>