Làm cách nào để thay đổi tần số chuyển đổi ngữ cảnh của Linux?


17

Làm thế nào có thể thay đổi tần số chuyển đổi bối cảnh Linux (linaro, ubfox, debian)?

Tôi ổn khi giao dịch một hệ thống ít phản hồi hơn cho hệ thống hiệu quả hơn.

EDIT1: Tôi có một quy trình chính mà tôi muốn chạy nhanh nhất có thể (chu kỳ xung nhịp tối đa mỗi giây), vì vậy tôi đã nghĩ đến việc giảm tần số chuyển đổi ngữ cảnh (= tăng thời gian). Câu hỏi là làm thế nào để làm điều đó, và sẽ có một hiệu ứng đáng kể. Tôi có thể tính chi phí chuyển đổi ngữ cảnh không? Có nghĩa là, tôi có thể ước tính nếu tôi tăng thời gian lên gấp đôi, hiệu suất của tôi sẽ đạt được là bao nhiêu% cho quy trình chính mà tôi quan tâm?


1
Tôi hy vọng hiệu ứng của cài đặt này là tối thiểu và chỉ phù hợp nếu bạn có nhiều tiến trình đang chạy hơn lõi CPU. Nếu không có tác vụ nào khác đang chờ CPU cụ thể, thậm chí không cần thiết lập bộ hẹn giờ chuyển đổi tác vụ trong thời gian ngắn, bởi vì bất kỳ thứ gì có thể thực hiện một tác vụ khác có thể chạy đều là cuộc gọi hệ thống hoặc ngắt phần cứng, cả hai đều bị gián đoạn sẽ trả lại CPU cho kernel.
Simon Richter

Xin lỗi vì đã ở đây, nhưng ai đó có thể giải thích 'tần số chuyển đổi ngữ cảnh' nghĩa là gì trong bối cảnh của câu hỏi này không?
dùng1717828

@sourcejedi xem EDIT1 của tôi - tôi có thể ước tính cải thiện thông lượng theo% khi tôi giảm tần suất chuyển đổi ngữ cảnh không?
Nadav B

@NadavB Tôi đã chỉnh sửa câu trả lời của mình cho phù hợp. Các phép đo cụ thể là tốt nhất khi tối ưu hóa. Tuy nhiên, bạn không phải coi nó là hộp đen, ví dụ bạn có thể sử dụng perf để đo các lỗi bộ nhớ cache nếu CPU của bạn tốt. AIUI, các loại bộ nhớ cache CPU khác nhau (bao gồm cả lỗi TLB) là chi phí cá nhân quan trọng nhất của chuyển đổi ngữ cảnh.
sourcejedi

Câu trả lời:


17

Nếu tác vụ của bạn là quá trình duy nhất yêu cầu thời gian trên một CPU cụ thể, sẽ không có chuyển đổi ngữ cảnh giữa các tác vụ :-). Nhưng CPU vẫn có thể bị gián đoạn, gây ra chuyển đổi ngữ cảnh vào kernel và quay lại. Và một nguyên nhân có thể là bộ đếm thời gian trước khi thử nghiệm, kiểm tra xem có nhiệm vụ nào khác để chạy trên CPU này không ...

Linux có thể tránh việc tạo ra bất kỳ ngắt hẹn giờ trước khi thực hiện trên cpu khi không có lý do gì để làm như vậy. Xem CONFIG_NO_HZ_FULL. Để sử dụng tính năng này, nó phải được kích hoạt khi kernel được xây dựng nó phải được kích hoạt bằng tùy chọn khởi động.

Theo mặc định, không có CPU nào là CPU thích ứng. Tham số khởi động "nohz_full =" chỉ định CPU thích ứng. Ví dụ: "nohz_full = 1,6-8" nói rằng CPU 1, 6, 7 và 8 phải là CPU thích ứng. Lưu ý rằng bạn bị cấm đánh dấu tất cả các CPU là CPU đánh dấu thích ứng [...]

LWN.net cho biết "theo Ingo Molnar, sẽ tiết kiệm được 1% thời gian của CPU" cho các CPU thích ứng. Tài liệu kernel nói rằng điều này có sáu chi phí khác nhau, và cũng có một danh sách "VẤN ĐỀ KIẾM".

Mức tăng này tương đối nhỏ, đặc biệt so với mức tăng thông lượng tiềm năng của việc giảm tần suất chuyển đổi ngữ cảnh giữa nhiều tác vụ, như được tham chiếu trong câu trả lời này: Làm cách nào để thay đổi độ dài của các lát cắt thời gian được sử dụng bởi bộ lập lịch CPU Linux?

In nhỏ: các phép đo này hỗ trợ trước Spectre, Meltdown, KPTI và x86 ASID :-(. Và tôi đoán chúng cũng áp dụng cho phần cứng cũ hơn. Hãy hỏi chuyên gia hạt nhân hoặc chạy các phép đo của riêng bạn về cách chi phí chuyển đổi ngữ cảnh đã thay đổi trên phiên bản kernel và phần cứng cụ thể của bạn ... PTI phần lớn được cho là được giảm nhẹ bởi ASID, ngoại trừ phần mềm gọi vào kernel rất thường xuyên, ví dụ chính là cơ sở dữ liệu. Nhưng tôi không nắm bắt được các con số .

Hy vọng của Molnar trong bản vá RFC ban đầu là theo thời gian, nó "có thể sẽ được kích hoạt bởi hầu hết các bản phân phối Linux". Tôi nhận thấy Fedora 28 cung cấp một kernel mặc định được xây dựng với NO_HZ_FULLsự hỗ trợ. Debian 9 thì không.


Gần đây, Linux v4.17 loại bỏ dấu tích thời gian 1 Hz còn lại khỏi nohz_fullCPU . Tôi tưởng tượng ảnh hưởng đến thông lượng khá nhỏ :-), nhưng tôi đã cố gắng theo dõi trạng thái NO_HZ_FULLlợi ích khi có nhiều quy trình có thể chạy trên CPU -

một khi chúng ta đạt đến 0 Hz, chúng ta có thể [sau đó] loại bỏ giả định đánh dấu định kỳ khỏi nr_rucky> = 2, bằng cách làm gián đoạn các nhiệm vụ bận rộn thường xuyên như các ràng buộc về lịch trình yêu cầu chúng ta thực hiện - cứ sau 4 - 40 ms, tùy thuộc vào nr_rucky .

Điều này hơi khó hiểu vì tiền chế định đã bắt đầu sử dụng một dấu kiểm riêng biệt, chính xác hơn trong v2.6.25-rc1, cam kết 8f4d37ec073c, "lịch trình: đánh dấu ưu tiên độ phân giải cao" . Tìm thấy thông qua nhận xét này trên cùng một bài viết của LWN.net: https://lwn.net/Articles/549754/ ).


Còn kernel.sched_rr_timeslice_ms thì sao?
Nadav B

1
@NadavB nếu bạn đang sử dụng các tác vụ calendar_rr thời gian thực, hãy nói như vậy. Đây là một chủ đề chuyên gia. Nếu bạn không, thì không :-).
sourcejedi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.