小弟幫公司在中華電信的 hicloud 主機架設網站,作業系統 Windows Server 2019,網站是用 Apache+PHP+MySQL 執行。過去應該是因為流量不大所以一直都還正常運作,前幾天公司小編突然在 Line@ 推播這個網站,造成同時間比較大量的連線(經查大約180個接收者在同1分鐘內按下網址連結),結果網站就變得非常非常慢,後來還有出現 520 錯誤的狀況。當下觀察 server 上的硬體負載,我無法看出瓶頸是在哪個環節。如附圖所示,持續好久一段時間,CPU維持在30%上下的負載,記憶體也只用了一半(4G)。遇到反應變慢,本想說預算還可以就增加硬體,但我現在反而怕加了沒有用。
小弟好奇的是:
小弟實在想不通箇中奧妙,還請各位先進幫忙解惑,感謝!!
------------------------------------補充與回覆-------
針對各位前輩的提示,進一步把小弟手邊的資料提供協助診斷:
1.
關於 apache error log 紀錄到的東西,有好幾筆一樣的如下:
[Mon Jan 04 17:36:57.908390 2021] [:error] [pid 11204:tid 4968] PHP Fatal error: Maximum execution time of 300 seconds exceeded in C:\AppServ\www\lib\browser_filter.php on line 13
這個php檔案用到「get_browser()」函式,我有查到這個會造成CPU負擔,因此已經決定要移除該項目。但是....但是....我還是很疑惑如果需要大計算量,怎讓 60% CPU 閒著不拿去用??
hicloud好像不會回答我SESSION峰值的問題,因為我租一台裝好作業系統的SERVER,其餘網站環境都是自行用 AppServ 為基礎,然後再自己升級其中的 apache 與 php。hicloud客服會說這不是他們服務範圍......
cache的東西我不是很懂,但有透過 Cloudflare 來處理(這樣算嗎?)。下圖是慘劇發生當天 Cloudflare 的紀錄,似乎有幫我減少了很多從自己主機出去的流量,這樣算是有處理 cache 了嗎?
網站狀況出在 IO 的事,我也有去搜尋。這也是不懂的部份....慘劇發生當下的設定 httpd.conf 設定是:
Include conf/extra/httpd-mpm.conf (此項有開)
然後在 httpd-mpm.conf 中有設定(未列出的應該都自動取預設值):
ThreadPerChild 4000
MaxConnectionsPerChild 0
這些都是之前遇到問題時,去網站上搜尋拼湊來的,沒有完整的知識,也不知道這樣的設定會不會很搞笑就是了。但設定的值應該夠高,apache 也能正常啟動,所以我自己猜測應該不是向網站的請求數太多接不進來,而是接進來後沒能力處理(單純個人想像)。
真的很同意 @浩瀚星空 說的:「環境的架設是一門學問。」我只是稍微會寫點網頁,公司剛好也給我機會去做看看,然後網頁放上去後才發現環境問題真是深奧....
我稍晚還有寫了一個跑10000000個迴圈算數學的小程式去跑跑看,這次把「資源監視器」開啟來看每個CPU的 loading 狀態(SERVER有4個CPU),發現總體CPU最高還是用 30+%,且每個個別的 CPU 也都是這個負載量。原本還以為30%是只用一顆CPU在跑,結果是每顆都有用,但都不好意思用太多.......真是奧妙與不解~
再次感謝各位前輩多方提示,只是目前我的疑問還是沒有想通....
任何一個web server及php的應用。都有其環境的規劃設定。
如連線數、最大記憶體用量、post數。session峰值......等等等。
要如何搭配這些是需要自行去做調整的。
apache 來說,我記得他有對應的設定值可以給你使用設定。
你可以找找 httpd-????.conf 這一類的東西。
php.ini也有其對應的範例可供你設定。
預設的設定值,大多是依2g的記憶體在做調整。
進線數也會調在安全值。
如何調整這些環境設定值,大多數都是需要經驗了。
不能一股腦的全部調高。因為容易造成主機崩潰。
調太低則會像你這樣,效能無法全力運做。
連線數則需要考量到你的網路情況。及容許的程度。
總之。環境的架設是一門學問。
我只能簡單的說明給你。
其實說老實話,一般window系統。我大多會直接讓它跑在iis上。開模組來跑php。
直接跑 apache 真的很操。且核心控制上也不好處理調整。
我個人是已經沒在用apache來做我的web server了。
現在都是用nginx了。
認真來說,用過nginx就回不去了。
而且window版的nginx,在應用及效能上也也遠比apache好很多。
且很久之前了解。apache有一段時間一直沒做更新。(window版的)
現在情況如何我就不清楚了。因為我用nginx用了快8年了。
早就忘了 apache 的存在了。
至於你說想了解的東西。基本上來說這還需要了解到進程相關及很多的知識。且你所看到的數據,都是平均值居多。
主機寄人籬下卻又沒辦法問清楚的話這樣就比較苦惱,但可以做一些目前能做的事情