2012-06-04 33 views
1

可以在Linux中爲每個線程在每個核心上運行的多線程程序設置cpu親和性,從而有效阻止任何其他進程被該核心上的操作系統調度。實際上,我想保證在我的進程中使用內核,並將所有其他非關鍵程序綁定到最少數量的內核。Linux cpu_affinity保證一次性使用

或者我錯過了Linux調度程序的東西,或者我需要我自己的。

+1

您的Linux內核的線程調度程序的哪些特性使默認行爲不適合您的應用程序? –

回答

4

可以設置在Linux中CPU親和力其中每個線程上的每個核心運行有效地被安排在操作系統上的核心

沒有阻止任何其他 進程多線程程序 ,設置cpu affinity會阻止調度程序使用某些內核來處理線程。也就是說,它只會在某些核心上安排你的線程 - 它對其他線程沒有任何作用。

您可以使用setpriority或許可以達到您想要的效果。如果您的要求非常嚴格,您可以查看sched_setscheduler並選擇SCHED_RRSCHED_FIFO

+0

你的意思是說我可以使用Linux調度程序排隊我自己的線程嗎? – BAR

+0

@ user417896您已經在使用它。但是調度程序足夠聰明,可以知道多個進程類。 'SCHED_RR'和'SCHED_FIFO'總是安排在其他進程之前。 – cnicutar

+0

@cnicutar,這是一個切角。 SCHED_RR和SCHED_FIFO僅優先於相同優先級的其他進程進行調度。但即便如此,如果這些進程已經餓得足夠長,現在需要一些CPU時間,也不一定是這樣。 –

1

當調度程序被積極地使用時,taskset和nice只會給調度程序提供關於您的偏好的提示。調度程序可以根據工作負載自由地重新調度任何可用內核中的任何線程。您可以使用perf來監視上下文切換和cpu遷移。

你有兩個選擇:

  1. 您可以強制調度按照您的訂單低谷作爲user417896 sugggested sched_setscheduler。
  2. 可以使用的cgroup/cpuset定義兩個cpusets,說系統隔離,和所有的系統線程移動到系統 cpuset分離目標內核,並使用cgexec在隔離cpuset運行程序。您可以將內核和內存分配給cpuset,並且爲了隔離它而設置cpu_exclusive位,並且您已經設置完畢。你也可以使用cset (http://code.google.com/p/cpuset/),如果你使用舊的內核來爲你自動執行這個過程。

我希望它有幫助。