sched feature: TTWU_QUEUE

喚醒線程時,通過select_task_rq函數(考慮到負載均衡等因素)選擇該線程要運行的目標CPU(可能不是當前執行喚醒操作的cpu)。通過函數cpus_share_cache判斷如果目標CPU與當前CPU不共享LLC(即L3 cache,單socket中所有CPU共享的cache,如下圖示),則將該線程加到目標cpu的wake_list後,向目前CPU發送IPI中斷(這其中還有一個特殊情況不需要發送IPI,就是目前CPU當前正在運行idle線程,並且設置了TIF_POLLING_NRFLAG),讓目前CPU在中斷中(scheduler_ipi)處理喚醒邏輯。

其中TTWU_QUEUE是內核調度的其中一個feature,默認是打開的(true),可以控制在遠程喚醒時是否允許向目前CPU觸發IPI中斷,如果不允許遠程喚醒,則需要通過對目標CPU的運行隊列加鎖進行處理。可知TTWU_QUEUE就是爲了減少運行隊列的鎖競爭,用中斷代替。

try_to_wakeup --> ttwu_queue -->ttwu_queue_remote->smp_send_reschedule: 

很早之前的做法是,只要不是喚醒在本CPU上,都是通過IPI中斷,這樣IPI中斷負載就比較高:

TTWU_QUEUE IPI overhead was measured to be as much as 13% of netperf TCP_RR
overhead when waking to a shared cache. Don't IPI unless we're waking cross
cache, where it can be a winner. 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章