美好的一天,
我希望能够从我的Apache Httpd服务至less7000(最好是10k)并发请求。 我已经使用以下设置configuration了我的httpd.conf与MPM worker
ServerLimit 330 StartServers 25 ThreadsPerChild 25 MaxClients 7500
我的Apache Httpd服务器除了对Java应用服务器集群进行反向代理以外,还对某些静态项目(如HTML / CSS / JS)进行一些(磁盘)caching。
在尝试使用JMeter(大约1k个并发请求)来敲打我的系统时,在几分钟内,我的服务器开始崩溃,但没有显示其他信息。
我的/etc/security/limits.confconfiguration为
* soft nofile 10000 * hard nofile 30000 apache soft nproc 8192 apache hard nproc 12288 * soft stack 512 * hard stack 1024
任何想法如何可以达到7k(或最好是10k)并发请求
[Mon Apr 09 21:47:42 2012] [alert] (11)Resource temporarily unavailable: apr_thread_create: unable to create worker thread [Mon Apr 09 21:47:42 2012] [alert] (11)Resource temporarily unavailable: apr_thread_create: unable to create worker thread [Mon Apr 09 21:47:42 2012] [alert] (11)Resource temporarily unavailable: setuid: unable to change to uid: 48 [Mon Apr 09 21:47:42 2012] [alert] (11)Resource temporarily unavailable: setuid: unable to change to uid: 48 [Mon Apr 09 21:47:42 2012] [alert] (11)Resource temporarily unavailable: apr_thread_create: unable to create worker thread [Mon Apr 09 21:47:42 2012] [alert] (11)Resource temporarily unavailable: apr_thread_create: unable to create worker thread [Mon Apr 09 21:47:42 2012] [alert] (11)Resource temporarily unavailable: setuid: unable to change to uid: 48 [Mon Apr 09 21:47:42 2012] [alert] (11)Resource temporarily unavailable: setuid: unable to change to uid: 48 [Mon Apr 09 21:47:42 2012] [alert] (11)Resource temporarily unavailable: apr_thread_create: unable to create worker thread [Mon Apr 09 21:47:42 2012] [alert] (11)Resource temporarily unavailable: apr_thread_create: unable to create worker thread [Mon Apr 09 21:47:42 2012] [alert] (11)Resource temporarily unavailable: apr_thread_create: unable to create worker thread [Mon Apr 09 21:47:42 2012] [alert] (11)Resource temporarily unavailable: setuid: unable to change to uid: 48 [Mon Apr 09 21:47:42 2012] [alert] (11)Resource temporarily unavailable: apr_thread_create: unable to create worker thread [Mon Apr 09 21:47:42 2012] [alert] (11)Resource temporarily unavailable: setuid: unable to change to uid: 48 [Mon Apr 09 21:47:42 2012] [alert] (11)Resource temporarily unavailable: setuid: unable to change to uid: 48 [Mon Apr 09 21:47:42 2012] [alert] Child 15139 returned a Fatal error... Apache is exiting! [Mon Apr 09 21:47:42 2012] [alert] (11)Resource temporarily unavailable: apr_thread_create: unable to create worker thread [Mon Apr 09 21:47:46 2012] [warn] child process 14004 still did not exit, sending a SIGTERM
编辑(附加信息):
这是我试图看看有多less活动的httpd进程,而我正在运行testing(每个命令是大约1秒分开 – 即我按下了键,然后按下回车键)
[franz@webserver ~]$ ps -ef | grep httpd | wc -l 5 [franz@webserver ~]$ ps -ef | grep httpd | wc -l 5 [franz@webserver ~]$ ps -ef | grep httpd | wc -l 8 [franz@webserver ~]$ ps -ef | grep httpd | wc -l 8 [franz@webserver ~]$ ps -ef | grep httpd | wc -l 8 [franz@webserver ~]$ ps -ef | grep httpd | wc -l 9 [franz@webserver ~]$ ps -ef | grep httpd | wc -l 9 [franz@webserver ~]$ ps -ef | grep httpd | wc -l 9 [franz@webserver ~]$ ps -ef | grep httpd | wc -l 9 [franz@webserver ~]$ ps -ef | grep httpd | wc -l 9 [franz@webserver ~]$ ps -ef | grep httpd | wc -l 9 [franz@webserver ~]$ ps -ef | grep httpd | wc -l 10 [franz@webserver ~]$ ps -ef | grep httpd | wc -l 10 [franz@webserver ~]$ ps -ef | grep httpd | wc -l 10 [franz@webserver ~]$ ps -ef | grep httpd | wc -l 10 [franz@webserver ~]$ ps -ef | grep httpd | wc -l 10 [franz@webserver ~]$ ps -ef | grep httpd | wc -l 11 [franz@webserver ~]$ ps -ef | grep httpd | wc -l 11 [franz@webserver ~]$ ps -ef | grep httpd | wc -l 13 [franz@webserver ~]$ ps -ef | grep httpd | wc -l 13 [franz@webserver ~]$ ps -ef | grep httpd | wc -l 17 [franz@webserver ~]$ ps -ef | grep httpd | wc -l 17 [franz@webserver ~]$ ps -ef | grep httpd | wc -l 25 [franz@webserver ~]$ ps -ef | grep httpd | wc -l 25 [franz@webserver ~]$ ps -ef | grep httpd | wc -l 41 [franz@webserver ~]$ ps -ef | grep httpd | wc -l 41 [franz@webserver ~]$ ps -ef | grep httpd | wc -l 39 [franz@webserver ~]$ ps -ef | grep httpd | wc -l 39 [franz@webserver ~]$ ps -ef | grep httpd | wc -l 39 [franz@webserver ~]$ ps -ef | grep httpd | wc -l 39 [franz@webserver ~]$ ps -ef | grep httpd | wc -l 39 [franz@webserver ~]$ ps -ef | grep httpd | wc -l 39 [franz@webserver ~]$ ps -ef | grep httpd | wc -l 39 [franz@webserver ~]$ ps -ef | grep httpd | wc -l 39 [franz@webserver ~]$ ps -ef | grep httpd | wc -l 39 [franz@webserver ~]$ ps -ef | grep httpd | wc -l 39 [franz@webserver ~]$ ps -ef | grep httpd | wc -l 39 [franz@webserver ~]$ ps -ef | grep httpd | wc -l 37 [franz@webserver ~]$ ps -ef | grep httpd | wc -l 37 [franz@webserver ~]$ ps -ef | grep httpd | wc -l 36 [franz@webserver ~]$ ps -ef | grep httpd | wc -l 36 [franz@webserver ~]$ ps -ef | grep httpd | wc -l 36 [franz@webserver ~]$ ps -ef | grep httpd | wc -l 36 [franz@webserver ~]$ ps -ef | grep httpd | wc -l 36 [franz@webserver ~]$ ps -ef | grep httpd | wc -l 36 [franz@webserver ~]$ ps -ef | grep httpd | wc -l 36 [franz@webserver ~]$ ps -ef | grep httpd | wc -l 36 [franz@webserver ~]$ ps -ef | grep httpd | wc -l 1 [franz@webserver ~]$ ps -ef | grep httpd | wc -l
更新:如果我添加ThreadStackTrace,它不会崩溃了:ServerLimit 330 StartServers 25 ThreadsPerChild 25 MaxClients 7500 ThreadStackSize 512
注意:在添加ThreadStackSize之前,我在limits.conf中有堆栈条目,但我认为这还不够。 我不得不在limits.conf和Apache httpd.cofn中的ThreadStackSize中添加堆栈条目。
但是仍然无法处理7500个并发请求。 当我做一个ps -ef | grep httpd | wc -l ps -ef | grep httpd | wc -l ps -ef | grep httpd | wc -l ,我看到的最高只有42(因为其中一个进程是grep命令,这意味着它是大约41个Apache httpd进程)。 但是我configuration了我的apache达到了330。
所以为了看看我的apacheconfiguration是否真的可以超越40个进程,我尝试将我的StartServers修改为50。
ServerLimit 330 StartServers 50 ThreadsPerChild 25 MaxClients 7500 ThreadStackSize 512
结果如下:
[Wed Apr 11 03:33:40 2012] [notice] suEXEC mechanism enabled (wrapper: /usr/sbin/suexec) [Wed Apr 11 03:33:40 2012] [notice] Digest: generating secret for digest authentication ... [Wed Apr 11 03:33:40 2012] [notice] Digest: done [Wed Apr 11 03:33:40 2012] [warn] pid file /etc/httpd/run/httpd.pid overwritten -- Unclean shutdown of previous Apache run? [Wed Apr 11 03:33:40 2012] [alert] (11)Resource temporarily unavailable: apr_thread_create: unable to create worker thread [Wed Apr 11 03:33:40 2012] [alert] (11)Resource temporarily unavailable: apr_thread_create: unable to create worker thread [Wed Apr 11 03:33:40 2012] [alert] (11)Resource temporarily unavailable: apr_thread_create: unable to create worker thread [Wed Apr 11 03:33:40 2012] [alert] (11)Resource temporarily unavailable: setuid: unable to change to uid: 48 [Wed Apr 11 03:33:40 2012] [alert] (11)Resource temporarily unavailable: setuid: unable to change to uid: 48 [Wed Apr 11 03:33:40 2012] [alert] (11)Resource temporarily unavailable: apr_thread_create: unable to create worker thread [Wed Apr 11 03:33:40 2012] [alert] (11)Resource temporarily unavailable: apr_thread_create: unable to create worker thread [Wed Apr 11 03:33:40 2012] [alert] (11)Resource temporarily unavailable: setuid: unable to change to uid: 48 [Wed Apr 11 03:33:40 2012] [alert] (11)Resource temporarily unavailable: setuid: unable to change to uid: 48 [Wed Apr 11 03:33:40 2012] [alert] (11)Resource temporarily unavailable: apr_thread_create: unable to create worker thread [Wed Apr 11 03:33:40 2012] [alert] (11)Resource temporarily unavailable: apr_thread_create: unable to create worker thread [Wed Apr 11 03:33:40 2012] [alert] (11)Resource temporarily unavailable: apr_thread_create: unable to create worker thread [Wed Apr 11 03:33:40 2012] [notice] Apache/2.2.15 (Unix) DAV/2 mod_ssl/2.2.15 OpenSSL/1.0.0-fips configured -- resuming normal operations [Wed Apr 11 03:33:40 2012] [alert] Child 55663 returned a Fatal error... Apache is exiting!
所以我想主要的问题是我不能产生超过40个进程。
Update2:由于我似乎无法增加进程的数量,我尝试增加线程的数量。 我可以只有30 ThreadsPerChild(从原始的ThreadsPerChild)。 之后,Apache无法启动,因为它似乎无法创build工作线程。
任何人有一些想法如何达到与Apache HTTPd的10K并发请求?
为什么这不是重复的:原谅,我不知道为什么这被标记为重复。 如果我的问题的答案是在你能帮助我的容量规划? ,你可以好好突出如何和在哪里? 这个问题在本质上是通用的,而我的是非常具体的,而且更“向我展示如何使用Apache httpd专门到达c10k,或指出我的设置有什么问题”。
谢谢,
弗朗茨
增加操作系统对线程/进程的全局限制,并阅读系统中的其他可能的EAGAIN原因“man pthread_create”。