2016-01-24 129 views
8

在第三方虛擬服務器上檢查客戶端的應用程序我注意到一個有趣的現象: 單個PHP進程似乎使用多個核心。據我所知,PHP無法做到這一點。PHP如何使用超過100%的CPU?

行爲描述
這裏的HTOP處理一個請求的Web應用程序時的輸出: Output of htop
HTOP的輸出,綠色福利用戶的CPU和紅色表示系統CPU

所有四核處於100%,只有一個PHP進程在396%的CPU和內存使用率很低。
我已經使用strace或pidstat調查了高系統cpu,但找不到任何IO問題。

服務器信息
虛擬服務器是使用Intel的VT-X虛擬化和Virtuozzo的在560兆赫提供4個內核一個的Debain LAMP環境:

Output of lscpu
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使用率佔優勢的原因是什麼?
+2

這肯定是由PHP內部運行的代碼引起的。它運行的是什麼? – Will

+0

感謝您的意見,Will。 我已經用一個簡單的for循環測試了行爲,並且可以確認它。我在這個問題中加入了測試用例。 – PvB

+1

啊,明白了!謝謝。老實說,如果我們排除了代碼,我們可能需要將它遷移到ServerFault,因爲它可能會在那裏獲得正確的眼睛。據我所知,一個PHP FastCGI worker不能使用多個內核。但是,理論上,Linux調度程序可以在CPU之間切換進程。嗯... – Will

回答

0
  • PHP可以同時使用多個內核嗎?

是的,它被稱爲pthreads。它旨在在PHP中實現真正的多線程。

  • 這可能與虛擬化有關嗎?

不太可能。我認爲和Will說的一樣,這可能是由php發起的一個子進程。

  • 後續問題:系統CPU使用率佔優勢的原因是什麼?

它與應用程序完全綁定。但是任何由PHP發起的多核心任務都可能出現這種情況。一個用於柵格化一桶svg圖像的java應用程序。

+0

OP編輯了這篇文章,並解釋說即使使用簡單的for循環也會發生這種情況。所以我不認爲涉及pthreads。但是,由於某種原因,Linux調度程序可能會將其切換到CPU?該腳本似乎沒有任何形式的多核心。 – Will

+0

@JesusTheHun:謝謝你的回答。在這種情況下,Pthread不存在問題。它甚至用簡單的for循環來做。但是我會將問題轉移到服務器故障上,因爲Will建議,因爲這實際上與代碼無關。 – PvB

+0

您可以在這裏發佈您的調查結果嗎?我對答案感興趣。 – JesusTheHun