【问题标题】:Linux - Difference between migrations and switches?Linux - 迁移和交换机之间的区别?
【发布时间】:2017-07-28 08:38:55
【问题描述】:

通过查看/proc/<PID>/sched 中的调度统计信息,您可以获得如下输出:

[horro@system ~]$ cat /proc/1/sched
systemd (1, #threads: 1)
-------------------------------------------------------------------
se.exec_start                                :    2499611106.982616
se.vruntime                                  :          7952.917943
se.sum_exec_runtime                          :         58651.279127
se.nr_migrations                             :                53355
nr_switches                                  :               169561
nr_voluntary_switches                        :               168185
nr_involuntary_switches                      :                 1376
se.load.weight                               :              1048576
se.avg.load_sum                              :               343837
se.avg.util_sum                              :               338827
se.avg.load_avg                              :                    7
se.avg.util_avg                              :                    7
se.avg.last_update_time                      :     2499611106982616
policy                                       :                    0
prio                                         :                  120
clock-delta                                  :                  180
mm->numa_scan_seq                            :                    1
numa_pages_migrated                          :                  296
numa_preferred_nid                           :                    0
total_numa_faults                            :                   34
current_node=0, numa_group_id=0
numa_faults node=0 task_private=0 task_shared=23 group_private=0 group_shared=0
numa_faults node=1 task_private=0 task_shared=0 group_private=0 group_shared=0
numa_faults node=2 task_private=0 task_shared=0 group_private=0 group_shared=0
numa_faults node=3 task_private=0 task_shared=11 group_private=0 group_shared=0
numa_faults node=4 task_private=0 task_shared=0 group_private=0 group_shared=0
numa_faults node=5 task_private=0 task_shared=0 group_private=0 group_shared=0
numa_faults node=6 task_private=0 task_shared=0 group_private=0 group_shared=0
numa_faults node=7 task_private=0 task_shared=0 group_private=0 group_shared=0

我一直试图弄清楚迁移和切换之间有什么区别,一些回复herehere。总结这些回应:

  • nr_switches:上下文切换次数。
  • nr_voluntary_switches:自愿切换的次数,即线程被阻塞,因此另一个线程被拾取。
  • nr_involuntary_switches:调度程序将线程踢出,因为还有另一个饥饿的线程准备运行。

那么,migrations 是什么?这些概念是否相关?迁移是在核心和核心内的交换机之间进行的吗?

【问题讨论】:

    标签: linux multithreading linux-kernel scheduler


    【解决方案1】:

    迁移是指线程(通常在上下文切换之后)被调度到与之前调度不同的 CPU 上。

    编辑 1

    以下是有关迁移的更多信息,请参见 Wikipedia: https://en.wikipedia.org/wiki/Process_migration

    这是增加计数器的内核代码: https://github.com/torvalds/linux/blob/master/kernel/sched/core.c#L1175

    if (task_cpu(p) != new_cpu) {
        ...
        p->se.nr_migrations++;
    

    编辑 2

    在以下情况下,一个线程可以迁移到另一个 CPU:

    1. 期间exec()
    2. fork()期间
    3. 线程唤醒期间。
    4. 如果线程关联掩码已更改。
    5. 当前 CPU 脱机时。

    有关更多信息,请查看同一源文件中的函数set_task_cpu()move_queued_task()migrate_tasks()https://github.com/torvalds/linux/blob/master/kernel/sched/core.c

    select_task_rq() 中描述了遵循的策略调度程序,具体取决于您使用的调度程序类。基本版本的policier:

    if (p->nr_cpus_allowed > 1)
        cpu = p->sched_class->select_task_rq(p, cpu, sd_flags, wake_flags);
    else
        cpu = cpumask_any(&p->cpus_allowed);
    

    来源:https://github.com/torvalds/linux/blob/master/kernel/sched/core.c#L1534

    因此,为了避免迁移,请使用sched_setaffinity(2) 系统调用或相应的 POSIX API pthread_setaffinity_np(3) 为您的线程设置 CPU 关联掩码。

    这里是完全公平调度器的 select_task_rq() 的定义: https://github.com/torvalds/linux/blob/master/kernel/sched/fair.c#L5860

    逻辑相当复杂,但基本上,我们要么选择同级空闲CPU,要么找到一个最不忙的新CPU。

    希望这能回答你的问题。

    【讨论】:

    • 您说“通常”,那么调度程序遵循什么策略来迁移到另一个核心?您有任何消息来源可以证实这一点吗?
    • 这取决于调度程序、优先级、亲和性等。基本上,如果没有 CPU 亲和性并且前一个 CPU 正忙于另一个任务,则线程会被安排在另一个 CPU 上。我还用一些链接更新了答案。
    • @horro,在尝试过手动控制线程核心亲和性后,我得出的结论是没有意义,政策涉及的太深了。需要考虑的因素太多了,而且每台计算机都不同。例如,在双 CPU 机器上,您可能会考虑哪个 CPU 拥有大部分线程数据(没有必要使 QPI 总线过载)。这本身就是一个复杂的问题。连续的内存页面可以在 CPU 之间交错,也可以不交错(这是某些机器上的 BIOS 设置)。操作系统知道这一切以及更多。我怕撬得太深...
    • @St.Antario 简而言之:迁移会导致更多的缓存未命中(现代 CPU 至少有指令、数据和 TLB 缓存),更多的分支预测器未命中等。很确定还有其他原因,但这就是我此刻想到的;)
    • @St.Antario 通常 L1 缓存是“私有的”。这就是为什么L1 cache is few times faster than L2。有缓存一致性协议,但通常数据通过一致性点(即更高级别的缓存)。 TLB 缓存和分支预测器历史记录到 bin AFAIK。查看我的 The Spectre of Meltdowns 演示文稿,了解缓存和分支预测器的基础知识。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-31
    • 2013-05-28
    • 2013-07-20
    • 1970-01-01
    • 1970-01-01
    • 2014-05-05
    • 1970-01-01
    相关资源
    最近更新 更多