我目前正在測試我放在一起的服務器設置的負載能力。 apache2服務器上安裝了PHP 5.X,並且它連接到單獨計算機上的主數據庫,然後連接2個從服務器中的1個進行讀取。PHP生成頁面,但沒有立即將它們返回給用戶
如果我自己調用它,我的測試頁需要0.2秒才能生成。我在不同的服務器上創建了一個php腳本,可以同時創建65個測試頁面。測試頁面會在整個頁面中使用microtime基準測試,讓我知道每個部分正在使用多長時間。正如所料 - 至少對我來說,如果任何人對此有任何意見或建議,請隨時評論,那麼頁面的SQL部分需要一小段時間才能收到第一對請求,然後降級,因爲其餘部分查詢堆積起來,必須等待。我認爲這可能是磁盤IO問題,但在固態驅動器上測試時會出現同樣的情況。
我的問題是,65個頁面中大約30個左右的頁面被創建,並且按照我的預期被我的測試腳本加載。我的基準測試表明,該頁面是在3秒內創建的,而我的測試腳本表示它在3.1秒內完全收到頁面。差別不大。問題是,對於其他請求,我的基準測試表示頁面在3秒內加載完畢,但測試腳本在6秒之前沒有完整收到頁面。這是由apache服務器生成的頁面之間的整整3秒鐘,併發送回我的測試腳本請求它。爲了確保它不是測試腳本的問題,我嘗試在本地瀏覽器運行時加載頁面,並在Chrome中通過時間線窗口收到相同的延遲。
我已經嘗試了Apache的各種配置,但似乎無法找到造成這種延遲的原因。我最近的嘗試如下。該機器是一款四核AMD 2.8Ghz,內存爲2Ghz。任何幫助配置,或其他建議,如何做,將不勝感激。 - 對於長期問題抱歉。
我應該提到,我在腳本運行時監視了資源,並且CPU的負載最高達到了9%,並且總是至少有1個ram空閒。
我還會提到,當我查詢的所有內容都是靜態HTML頁面時,就會發生同樣類型的事情。第一對夫婦需要X秒,然後慢慢增加到3秒。
LockFile ${APACHE_LOCK_DIR}/accept.lock PidFile ${APACHE_PID_FILE} Timeout 120 MaxClients 150 KeepAlive On KeepAliveTimeout 4 MaxKeepAliveRequests 150 Header always append x-frame-options sameorigin StartServers 50 MinSpareServers 25 MaxSpareServers 50 MaxClients 150 MaxRequestsPerChild 0 User ${APACHE_RUN_USER} Group ${APACHE_RUN_GROUP} AccessFileName .httpdoverride Order allow,deny DefaultType text/plain HostnameLookups Off ErrorLog ${APACHE_LOG_DIR}/error.log LogLevel warn Include mods-enabled/*.load Include mods-enabled/*.conf Include httpd.conf Include ports.conf LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined LogFormat "%h %l %u %t \"%r\" %>s %O" common LogFormat "%{Referer}i -> %U" referer LogFormat "%{User-agent}i" agent Include conf.d/ Include sites-enabled/ AddType application/x-httpd-php .php AddType application/x-httpd-php-source .phps SecRuleEngine On SecRequestBodyAccess On SecResponseBodyAccess Off SecUploadKeepFiles Off SecDebugLog /var/log/apache2/modsec_debug.log SecDebugLogLevel 0 SecAuditEngine RelevantOnly SecAuditLogRelevantStatus ^5 SecAuditLogParts ABIFHZ SecAuditLogType Serial SecAuditLog /var/log/apache2/modsec_audit.log SecRequestBodyLimit 131072000 SecRequestBodyInMemoryLimit 131072 SecResponseBodyLimit 524288000 ServerTokens Full SecServerSignature "Microsoft-IIS/5.0"
UPDATE: 看來很多的響應正專注於一個事實,即SQL是罪魁禍首。所以我在這裏指出,同樣的行爲發生在一個靜態的HTML頁面上。基準測試的結果列在下面。
Concurrency Level: 10 Time taken for tests: 5.453 seconds Complete requests: 1000 Failed requests: 899 (Connect: 0, Receive: 0, Length: 899, Exceptions: 0) Write errors: 0 Total transferred: 290877 bytes HTML transferred: 55877 bytes Requests per second: 183.38 [#/sec] (mean) Time per request: 54.531 [ms] (mean) Time per request: 5.453 [ms] (mean, across all concurrent requests) Transfer rate: 52.09 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 21 250.7 0 3005 Processing: 16 33 17.8 27 138 Waiting: 16 33 17.8 27 138 Total: 16 54 253.0 27 3078 Percentage of the requests served within a certain time (ms) 50% 27 66% 36 75% 42 80% 46 90% 58 95% 71 98% 90 99% 130 100% 3078 (longest request)
我還會說我通過使用PHP和microtime()確定頁面正在生成之前發生滯後。我通過生成頁面和接收它的測試腳本之間的時間差異來確定這一點。差異是一致的,這意味着從頁面生成點到我的測試頁收到的點的時間長度相同,無論整個請求花了多長時間。
謝謝所有回覆。一切都很好,我不能說他們中的任何一個都解決了這個問題。
嘗試更高的StartServers和MinSpareServers。根據我的經驗,當apache突然爆發流量時,可能需要一段時間才能啓動額外的線程。在宏偉的方案中,通過快速反向代理(nginx)進行代理以更快地響應連接並更快地釋放apache線程。更好的是,使用魷魚/清漆緩存頁面,這樣您就不會浪費資源生成幾百次完全相同的內容。 – 2011-05-27 18:55:58
啊,剛剛注意到了關於數據庫的一點。 1)儘可能避免寫入2)確定哪些查詢正在減速3)緩存以完全避免數據庫訪問。我會做一些基準測試 - 爲每個查詢記錄查詢時間,並生成所有查詢運行的列表,在請求期間從最慢到最快排序。 – 2011-05-27 19:00:35
好問題,只屬於不同的網站。 – 2011-05-27 19:01:07