2017-07-28 24 views
5

Bằng cách nhìn vào số liệu thống kê lịch trong /proc/<PID>/sched, bạn có thể nhận được một đầu ra như thế này:Linux - Sự khác biệt giữa di chuyển và chuyển mạch?

[[email protected] ~]$ 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 

Tôi đã cố gắng tìm ra sự khác nhau giữa di cư và công tắc, một số phản ứng herehere là gì. Tóm tắt các phản hồi này:

  • nr_switches: số lượng công tắc ngữ cảnh.
  • nr_voluntary_switches: số lượng công tắc tự nguyện, tức là luồng bị chặn và do đó một luồng khác được chọn.
  • nr_involuntary_switches: trình lên lịch đã khởi chạy chuỗi chỉ vì có một chuỗi đói khác sẵn sàng chạy.

Do đó, migrations là gì? Những khái niệm này có liên quan hay không? Di chuyển nằm giữa các lõi và công tắc trong lõi?

Trả lời

7

Di chuyển là khi một luồng, thường là sau khi chuyển đổi ngữ cảnh, được lên lịch trên một CPU khác với CPU đã được lên lịch trước đó.

EDIT 1:

Dưới đây là thông tin thêm về Wikipedia về sự di cư: https://en.wikipedia.org/wiki/Process_migration

Đây là mã hạt nhân tăng truy cập: https://github.com/torvalds/linux/blob/master/kernel/sched/core.c#L1175

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

EDIT 2:

Một thread có thể di chuyển đến CPU khác trong các trường hợp sau đây:

  1. Trong exec()
  2. Trong fork()
  3. Trong chủ đề đánh thức.
  4. Nếu mặt nạ sở thích luồng đã thay đổi.
  5. Khi CPU hiện tại đang ngoại tuyến.

Để biết thêm thông xin vui lòng có một cái nhìn tại các chức năng set_task_cpu(), move_queued_task(), migrate_tasks() trong tập tin nguồn giống nhau: https://github.com/torvalds/linux/blob/master/kernel/sched/core.c

Các chính sách lên lịch sau được mô tả trong select_task_rq(), mà phụ thuộc vào lớp của lịch trình bạn đang sử dụng . Phiên bản cơ bản của 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); 

Nguồn: https://github.com/torvalds/linux/blob/master/kernel/sched/core.c#L1534

Vì vậy, để tránh di chuyển, thiết lập các mối quan hệ CPU mặt nạ cho chủ đề của bạn sử dụng sched_setaffinity(2) gọi hệ thống hoặc tương ứng với POSIX API pthread_setaffinity_np(3).

Dưới đây là định nghĩa của select_task_rq() cho Scheduler Hoàn toàn Fair: https://github.com/torvalds/linux/blob/master/kernel/sched/fair.c#L5860

Logic là khá phức tạp, nhưng về cơ bản, chúng tôi chọn một trong hai anh em nhàn rỗi CPU hoặc tìm một ít bận rộn mới.

Hy vọng điều này sẽ trả lời câu hỏi của bạn.

+0

Bạn nói 'thông thường', vậy công cụ lập kế hoạch theo dõi để di chuyển sang lõi khác là gì? Bạn có bất kỳ nguồn nào có thể xác nhận điều đó không? – horro

+0

Nó phụ thuộc vào lịch trình, ưu tiên, mối quan hệ vv Về cơ bản, nếu không có ái lực CPU và CPU trước đó đang bận với nhiệm vụ khác, luồng được lên lịch trên CPU khác. Tôi cũng đã cập nhật câu trả lời với một số liên kết. –

+1

@horro, khi được thử nghiệm với sự kiểm soát thủ công mối quan hệ cốt lõi-ren, tôi kết luận rằng không có vấn đề gì, các chính sách liên quan quá sâu. Có rất nhiều điều phải được tính đến, và nó khác nhau đối với mỗi máy tính. Một ví dụ, trên một máy tính CPU kép, bạn có thể xem xét CPU nào có hầu hết dữ liệu của luồng (không có điểm quá tải bus QPI). Điều đó tự nó là một câu hỏi phức tạp; các trang bộ nhớ kế tiếp có thể được xen kẽ giữa các CPU, hoặc không (đó là một thiết lập BIOS trên một số máy). Hệ điều hành biết tất cả điều này và hơn thế nữa. Tôi sợ phải tăng quá sâu ... – bazza

Các vấn đề liên quan