2016-10-19 42 views
1

我有一個有大約80個線程的程序。它運行在linux 3.36上的〜50ish核心機器上。至多有兩個程序同時運行,它們是相同的。機器上沒有別的東西在運行。爲什麼這個線程在我的程序中會捱餓?

線程本身是帶有SCHED_RR(輪循機制)策略的實時linux pthread。

  • 10是最高優先級(是的,我將ulimit設置爲99),並將cpu親緣關係設置爲10個核心。換句話說,它們都被固定在自己的核心上。
  • 約60爲中等優先。
  • 約10是低優先級。

10個最高優先級的線程不斷使用cpu。

其餘的都在做網絡IO以及在CPU上做一些工作。問題在於:我看到一個低優先級的線程正在捱餓,有時候超過15秒。這個特定的線程正在TCP套接字上等待一些數據。我知道數據已經完全發送,因爲我可以看到連接另一端的服務器已經發送了數據(即它在發送數據之後記錄了一個時間戳)。通常線程需要幾毫秒的時間來接收和處理它,但零星地在另一臺服務器成功發送數據之後需要15秒。請注意,增加線程的優先級並將其固定到CPU上已經消除了這個問題,但這不是一個長期的解決方案。我不希望這種行爲在第一時間 - 15秒是很長的時間。

有誰知道爲什麼會發生這種情況?我們已經排除它是程序/線程中的任何邏輯。另外請注意,程序是用C編寫的。

+0

您可能(也)在unix.stackexchange.com上詢問。你知道,如果你確信這不是關於「你的計劃」,那麼你的問題實際上是在這裏脫離主題! – GhostCat

回答

1

我不希望這種行爲在第一位--15秒是很長的時間。

如果60中等優先級的線程都可以運行,那麼這正是你所期望的:與實時線程則低優先級的線程將不會在所有運行而有更高優先級的線程仍然可以運行。您可以使用perf timechart來分析究竟發生了什麼。

+0

該政策是循環法。我是否誤解了RR調度政策的重要性? – rvishy1

+0

@ rvishy1:聽起來像是 - 看到['sched(7)'](http://manpages.org/sched/7)手冊頁。具有較高靜態優先級的線程始終優先於靜態優先級較低的線程運行 - *「調度策略僅在具有相同靜態優先級的可運行線程列表中確定排序。」*(在此情況下,「SCHED_RR」是策略)。 – caf