簡體   English   中英

如何在Linux中跟蹤pthread調度?

[英]How to trace pthread scheduling in Linux?

在Linux上,對於使用pthread的C / C ++程序,是否有辦法查看在進程生命周期中如何計划線程? 我想看看每個線程在哪個CPU上運行。 我想看看線程何時被搶占(為什么)。

我們建立了一個測試環境,其中兩個相同的機器運行相同的進程。 第三台機器生成“時鍾”事件,兩台機器都監聽(通過多播發送)事件。 機器的進程在每個時鍾執行一些操作,然后將結果發送到第三台機器。 這個想法是第三台機器消除了時鍾同步問題(在兩台相同的機器之間)。 我們的期望是返回的結果應該在同一時間(或幾乎完全相同)。 通常,它們是。 問題是,我們偶爾會出現尖峰,其中一個結果會大大延遲(大約是所有結果的標准偏差的10倍)。

我們正在研究微秒級的優化。 在這個領域,緩存未命中和線程喚醒時間成為一個問題。 眾所周知,所有進程中的線程總數大於CPU內核數。

我懷疑這些峰值是由線程搶占,線程-CPU遷移(因此導致緩存未命中)的偶然“完美風暴”引起的。 在各個過程中,實際上只有兩個或三個“重要”線程在進行對時間敏感的工作。 其余的是輔助/支持線程,優先級較低。 總的來說,重要/對時間敏感的線程數實際上等於(或少於)核心數。

我懷疑對此的解決方案是將重要的線程仔細分配給自己的核心,並將所有支持線程轉儲到自己的核心上。 但這需要大量的開發工作,我想在走這條路之前確認自己的懷疑。

strace-跟蹤進程行為的簡單工具,但似乎無法檢查核心ID。

lttng-需要修補內核,但更令人印象深刻的是,您可以確切地知道每個內核在做什么,例如上下文切換/中斷處理。

更新:正如Mathieu Desnoyers所述,從2.6.36開始,lttng可以用作Linux內核模塊,現在不需要內核修補程序。

在Linux中,您可以使用以下命令獲取線程的cpu信息

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

在我們的應用程序中,我們使用以下命令將cpu分配給進程/線程

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

首先,我們找到負載最小的cpu,然后將核心二進制文件(應該是負載最小的)分配給該cpu。其余進程將分配給其他CPU

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM