Lưu ý
Mục đích của file này là để độc giả tiếng Việt có thể đọc và hiểu tài liệu nhân kernel dễ dàng hơn, không phải để tạo ra một nhánh tài liệu riêng. Nếu bạn có bất kỳ nhận xét hoặc cập nhật nào cho file này, vui lòng thử cập nhật file tiếng Anh gốc trước. Nếu bạn thấy có sự khác biệt giữa bản dịch và bản gốc, hoặc có vấn đề về bản dịch, vui lòng gửi góp ý hoặc patch cho người dịch của file này, hoặc nhờ người bảo trì và người review tài liệu tiếng Việt giúp đỡ.
- Bản gốc:
- Người dịch:
Google Translate (machine translation)
- Phiên bản gốc:
8541d8f725c6
Cảnh báo
Tài liệu này được dịch tự động bằng máy và chưa được review bởi người dịch. Nội dung có thể không chính xác hoặc khó hiểu ở một số chỗ. Khi có sự khác biệt với bản gốc, bản gốc luôn là chuẩn. Bản dịch chất lượng cao (được review) được đặt trong thư mục vi_VN/.
Tên miền lập lịch¶
Mỗi CPU có miền lập kế hoạch “cơ sở” (struct sched_domain). Tên miền
hệ thống phân cấp được xây dựng từ các miền cơ sở này thông qua con trỏ ->parent. ->cha mẹ
MUST sẽ bị chấm dứt NULL và các cấu trúc miền phải theo CPU như hiện tại
được cập nhật không khóa.
Mỗi miền lập kế hoạch trải rộng trên một số CPU (được lưu trữ trong trường ->span). Khoảng thời gian MUST của một miền là tập hợp lớn hơn khoảng thời gian con của miền đó (hạn chế này có thể hãy thoải mái nếu có nhu cầu) và miền cơ sở cho CPU i MUST ít nhất phải trải dài tôi. Tên miền hàng đầu cho mỗi CPU thường sẽ bao trùm tất cả các CPU trong hệ thống mặc dù thực ra là không cần thiết, nhưng điều này có thể dẫn đến trường hợp một số CPU sẽ không bao giờ được giao nhiệm vụ để chạy trừ khi mặt nạ được phép của CPU được được thiết lập một cách rõ ràng. Khoảng thời gian của miền được lập lịch có nghĩa là “cân bằng tải quy trình giữa các CPU”.
Mỗi miền lập lịch phải có một hoặc nhiều nhóm CPU (struct sched_group)
được tổ chức dưới dạng danh sách liên kết một chiều vòng tròn từ các nhóm ->
con trỏ. Sự kết hợp của cpumasks của các nhóm MUST này giống như
phạm vi của tên miền. Nhóm được trỏ tới bởi ->con trỏ nhóm MUST chứa CPU
mà miền đó thuộc về. Các nhóm có thể được chia sẻ giữa các CPU vì chúng chứa
chỉ đọc dữ liệu sau khi chúng đã được thiết lập. Giao điểm của cpumasks từ
bất kỳ hai nhóm nào trong số này có thể không trống. Nếu đúng như vậy thì SD_OVERLAP
cờ được đặt trên miền lập kế hoạch tương ứng và các nhóm của nó có thể không được
được chia sẻ giữa các CPU.
Cân bằng trong một miền được lập lịch xảy ra giữa các nhóm. Tức là mỗi nhóm được coi là một thực thể. Tải của một nhóm được định nghĩa là tổng của tải của từng CPU thành viên của nó và chỉ khi tải của một nhóm trở nên mất cân bằng là các nhiệm vụ được chuyển giao giữa các nhóm.
Trong kernel/sched/core.c, sched_balance_trigger() được chạy định kỳ trên mỗi CPU
thông qua sched_tick(). Nó tăng một softirq sau lịch trình thường xuyên tiếp theo
sự kiện tái cân bằng cho runqueue hiện tại đã đến. Tải thực tế
cân bằng công việc, sched_balance_softirq()->sched_balance_domains(), sau đó được chạy
trong bối cảnh softirq (SCHED_SOFTIRQ).
Hàm sau có hai đối số: runqueue của CPU hiện tại và liệu
CPU không hoạt động vào thời điểm sched_tick() xảy ra và lặp lại tất cả
các miền đã lập lịch mà CPU của chúng tôi đang sử dụng, bắt đầu từ miền cơ sở và đi lên ->cha mẹ
chuỗi. Trong khi thực hiện việc đó, nó sẽ kiểm tra xem miền hiện tại đã hết chưa
khoảng thời gian tái cân bằng. Nếu vậy, nó sẽ chạy sched_balance_rq() trên miền đó. Sau đó nó kiểm tra
sched_domain gốc (nếu nó tồn tại) và cha mẹ của cha mẹ, v.v.
ra.
Ban đầu, sched_balance_rq() tìm nhóm bận rộn nhất trong miền được lập lịch hiện tại.
Nếu thành công, nó sẽ tìm hàng đợi bận rộn nhất trong số tất cả các hàng chạy của CPU trong
nhóm đó. Nếu nó tìm được một runqueue như vậy, nó sẽ khóa cả
Hàng đợi của CPU và hàng đợi bận rộn nhất mới được tìm thấy và bắt đầu chuyển các nhiệm vụ từ nó
đến hàng đợi của chúng tôi. Số lượng nhiệm vụ chính xác dẫn đến sự mất cân bằng trước đây
được tính toán trong khi duyệt qua các nhóm của miền được lập lịch này.
Triển khai các miền theo lịch trình¶
Miền “cơ sở” sẽ “trải rộng” cấp độ đầu tiên của hệ thống phân cấp. Trong trường hợp của SMT, bạn sẽ mở rộng tất cả các anh chị em của CPU vật lý, với mỗi nhóm là một CPU ảo duy nhất.
Trong SMP, tên miền gốc của miền cơ sở sẽ trải rộng trên tất cả các CPU vật lý trong nút. Mỗi nhóm là một CPU vật lý duy nhất. Sau đó với NUMA, cha mẹ của miền SMP sẽ trải rộng trên toàn bộ máy, với mỗi nhóm có cpumask của một nút. Hoặc, bạn có thể thực hiện NUMA hoặc Opteron đa cấp, chẳng hạn: có thể chỉ có một miền bao trùm một cấp NUMA của nó.
Người triển khai nên đọc các nhận xét trong include/linux/sched/sd_flags.h: SD_* để có ý tưởng về các chi tiết cụ thể và nội dung cần điều chỉnh cho cờ SD của một sched_domain.
Kiến trúc có thể ghi đè trình tạo miền chung và cờ SD mặc định
cho một cấp độ cấu trúc liên kết nhất định bằng cách tạo một mảng sched_domain_topology_level và
gọi set_sched_topology() với mảng này làm tham số.
Cơ sở hạ tầng gỡ lỗi tên miền theo lịch trình có thể được kích hoạt bởi ‘sched_verbose’ vào cmdline của bạn. Nếu bạn quên điều chỉnh dòng cmdline của mình, bạn cũng có thể lật /sys/kernel/debug/sched/verbose núm. Điều này cho phép phân tích cú pháp kiểm tra lỗi của các miền được lập lịch sẽ phát hiện hầu hết các lỗi có thể xảy ra (được mô tả ở trên). Nó cũng in ra cấu trúc miền ở định dạng trực quan.