PHP + Apache 漫長的等待時間
在對我的專用網路伺服器進行故障排除時,我遇到了一些困難。最近,我的網站每秒請求量激增,然後崩潰了。
原裝盒子有 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 不呼叫任何include
s 也不與 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