通过apache

时间:2016-04-18 00:53:18

标签: php mysql mediawiki load-testing internal-server-error

我已经设置了维基百科数据库:

  • 一(1)台主机正在运行mysqld,正在运行数据库;我已经安装了mariadb-server包。
  • 我在4个不同的表格中存储了1600万页(页面,文本,修订版,重定向;每个页面有1600万行,后者大约有700万行)。大小/var/lib/mysql/ibdata1:88 GiB。
  • 使用MediaWiki通过http服务器(apache2)提供请求,就像在wikipedia.org中一样。
  • 另一台机器上的一个单线程工作者通过http向数据库发送了2.31亿个请求,超时为200-500毫秒;许多单一请求即使在200毫秒时也会超时。

问题是,由于" HTTP 500"大多数请求都没有得到满足。 (内部服务器错误)。一些请求(100-200)可以毫无问题地提供,但是当启动请求超过1~39个请求时,我在大多数情况下都会收到内部服务器错误。

以下是正在进行的实验中的快照:

  • 38,086个请求:HTTP 200 OK
  • 1,200,226个请求:HTTP 500 Internal Server Error
  • 74,280个请求:超时

特别是,这是/var/log/apache2/error.log服务器上mysqld的一小段摘录:

[Mon Apr 18 02:42:43.492142 2016] [:error] [pid 70738] [client 172.16.96.23:41031] PHP Fatal error:  Maximum execution time of 30 seconds exceeded in /home/wikiadmin/mediawiki-1.26.2/includes/cache/LocalisationCache.php on line 262
[Mon Apr 18 02:42:53.184116 2016] [:error] [pid 70665] [client 172.16.96.23:57976] PHP Fatal error:  Maximum execution time of 30 seconds exceeded in /home/wikiadmin/mediawiki-1.26.2/includes/parser/Preprocessor_DOM.php on line 1123
[Mon Apr 18 02:43:19.389313 2016] [:error] [pid 70745] [client 172.16.96.6:38824] PHP Fatal error:  Maximum execution time of 30 seconds exceeded in /home/wikiadmin/mediawiki-1.26.2/includes/Sanitizer.php on line 1087
[Mon Apr 18 02:43:22.188122 2016] [:error] [pid 69251] [client 172.16.96.6:55869] PHP Fatal error:  Maximum execution time of 30 seconds exceeded in /home/wikiadmin/mediawiki-1.26.2/includes/title/MediaWikiTitleCodec.php on line 377
[Mon Apr 18 02:43:38.404148 2016] [:error] [pid 70919] [client 172.16.96.6:60524] PHP Fatal error:  Maximum execution time of 30 seconds exceeded in /home/wikiadmin/mediawiki-1.26.2/includes/parser/Preprocessor_DOM.php on line 1124
[Mon Apr 18 02:43:42.188143 2016] [:error] [pid 69534] [client 172.16.96.6:51519] PHP Fatal error:  Maximum execution time of 30 seconds exceeded in /home/wikiadmin/mediawiki-1.26.2/includes/parser/Preprocessor_DOM.php on line 1119
[Mon Apr 18 02:42:23.004116 2016] [:error] [pid 70550] [client 172.16.96.23:35259] PHP Fatal error:  Maximum execution time of 30 seconds exceeded in /home/wikiadmin/mediawiki-1.26.2/includes/Message.php on line 260

我正在寻找有关如何通过提供更多请求从服务器端改善这种情况的想法。作为一般的MySQL和数据库的完全新手,我已经进行了我的研究并遇到了不同的提议,例如(i)数据库分片; (ii)MySQL集群等;但是,由于存在这么多提案,我不确定应该采取哪个方向。

是MySQL问题还是HTTP / MediaWiki问题?

3 个答案:

答案 0 :(得分:2)

您正在执行的任务称为负载测试。您看到的结果完全在正常服务器行为范围内。

当请求超时时,表示您的Web服务器过载而无法响应TCP ​​/ IP请求超时限制内的请求。这是由客户端计算机控制的:您用来向Apache Web服务器发出请求的计算机。客户端计算机在放弃之前重试几次,这是依赖于操作系统的方式。具有标准配置的Windows机器需要72秒才能放弃。

当Apache服务器接受请求时会发生500错误,但是用PHP编写的媒体wiki代码在30秒限制之前没有完成。该限制是PHP配置的一部分。您可以通过编辑php.ini文件来更改它。但它无济于事。您的Web服务器计算机 - 运行Apache / PHP / mediawiki服务器的计算机严重超载,并尝试一次执行太多操作。如果你给PHP运行超过30秒,服务器将只是尝试一次做更多的事情,而且它们都需要更长的时间。

我无法从您的问题中判断您是使用MySQL还是MariaDb来托管您的数据库。但没关系。您没有收到错误,告诉您数据库在此负载下正在屈服。

这是你的网络服务器在负载下屈服。它似乎优雅地这样做...根据我的经验,您正在应用的负载完全能够导致Web服务器的硬崩溃。对我来说,这看起来像是一次成功的负载测试:测试以超时完成,但没有崩溃。

通常,运行您正在模拟的生产工作负载的系统使用多个负载均衡的Web服务器(每个运行Apache / PHP / mediawiki),它们都使用单个数据库。 AWS Elastic Beanstalk是负载平衡系统的一个示例。还有其他人。

将处理器核心或RAM添加到您的Web服务器计算机也可能有所帮助,但它无济于事。您需要多个服务器才能向外扩展。

其他人建议您避免浪费金钱和电力来扩展您的系统,使其比实际常规工作量大得多。这是一个明智的建议。

答案 1 :(得分:1)

这既不是mysql问题,也不是HTTP / mediawiki问题。从问题描述中可以看出,您没有足够的硬件来处理您发送的请求数量。

2.31亿请求很多。一个巨大的巨大。 1000个并行请求也是如此。您是否真的希望您的网站获得那么多?如果你这样做,你需要为它获得合适的硬件。

答案 2 :(得分:1)

与其他一些http服务器相比,Apache需要更多资源。阅读https://serverfault.com/questions/7778/suggest-a-lightning-fast-feature-light-secure-linux-web-server-to-serve-static以选择更好的http服务器。您可以启用opcache或使用php加速器。确保在php中使用mysqli或pdo而不是mysql。确保你的服务器上有足够的RAM,因此ram中的数据不必换掉。增加InnoDB的缓冲区大小。您还可以使用Google服务引擎等网络服务。那么你不必自己担心基础设施。