Why does Linux's scheduler put two threads onto the same physical core on processors with HyperThreading?

后端 未结 3 1001
北荒
北荒 2021-02-12 12:51

I\'ve read in multiple places that Linux\'s default scheduler is hyperthreading aware on multi-core machines, meaning that if you have a machine with 2 real cor

3条回答
  •  鱼传尺愫
    2021-02-12 13:16

    I'm unable to reproduce this on 3.13.0-48 with my Intel(R) Xeon(R) CPU E5-1650 0 @ 3.20GHz.

    I have 6 cores with hyperthreading, where logical core N maps to physical core N mod 6.

    Here's a typical output of top with stress -c 4 in two columns, so that each row is one physical core (I left out a few cores because my system is not idle):

    %Cpu0  :100.0 us,   %Cpu6  :  0.0 us, 
    %Cpu1  :100.0 us,   %Cpu7  :  0.0 us, 
    %Cpu2  :  5.9 us,   %Cpu8  :  2.0 us, 
    %Cpu3  :100.0 us,   %Cpu9  :  5.7 us, 
    %Cpu4  :  3.9 us,   %Cpu10 :  3.8 us, 
    %Cpu5  :  0.0 us,   %Cpu11 :100.0 us, 
    

    Here it is after killing and restarting stress:

    %Cpu0  :100.0 us,   %Cpu6  :  2.6 us, 
    %Cpu1  :100.0 us,   %Cpu7  :  0.0 us, 
    %Cpu2  :  0.0 us,   %Cpu8  :  0.0 us, 
    %Cpu3  :  2.6 us,   %Cpu9  :  0.0 us, 
    %Cpu4  :  0.0 us,   %Cpu10 :100.0 us, 
    %Cpu5  :  2.6 us,   %Cpu11 :100.0 us, 
    

    I did this several times, and did not see any instances where 4 threads across 12 logical cores would schedule on the same physical core.

    With -c 6 I tend to get results like this, where Linux appears to be helpfully scheduling other processes on their own physical cores. Even so, they're distributed way better than chance:

    %Cpu0  : 18.2 us,   %Cpu6  :  4.5 us, 
    %Cpu1  :  0.0 us,   %Cpu7  :100.0 us, 
    %Cpu2  :100.0 us,   %Cpu8  :100.0 us, 
    %Cpu3  :100.0 us,   %Cpu9  :  0.0 us, 
    %Cpu4  :100.0 us,   %Cpu10 :  0.0 us, 
    %Cpu5  :100.0 us,   %Cpu11 :  0.0 us, 
    

提交回复
热议问题