为什么用ab压apache,并发很难超过120
用一台酷睿pc,安装centos5.3,自带的apache+php+mysql,
用ab压了几次,并发分别是50,120,130,200.
ab -c 120 -n 50000 http://192.168.1.50/test.php
这个test.php内容是很简单的
<?php
$q1=microtime(true);
$str = "mysql:host=192.168.1.50;port=3306;dbname=abc";
$con[PDO::ATTR_TIMEOUT] = 3;
$con[PDO::ATTR_PERSISTENT] = true;
$db = new Pdo($str, 'abc', 'abc', $con);
$insert = "INSERT INTO cation SET ...........";
$db->exec($insert);
$q2=microtime(true);
echo $q2 - $q1;
?>
很奇怪的是,当并发在120以下时,apache的反应速度都很快,每秒能处理的事务达到500以上。
而一旦并发超过120,apache的反应速度马上下降,每秒处理的事务才100多点。
如果并发高过200,测试就会出现失败几千次。
开始以为瓶颈在mysql,但是写了一个php循环50000次insert,花的时间也很短。
后来干脆在test.php里去掉所有业务代码,只写一些简单的echo,但是得到的结果大同小异。
按照网上的文章,修改httpd.conf里MPM相关内容,也没有得到效果提升。
用httpd -l查看,apache默认是prefork方式。
<IfModule prefork.c>
StartServers 8
MinSpareServers 50
MaxSpareServers 100
ServerLimit 2000
MaxClients 1000
MaxRequestsPerChild 4000
</IfModule>
如果把MaxClients改的特别小,带来的反面影响是很明显,所以这个配置文件应该是生效的。
但是同样centos上安装tomcat和一个插入数据库的java程序,用ab测试,并发数很容易达到400。
这是为什么呢?