Apache-2.2

PHP + Apache 漫長的等待時間

  • January 4, 2014

在對我的專用網路伺服器進行故障排除時,我遇到了一些困難。最近,我的網站每秒請求量激增,然後崩潰了。

原裝盒子有 8GB 記憶體、8 核 Xeon E3-1230、1TB 7,200 RPM 磁碟(無 Raid)、100Mbit 專用網路。

峰值之後,我將 RAM 增加到 24GB 以支持更多並髮使用者。

Apache 似乎處理得很好,即使有 3000 個並髮使用者,它也會很快返回 HTML 和靜態內容(未記憶體)。

為了進一步測試 Apache/HTML 和 Apache/PHP 之間的差異,我執行了ab.

兩者都test.html具有test.php完全相同的靜態內容,PHP 不呼叫任何includes 也不與 MySQL 連接。

HTML 測試

ab -n 500 -c 50 http://www.~~.com/test.html

Connection Times (ms)
             min  mean[+/-sd] median   max
Connect:      252  375 190.3    276    1399
Processing:   254  354 121.5    282     657
Waiting:      253  353 121.4    280     653
Total:        510  730 231.7    573    1675

PHP 測試

ab -n 500 -c 50 http://www.~~~.com/test.php

Connect:      248  275  51.1    267    1316
Processing:   256 4167 6210.2   2262   41489
Waiting:      253 4166 6210.2   2262   41489
Total:        509 4442 6212.4   2523   41754

Pingdom 還報告在訪問 PHP 腳本時等待時間過長。 在此處輸入圖像描述

我在 WebPageTest.org 上得到了類似的結果,雖然更好,但第一次 byte 是F

          Load Time   **First Byte**   Start Render    DOM Elements    Time    Requests    Bytes In    Time    Requests    Bytes In
First View  2.061s  **0.839s**  0.000s  55  2.061s  20  428 KB  2.061s  20  430 KB

這是我的top結果: 在此處輸入圖像描述

輸入輸出測試

在重負載下,wa% 可以在幾毫秒內增加到 95%。

我在載入期間執行 iostat:

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
          8.37    0.00    5.18    0.56    0.00   85.88

Device:         rrqm/s   wrqm/s   r/s   w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
sda               0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sda1              0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sdb               0.00    45.50  3.00 48.00   136.00   748.00    17.33     3.05   59.76   2.53  12.90
sdb1              0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sdb2              0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sdb3              0.00    45.50  3.00 48.00   136.00   748.00    17.33     3.05   59.76   2.53  12.90

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
          4.00    0.00    3.56    0.69    0.00   91.75

Device:         rrqm/s   wrqm/s   r/s   w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
sda               0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sda1              0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sdb               6.00   118.50  9.50 21.00   996.00  1116.00    69.25     0.29    9.44   1.66   5.05
sdb1              0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sdb2              0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sdb3              6.00   118.50  9.50 21.00   996.00  1116.00    69.25     0.29    9.44   1.66   5.05

對我來說,這看起來不錯,但我可能會遺漏一些東西。

我正在使用FCGI

<IfModule mod_fcgid.c>
FcgidMaxRequestLen 1547483648
FcgidMaxRequestInMem 52485760
FcgidIdleScanInterval 15000
FcgidBusyTimeout 15000
FcgidProcessLifeTime 7200
FcgidConnectTimeout 1800
FcgidIOTimeout 1800
PHP_Fix_Pathinfo_Enable 1
FcgidMaxRequestsPerProcess 1000
</IfModule>

這是我的 Apache Conf(我使用的是 2.4.x)

Timeout 60
TraceEnable Off
ServerSignature Off
ServerTokens ProductOnly
FileETag None
StartServers 10
<IfModule prefork.c>
MinSpareServers 5
MaxSpareServers 15
</IfModule>
<IfModule itk.c>
MinSpareServers 5
MaxSpareServers 15
</IfModule>
ServerLimit 2200
MaxRequestWorkers 2000
MaxConnectionsPerChild 15000
KeepAlive On
KeepAliveTimeout 1
MaxKeepAliveRequests 2000

我查看了我的 Apache 錯誤日誌和訪問日誌。沒有什麼奇怪的報告。

我真的在這裡撓頭。

我試過關閉防火牆。

我試過增加最大連接數。

我優化了 mySQL 並刪除了許多慢查詢(>0.5 秒)。

我還能做什麼,有什麼我可以用來幫助辨識問題的嗎?任何幫助將不勝感激。

PS:

值得注意的是,即使伺服器被大量訪問,PHPMyAdmin 和 cPanel 仍然非常敏感。除了網站上的 PHP,似乎沒有其他東西落後。

我認為您的問題只是您的硬碟及其訪問時間。Apache 可以在記憶體中記憶體 html-pages,但是 php-scripts 不會被記憶體;每次都需要再次執行。因此呼叫 php 解釋器並從硬碟讀取腳本。這需要很多時間。伺服器上最慢的東西是硬碟。在我的電腦上,從我的 SSD 和我的 HDD 開始的應用程序之間存在巨大差異(SSD 快 10 倍!)。如果您的 HDD 工作正常,則執行 php 腳本的延遲可能會急劇增加。

可能的解決方案:獲得一個 SSD(可能是一個小型 SSD,僅用於經常訪問的數據,例如腳本)並最大限度地減少伺服器上的腳本呼叫(和 HDD 訪問)。確保對文件系統進行碎片整理(通常自動完成)。如果您的 php 腳本經常創建相同的內容,請嘗試將它們記憶體到 html 文件中。

這個答案也可以幫助你:https ://stackoverflow.com/questions/4181865/apache-php-caching

引用自:https://serverfault.com/questions/564984