2012-02-29 56 views
5

我們正在開發一個多線程應用程序,它在多個流水線階段中進行繁重的數據包處理。該應用程序是在Linux下的C語言。分析和剖析多線程應用程序

整個應用程序工作正常,沒有內存泄漏或線程安全問題。但是,爲了分析應用程序,我們如何分析和分析線程?

尤其這裏是我們感興趣的是:

  1. 每個線程
  2. 與線程是具有爭獲取鎖由於開銷
  3. 金額的頻率和時間進行資源使用同步
  4. 系統中的任何瓶頸
  5. 什麼是我們可以得到的最佳系統吞吐量

相同的最佳技術和工具有哪些?

+2

您是否嘗試過任何商業工具?例如:http://software.intel.com/en-us/articles/intel-parallel-studio-xe/ – Jayan 2012-02-29 16:16:27

回答

0

1)不知道。有一些可用於Linux的分析器。 2)如果你正在流水線化,每個階段都應該做足夠的工作來確保P-C隊列上的爭用是最小的。您可以在一些時間點上進行挖掘 - 如果某個階段需要10ms +來處理數據包,則可以忽略爭用/鎖定問題。如果需要100uS,你應該考慮合併幾個階段,這樣每個階段都可以做更多的工作。

3)與(2)相同,除非與某些全局數據或其他方面存在單獨的同步問題。

4)每秒鐘轉儲/記錄隊列計數將很有用。最長的隊列將在最窄的階段之前。 5)不知道 - 不知道你當前的系統是如何工作的,它運行的是什麼硬件等等。有一些'正常的'優化 - 消除了帶有對象池的內存管理器調用,使用最重的CPU負載,類似的事情,但'什麼是我們可以得到的最好的系統吞吐量' - 太空靈了。

1

幾年前,我在類似的系統上工作過。以下是我的做法:

第1步。擺脫單個線程中不必要的佔用者。爲此,我使用了this technique。這很重要,因爲整個消息傳遞系統受其部件速度的限制。

第2步。這部分是艱苦的工作,但它的回報。對於每個線程,打印一個帶時間戳的日誌,顯示每條消息何時發送,接收和執行。然後將日誌合併到一個共同的時間表中並研究它。你在尋找的是a)不必要的重傳,例如由於超時,b)在收到消息的時間和它被採取行動之間的額外延遲。例如,如果某個線程的輸入隊列中有多條消息,其中一些消息可能比其他消息處理速度更快,則可能發生這種情況。首先處理它們是有意義的。

您可能需要在這兩者之間切換。

不要指望這很容易。有些程序員太麻煩了,不會受這種骯髒的工作困擾。但是,您可以驚喜地發現,您可以以多快的速度完成整個任務。

0

您是否有靈活性在Darwin(OSX)下開發並部署在Linux上?性能分析工具非常好,易於使用(Shark and Thread Viewer對您有用)。

當然還有很多Linux性能工具。 gprof,Valgrind(與Cachegrind,Callgrind,Massif)和Vtune將做你所需要的。

據我所知,沒有工具可以直接回答你的問題。但是,可以通過交叉參考儀器和基於抽樣的解決方案中的數據點和指標來找到答案。

2

看看Intel VTune Amplifier XE(以前稱爲「英特爾線程檔案器」),看它是否能滿足您的需求。 這個和其他英特爾Linux開發工具可用free for non-commercial use

在視頻Using the Timeline in Intel VTune Amplifier XE中演示了多線程應用程序的時間線。演示者使用圖形顯示來顯示活動以及如何挖掘引起序列化的特定鎖的源代碼行。在9:20,主持人提到「與框架API,你可以編程標記某些事件或階段在你的代碼,這些標記將出現在時間軸上。」