在Linux上,對於使用pthread的C/C++程序,是否有辦法查看線程是如何安排在進程的生命週期中的?我想看看每個線程在哪個CPU上運行。我想看看線程什麼時候被搶佔(以及爲什麼)。如何在Linux中跟蹤pthread調度?
我們建立了一個測試環境,兩臺相同的機器運行相同的流程。有第三臺機器產生兩臺機器監聽的(「通過多播發送的)」時鐘「事件。機器的進程在每個時鐘都做一些事情,然後將結果發送給第三臺機器。這個想法是第三臺機器消除了時鐘同步問題(在兩臺相同的機器之間)。我們的期望是,回來的結果應該完全(或幾乎完全)同時。一般他們是。問題是,我們發現偶爾會出現尖峯,其中一個結果顯着延遲(所有結果的標準偏差爲10倍)。
我們正在尋找微秒級別的優化。在這個舞臺上,緩存未命中和線程喚醒時間成爲一個問題。衆所周知,所有進程中的線程總數都大於CPU內核的數量。
我懷疑這些尖峯被搶佔線程,線程CPU遷移(因此緩存未命中)偶爾的「完美風暴」造成的。在各種流程中,實際上只有兩三個「重要」線程在做時間敏感的工作。其餘的是輔助/支持線程,優先級較低。總的來說,重要/時間敏感線程的數量實際上等於(或少於)核心數量。
我懷疑解決方法是仔細分配重要線程到自己的核心,並將所有支持線程轉儲到自己的核心。但是這需要相當數量的開發工作,我想確認我的懷疑,然後再走這條路。
LTTng自2011年發佈LTTng 2.0以來並不需要內核修補。它是一組掛鉤到Linux內核跟蹤點的內核模塊。它支持Linux內核> = 2.6.36。 – 2016-09-16 17:32:21
@MathieuDesnoyers很高興看到lttng的作者回復了這個。 – 2016-09-17 16:50:51
關於您的評論更新的小小澄清:LTTng-modules項目不是Linux內核樹的一部分。它構建爲一組內核模塊(或者可以選擇內置到內核映像中)。它可以在沒有內核修補的情況下與香草內核> = 2.6.36一起使用,但它本身不是「在」內核源代碼樹中。 – 2016-10-06 20:19:24