2016-04-18 47 views
4

請求我已經建立了數據庫維基百科其中:HTTP 500(內部服務器錯誤)通過Apache

  • 一(1)主機運行mysqld,運行數據庫;我已經安裝了mariadb-server包。
  • 我已經在4個不同的表(頁面,文本,修訂版,重定向;每個有1600萬行,後者約700萬)中存儲了1600萬頁。尺寸爲/var/lib/mysql/ibdata1:88 GiB。
  • 通過http服務器(apache2),使用MediaWiki提供請求,就像在wikipedia.org中一樣。
  • 在另一臺機器上的一個單線程worker通過http向數據庫發送了2.31億次請求,超時時間爲200-500毫秒;許多單個請求超時,即使在200毫秒。

問題是,由於「HTTP 500」(內部服務器錯誤),大多數請求未提供服務。一些請求(100-200)沒有問題,但是當啓動請求的請求數超過1'000時,我在大多數情況下會收到內部服務器錯誤。

這是一個正在進行的實驗過程中的快照:

  • 38086請求:HTTP 200 OK
  • 1200226請求:HTTP 500 Internal Server Error
  • 74280請求:超時

在這裏特別地,是從/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問題?

+1

結果並不令人意外。 – e4c5

回答

1

這既不是mysql問題,也不是HTTP/mediawiki問題。從您的問題描述中,您聽起來似乎沒有足夠的硬件來處理您發送的請求數量。

2.31億的請求是很多。巨大的巨大。 1000個並行請求也是如此。你真的期望你的網站能獲得那麼多嗎?如果你這樣做,你將需要爲它獲得合適的硬件。

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中的數據不必被換出。增加InnoDB的緩衝區大小。您還可以使用網絡服務,例如谷歌應用程序引擎。那麼你不必擔心自己的基礎設施。

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服務器發生嚴重崩潰。對我來說,它看起來像一個成功的負載測試:測試完成時超時但沒有崩潰。

通常運行的那種你模擬生產工作負荷的系統使用多個負載平衡Web服務器(每個正在運行的Apache/PHP /的mediawiki),它們都使用一個數據庫。 AWS Elastic Beanstalk是負載均衡系統的示例。還有其他人。

將處理器內核或RAM添加到您的Web服務器機器上也可能會有所幫助,但它不會有太大幫助。您需要多臺服務器才能擴展。

其他人建議您避免浪費金錢和電力來擴展您的系統,使其遠遠大於您的實際日常工作量。這是一個明智的建議。