数据库
首页 > 数据库> > php – 通过apache并发MySQL请求的HTTP 500(内部服务器错误)

php – 通过apache并发MySQL请求的HTTP 500(内部服务器错误)

作者:互联网

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

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

问题是,由于“HTTP 500”(内部服务器错误),大多数请求都没有得到满足.一些请求(100-200)没有问题,但是当启动超过~1000个请求的请求时,我在大多数情况下都会收到内部服务器错误.

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

> 38,086次请求:HTTP 200 OK.
> 1,200,226个请求:HTTP 500内部服务器错误
> 74,280请求:超时

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

[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问题?

解决方法:

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

当请求超时时,表示您的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服务器计算机也可能有所帮助,但它没有多大帮助.您需要多个服务器才能向外扩展.

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

标签:php,mysql,load-testing,mediawiki,internal-server-error
来源: https://codeday.me/bug/20190623/1269404.html