iT邦幫忙

2

PHP 程式遇到較多人同時連線時回應變很慢或報 520 錯誤,但觀察 httpd.exe 卻只利用了30%左右的CPU

小弟幫公司在中華電信的 hicloud 主機架設網站,作業系統 Windows Server 2019,網站是用 Apache+PHP+MySQL 執行。過去應該是因為流量不大所以一直都還正常運作,前幾天公司小編突然在 Line@ 推播這個網站,造成同時間比較大量的連線(經查大約180個接收者在同1分鐘內按下網址連結),結果網站就變得非常非常慢,後來還有出現 520 錯誤的狀況。當下觀察 server 上的硬體負載,我無法看出瓶頸是在哪個環節。如附圖所示,持續好久一段時間,CPU維持在30%上下的負載,記憶體也只用了一半(4G)。遇到反應變慢,本想說預算還可以就增加硬體,但我現在反而怕加了沒有用。
小弟好奇的是:

  1. 如果工作量很大,為何 CPU、RAM 不盡量利用,放著一大半閒置?
  2. PHP或Apache難道要另外做設定才會多利用閒置的資源?若是,要如何設定?

小弟實在想不通箇中奧妙,還請各位先進幫忙解惑,感謝!!

https://ithelp.ithome.com.tw/upload/images/20210107/201102310JB25QzToI.png

------------------------------------補充與回覆-------
針對各位前輩的提示,進一步把小弟手邊的資料提供協助診斷:
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 了嗎?
https://ithelp.ithome.com.tw/upload/images/20210107/20110231aJiWIGvJFX.jpg

網站狀況出在 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在跑,結果是每顆都有用,但都不好意思用太多.......真是奧妙與不解~

再次感謝各位前輩多方提示,只是目前我的疑問還是沒有想通....

看更多先前的討論...收起先前的討論...
先看看 apache error log 還提供了什麼資訊
問過hicloud 單一時間SESSION峰量是多少嘛,看起來同時間 180 應該是OVER了
player iT邦大師 1 級 ‧ 2021-01-07 15:27:33 檢舉
看網路流量,還有你的PHP程式的複雜度而定,有些人寫的PHP沒有使用網頁快取機制,等於每一個User都得跑進完整的處理流程(當然資料庫也有可能是另一個瓶頸)
黃彥儒 iT邦高手 1 級 ‧ 2021-01-07 15:59:30 檢舉
看來樓主應該連基本的快取都沒做的感覺
網站大部份的狀況出在IO,而不能全怪CPU啊啊啊啊啊啊啊啊啊啊啊啊啊~
echochio iT邦高手 1 級 ‧ 2021-01-08 08:20:51 檢舉
大約180個接收者在同1分鐘內按下網址連結,這個量算小耶
連線數吃記憶體及IO , 不太吃 CPU
基本上 每秒幾百個連線都不易掛
, line 是個 攻擊沒錯, 就是打開已讀就會瀏覽一次
建議 windows 用 iis 效能好很多
Apache 用 Linux 效能比較好
考量用 nginx , 吞吐量大可以試試
froce iT邦大師 1 級 ‧ 2021-01-08 10:48:23 檢舉
這不一定是硬體資源不夠,很有可能是網站設計不良,某個功能佔用大量I/O但是其實CPU是閒置的。

解決法:加thread或是改成異步的程式設計。
fillano iT邦超人 1 級 ‧ 2021-01-08 11:41:04 檢舉
apache的access log格式很簡單,即使找不到工具,也可以自己寫parser來做統計, 雖然不能說很精準,但是多少可以評估一下到底可能的問題出在哪裡。

如果問題可能是出在php,那可以打開xdebug的profiling相關設定(開發機上,這個對效能衝擊太大),操作一下網站的相關功能,然後打開記錄檔(網上應該可以找到一些檢視器)看看到底哪支程式或函數等可能有效能的問題之類。

另外沒看到你提PHP版本?opcache有沒有開?這些都會影響效能...總之你需要有數據來評估,然後找問題。
PHP Fatal error: Maximum execution time of 300 seconds exceeded 參考解法如下
https://www.itdaan.com/tw/ae8754d0f81b579c9bb50c008712eb97
rayyen iT邦新手 5 級 ‧ 2021-01-10 22:05:33 檢舉
回覆 @fillano,小弟的環境是 PHP 7.0.8,Apache 2.4.23。php.ini 中查不到「opcache」,猜測是沒開吧~這是什麼我倒沒聽過,需要去查找一下相關資訊,也希望前輩不吝賜教!
rayyen iT邦新手 5 級 ‧ 2021-01-10 22:09:55 檢舉
回覆 @窮嘶發發發,感謝提供資訊!但因為發生該錯誤訊息的地方是執行「get_browser()」函式造成,後來我想不需要做這件事了,所以會把他拿掉,或許就不會出現該錯誤。即使有其他的地方出現執行300秒的問題,我想應該要先把程式改掉,否則讓用戶等300秒也不是辦法......因此我不打算透過延長300秒限制來解決問題。

2 個回答

5
浩瀚星空
iT邦超人 1 級 ‧ 2021-01-07 15:30:08

任何一個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 的存在了。

至於你說想了解的東西。基本上來說這還需要了解到進程相關及很多的知識。且你所看到的數據,都是平均值居多。

froce iT邦大師 1 級 ‧ 2021-01-08 15:17:10 檢舉

雖然我也是nginx派的,但最近想來看看 Caddy2。
nginx windows版的記憶中好像不支援中文路徑。

倒也不是不支援中文路徑,只是會有編碼方面的問題。
不過因為我從來不用中文檔名跟目錄名。
所以也沒這樣的困擾就是了。

caddy有在玩了。只是不知道是不是你說的caddy2就是了。
原則上感覺是給不太會設定server的人用的。
對我來說並不太需要特別再去換掉。
所以沒很深入研究。
反正用nginx目前來說也沒很大的問題在。

rayyen iT邦新手 5 級 ‧ 2021-01-10 21:56:03 檢舉

nginx 有聽過,caddy 連聽都沒聽過......看來都不是我短時間可以上手的方案,真是學不完阿......

1
耿直小伙
iT邦新手 3 級 ‧ 2021-01-11 11:58:41

主機寄人籬下卻又沒辦法問清楚的話這樣就比較苦惱,但可以做一些目前能做的事情

  1. 開啟 opcache:可讓 php 執行程式不用每次解析,windows 下的 php 先檢查有沒有 php_opcache.dll 或 opcache.dll 這類的檔案,enable 後才可啟用
  2. 圖片 cache:圖片或其他靜態資源
  3. 資料 cache:從資料庫或檔案大量讀出的資料,前提是這些資料不需要經常變動
  4. 資料庫查詢優化:可以先依你對自己網站的了解,判斷哪些頁面的資料庫查詢緩慢,將 sql 打印出來並善用 explain 查詢索引使用狀況
  5. server 環境參數:這一點跟你提到的如何讓閒置的60% cpu 充分利用有很大關聯,雖然重要,但就像其他資深邦友們所說環境架設很依賴經驗,所以還是要花時間反覆嘗試提高連線、請求數的參數
rayyen iT邦新手 5 級 ‧ 2021-01-11 13:14:12 檢舉

前面資深邦友提到 opcache 後,我有去大概查了一下,然後在測試機上設定後 apache 重啟成功,所以應該是可行的。接著期待在正式機上設定後能有顯著效能提昇!您所提的 3、4 我會再仔細查查看。至於5嘛......我只是學學網頁程式開發,沒想到系統環境面的東西也要懂那麼多那麼深,真是學不完阿~~看後續造化了

感謝前輩指點!

我要發表回答

立即登入回答