2012-02-23 103 views
2

在Linux上,對於使用pthread的C/C++程序,是否有辦法查看線程是如何安排在進程的生命週期中的?我想看看每個線程在哪個CPU上運行。我想看看線程什麼時候被搶佔(以及爲什麼)。如何在Linux中跟蹤pthread調度?

我們建立了一個測試環境,兩臺相同的機器運行相同的流程。有第三臺機器產生兩臺機器監聽的(「通過多播發送的)」時鐘「事件。機器的進程在每個時鐘都做一些事情,然後將結果發送給第三臺機器。這個想法是第三臺機器消除了時鐘同步問題(在兩臺相同的機器之間)。我們的期望是,回來的結果應該完全(或幾乎完全)同時。一般他們是。問題是,我們發現偶爾會出現尖峯,其中一個結果顯着延遲(所有結果的標準偏差爲10倍)。

我們正在尋找微秒級別的優化。在這個舞臺上,緩存未命中和線程喚醒時間成爲一個問題。衆所周知,所有進程中的線程總數都大於CPU內核的數量。

我懷疑這些尖峯被搶佔線程,線程CPU遷移(因此緩存未命中)偶爾的「完美風暴」造成的。在各種流程中,實際上只有兩三個「重要」線程在做時間敏感的工作。其餘的是輔助/支持線程,優先級較低。總的來說,重要/時間敏感線程的數量實際上等於(或少於)核心數量。

我懷疑解決方法是仔細分配重要線程到自己的核心,並將所有支持線程轉儲到自己的核心。但是這需要相當數量的開發工作,我想確認我的懷疑,然後再走這條路。

回答

1

strace - 跟蹤進程行爲的簡單工具,但似乎無法檢查覈心ID。需要修補內核,但更令人印象深刻的是,您可以準確知道每個內核正在做什麼,如上下文切換/中斷處理。

更新:由於馬修Desnoyers提到,lttng可以自2.6.36作爲Linux內核模塊,修補現在不需要內核。

+2

LTTng自2011年發佈LTTng 2.0以來並不需要內核修補。它是一組掛鉤到Linux內核跟蹤點的內核模塊。它支持Linux內核> = 2.6.36。 – 2016-09-16 17:32:21

+0

@MathieuDesnoyers很高興看到lttng的作者回復了這個。 – 2016-09-17 16:50:51

+0

關於您的評論更新的小小澄清:LTTng-modules項目不是Linux內核樹的一部分。它構建爲一組內核模塊(或者可以選擇內置到內核映像中)。它可以在沒有內核修補的情況下與香草內核> = 2.6.36一起使用,但它本身不是「在」內核源代碼樹中。 – 2016-10-06 20:19:24

0

在Linux中,你可以使用這個命令

pidstat -t -p <processid> 
    => will print the cpu info in which the process is running 

在我們的應用中使用以下命令來分配CPU的過程中獲得了線程的CPU信息/線程

taskset -c 1,3,11,12,13 <Binary> 

第一我們發現負載最少的CPU,然後分配的核心二進制(這應該是至少載)到CPU 剩下的進程將被分配給其他CPU的

+0

您也可以使用「taskset -p 」完成第一個示例。但是,使用taskset,您可以將進程分配給特定內核,但其他進程仍可以在這些內核上運行,除非該計算機的每個用戶都仔細檢查CPU分配情況。如果你的用戶很少/進程很少,這並不算太壞,但是如果你有很多用戶/進程,這就成了一個管理問題。您也可以考慮CPU屏蔽(「cset」),您可以在其中真正設置CPU內核互斥(包括內核)。 – Matt 2012-02-24 15:44:45