在第三方虛擬服務器上檢查客戶端的應用程序我注意到一個有趣的現象: 單個PHP進程似乎使用多個核心。據我所知,PHP無法做到這一點。PHP如何使用超過100%的CPU?
行爲描述
這裏的HTOP處理一個請求的Web應用程序時的輸出:
HTOP的輸出,綠色福利用戶的CPU和紅色表示系統CPU
所有四核處於100%,只有一個PHP進程在396%的CPU和內存使用率很低。
我已經使用strace或pidstat調查了高系統cpu,但找不到任何IO問題。
服務器信息
虛擬服務器是使用Intel的VT-X虛擬化和Virtuozzo的在560兆赫提供4個內核一個的Debain LAMP環境:
lscpu的輸出
該服務器在Apache 2.4.7(prefork)服務的快速CGI中運行PHP 5.5.9。 Nginx 1.9.4作爲reverese代理,Plesk 12.5用於配置服務器。
示例PHP代碼(編輯)
爲了排除應用代碼作爲我使用簡單的代碼確認行爲源:
$array = array('z', 'y', 'x', 'h', 'd', 's', 'w', 'q', 'a');
for ($i=0; $i < 9999999; $i++) {
sort($array); // Delaying execution
}
echo 'loop ended';
兩個或更多個PHP進程(編輯) 如果同時處理兩個或多個請求,則每個進程在儘可能多的內核上運行(2個進程=> 2個內核,3個進程=> 1.33個內核)。
問題
- 是否有可能爲PHP同時使用一個以上的核心是什麼?
- 可能這與虛擬化有關?
- 後續行動:系統CPU使用率佔優勢的原因是什麼?
這肯定是由PHP內部運行的代碼引起的。它運行的是什麼? – Will
感謝您的意見,Will。 我已經用一個簡單的for循環測試了行爲,並且可以確認它。我在這個問題中加入了測試用例。 – PvB
啊,明白了!謝謝。老實說,如果我們排除了代碼,我們可能需要將它遷移到ServerFault,因爲它可能會在那裏獲得正確的眼睛。據我所知,一個PHP FastCGI worker不能使用多個內核。但是,理論上,Linux調度程序可以在CPU之間切換進程。嗯... – Will