我用以下命令使用ab和siege对Apache / 2.2.3(prefork)进行基准testing:
ab -kc 200 -t 120 http://www.mywebsite.com/test.php siege -c200 -t2M http://www.mywebsite.com/test.php
test.php是一个非常简单的文件,只是创build一个MySQL连接,然后closures
<?php $link = mysql_connect("localhost", "username", "password"); mysql_select_db("dbname"); if(!$link) { die('Could not connect: ' . mysql_error()); } echo 'Connected successfully'; mysql_close($link); ?>
我得到的结果中有很多失败的请求 。 我想弄清楚如何减less这些失败的请求数量,因为这是一个相当简单的脚本,服务器负载是相当低的,我不应该有一个四核至强3Ghz机8G内存。
来自围城的输出
Transactions: 9438 hits Availability: 98.33 % Elapsed time: 119.39 secs Data transferred: 0.38 MB Response time: 1.31 secs Transaction rate: 79.05 trans/sec Throughput: 0.00 MB/sec Concurrency: 103.37 Successful transactions 9438 Failed transactions: 160 Longest transaction: 21.24 Shortest transaction 0.21
从ab输出:
Benchmarking www.mywebsite.com (be patient) Server Software: Apache/2.2.3 Server Hostname: www.mywebsite.com Server Port: 80 Document Path: /test.php Document Length: 22 bytes Concurrency Level: 200 Time taken for tests: 35.851520 seconds Complete requests: 50000 Failed requests: 618 (Connect: 0, Length: 618, Exceptions: 0) Write errors: 0 Keep-Alive requests: 49600 Total transferred: 12932098 bytes HTML transferred: 1149345 bytes Requests per second: 1394.64 [#/sec] (mean) Time per request: 143.406 [ms] (mean) Time per request: 0.717 [ms] (mean, across all concurrent requests) Transfer rate: 352.26 [Kbytes/sec] received
我的Apacheconfiguration的一个突出亮点
Timeout 300 KeepAlive On MaxKeepAliveRequests 100 KeepAliveTimeout 15 <IfModule prefork.c> StartServers 20 MinSpareServers 20 MaxSpareServers 50 ServerLimit 500 #default 200 MaxClients 500 MaxRequestsPerChild 4000 </IfModule>
我在另一个较弱的服务器上使用相同的脚本运行相同的testing,并且失败的请求数量为零,并且testing速度更快。 所以我想知道这个有什么问题。
更新MySQLconfiguration:
variables
mysql> show variables LIKE '%connect%'; +--------------------------+-------------------+ | Variable_name | Value | +--------------------------+-------------------+ | character_set_connection | latin1 | | collation_connection | latin1_swedish_ci | | connect_timeout | 10 | | init_connect | | | max_connect_errors | 10 | | max_connections | 100 | | max_user_connections | 0 | +--------------------------+-------------------+
全局状态
mysql> SHOW GLOBAL STATUS LIKE '%connect%'; +--------------------------+---------+ | Variable_name | Value | +--------------------------+---------+ | Aborted_connects | 343 | | Connections | 1463797 | | Max_used_connections | 101 | | Ssl_client_connects | 0 | | Ssl_connect_renegotiates | 0 | | Ssl_finished_connects | 0 | | Threads_connected | 3 | +--------------------------+---------+
并发限制绝对在MySQL方面,尽pipe我不确定这对于实际性能来说肯定是一件坏事。 你有MySQL可以同时接受100个连接,所以最多只能有100个Apache实例同时对话。 由于您的testing脚本非常简单,因此它将大部分时间都用于连接到或至less连接到MySQL。 为其他状态的Apache进程添加一点点,并且在100的包围中获得并发性。我不确定为什么ab得到200的更高的并发级别,但也许它计算的东西是不同的。
如果你想让你的基准数字更高,只需要为MySQL设置更高的连接限制。 MySQL conn限制应该至less等于Apache进程的数量,这个进程是绝大多数时间都花费在DB上的。
不幸的是,你用真实的标准来衡量你的客户performance。 你需要一些更好的性能工具,如不杀死客户端主机的httperf。 如果你想运行真正的testing,你应该使用超过1个主机,或在某些情况下攻城也是一个好工具。 只要检查ab在做什么事实上,它可能会打开文件限制。 也很好,检查你的服务器configuration。
也许在MySQL方面有一些奇怪的事情发生。 在这种快速“创build数据库连接 – closures它”testing中容易发生的一件事情是,mysql_max_connection_errors填满了,默认情况下它只有10。
还有一件事:你是否已经检查过,你的弱(但工作)和这个更快(而不是工作)的服务器之间的最大连接限制是相等的? 也许100个同时MySQL连接的默认值填满了。