2012-03-19 14 views
16

Trong một thử nghiệm đơn giản, tôi đặt NOHZ=OFF và sử dụng printk để in tần suất hàm do_timer được gọi. Nó được gọi mỗi 10 ms trên máy tính của tôi.Cách NOHZ = On ảnh hưởng đến do_timer trong hạt nhân linux

Tuy nhiên nếu NOHZ=ON thì có rất nhiều jitter theo cách thức do_timer được gọi. Hầu hết các lần nó được gọi là mỗi 10 ms nhưng có những lúc nó hoàn toàn bỏ lỡ thời hạn.

Tôi đã nghiên cứu về cả hai do_timer và NOHZ. do_timer là chức năng chịu trách nhiệm cập nhật giá trị jiffies và cũng chịu trách nhiệm lập lịch trình vòng tròn của các quy trình.

Tính năng NOHZ sẽ tắt bộ hẹn giờ có độ phân giải cao trên hệ thống.

Điều tôi không thể hiểu là làm cách nào để tính giờ định thời gian có thể ảnh hưởng đến do_timer? Ngay cả khi phần cứng hi-res ở trạng thái ngủ, đồng hồ liên tục có nhiều khả năng thực thi do_timer cứ 10 ms một lần. Thứ hai nếu do_timer không thực hiện khi cần, điều đó có nghĩa là một số quy trình không nhận được timeshare của họ khi họ lý tưởng nên nhận được nó. Rất nhiều googling cho thấy rằng đối với nhiều người nhiều ứng dụng bắt đầu làm việc tốt hơn nhiều khi NOHZ=OFF.

Để tạo một câu chuyện dài, làm thế nào để NOHZ=ON ảnh hưởng đến do_timer?
Tại sao do_timer bỏ lỡ thời hạn của nó?

Trả lời

30

Đầu tiên cho phép hiểu là những gì một tickless kernel (NOHZ=On hoặc CONFIG_NO_HZ bộ) và động lực của giới thiệu nó vào trong nhân Linux từ 2.6.17

Từ http://www.lesswatts.org/projects/tickless/index.php là gì,

Theo truyền thống, hạt nhân Linux sử dụng một bộ định thời định kỳ cho mỗi CPU. Bộ hẹn giờ này đã thực hiện nhiều thứ khác nhau, chẳng hạn như kế toán quá trình, cân bằng tải theo lịch trình và duy trì các sự kiện hẹn giờ trên mỗi CPU. Cũ hơn Nhân Linux sử dụng bộ hẹn giờ với tần số 100Hz (100 sự kiện hẹn giờ mỗi giây hoặc một sự kiện mỗi 10ms), trong khi nhân mới hơn sử dụng 250Hz (250 sự kiện mỗi giây hoặc một sự kiện mỗi 4ms) hoặc 1000Hz (1000 sự kiện mỗi thứ hai hoặc một sự kiện mỗi 1ms).

Sự kiện hẹn giờ định kỳ này thường được gọi là "đánh dấu hẹn giờ". Bộ đếm thời gian đánh dấu rất đơn giản trong thiết kế của nó, nhưng có một nhược điểm đáng kể: việc đánh dấu hẹn giờ xảy ra theo định kỳ, bất kể trạng thái bộ xử lý, cho dù là không hoạt động hay bận. Nếu bộ xử lý không hoạt động, nó phải thức dậy từ trạng thái ngủ tiết kiệm năng lượng của nó cứ sau 1, 4 hoặc 10 mili giây. Chi phí tốn khá nhiều năng lượng, tốn thời gian sử dụng pin trong máy tính xách tay và gây tiêu thụ điện năng không cần thiết trong máy chủ.

Với "không hoạt động nhàn rỗi", hạt nhân Linux đã loại bỏ dấu thời gian định kỳ này khi CPU không hoạt động. Điều này cho phép CPU duy trì ở trạng thái tiết kiệm năng lượng ở trạng thái trong một khoảng thời gian dài hơn, giảm tổng mức tiêu thụ điện năng của hệ thống .

Vì vậy, giảm tiêu thụ điện năng là một trong những động lực chính của hạt nhân tickless. Nhưng khi nó đi, hầu hết các lần, Hiệu suất mất một hit với mức tiêu thụ điện năng giảm. Đối với máy tính để bàn, hiệu suất là mối quan tâm tối đa và do đó bạn thấy rằng đối với hầu hết trong số chúng, NOHZ=OFF hoạt động khá tốt.

Nói cách riêng Ingo Molnar của

Tính năng hạt nhân tickless (CONFIG_NO_HZ) cho phép 'theo yêu cầu' timer ngắt: nếu không có hẹn giờ để được hết hạn cho tiếng nói 1,5 giây khi hệ thống đi nhàn rỗi , sau đó hệ thống sẽ hoàn toàn không hoạt động trong 1,5 giây. Điều này sẽ mang lại các CPU mát hơn và tiết kiệm năng lượng: trên các hộp kiểm (x86) của chúng tôi, chúng tôi đã đo được tỷ lệ IRQ hiệu quả để đi từ HZ đến 1-2 ngắt thời gian mỗi giây.

Bây giờ, cho phép cố gắng trả lời queries- bạn

gì tôi không thể hiểu được là bao giờ hi-res có thể ảnh hưởng đến do_timer?

Nếu hệ thống hỗ trợ hẹn giờ có độ phân giải cao, gián đoạn hẹn giờ có thể xảy ra thường xuyên hơn 10ms thông thường trên hầu hết các hệ thống. tức là các bộ hẹn giờ này cố gắng làm cho hệ thống phản ứng nhanh hơn bằng cách tận dụng khả năng của hệ thống và bằng cách ngắt hẹn giờ thậm chí nhanh hơn, hãy nói từng 100us. Vì vậy, với NOHZ tùy chọn, những giờ đang hạ nhiệt và do đó việc thực hiện thấp hơn do_timer

Thậm chí nếu hi-res phần cứng ở trạng thái ngủ đồng hồ dai dẳng nhiều hơn có khả năng để thực hiện do_timer mỗi 10ms

Có khả năng. Nhưng ý định của NOHZ chính xác là ngược lại. Để ngăn chặn gián đoạn bộ đếm thời gian thường xuyên!

Thứ hai nếu do_timer không thực hiện khi nó mà nên có nghĩa là một số quá trình không nhận được timeshare của họ khi họ lý tưởng nên được nhận nó

Như caf lưu ý trong các ý kiến, NOHZ không nguyên nhân các quy trình để được lên lịch ít thường xuyên hơn, vì nó chỉ khởi động khi CPU không hoạt động - nói cách khác, khi không có tiến trình nào có thể lên lịch. Chỉ các công cụ kế toán quy trình mới được thực hiện vào thời gian trễ.

Tại sao do_timer bỏ lỡ thời hạn?

Như xây dựng, nó là thiết kế dự định của NOHZ

tôi đề nghị bạn đi qua các tick-sched.c nguồn kernel như là một điểm khởi đầu.Tìm kiếm CONFIG_NO_HZ và cố gắng tìm hiểu các chức năng mới được bổ sung cho các tính năng NOHZ

Dưới đây là một thử nghiệm thực hiện để đo Impact of a Tickless Kernel

+0

tôi hơn biết ơn cho câu trả lời này. Tôi đã được ấn tượng rằng NOHZ ảnh hưởng đến chỉ hẹn giờ thuê và do đó do_timer không bị ảnh hưởng trong bất kỳ cách nào (tôi nghĩ do_timer đã được bắn bằng đồng hồ liên tục duy nhất mà không bị ảnh hưởng bởi NOHZ chuyển đổi). –

+5

'NOHZ' không * không * khiến các quá trình được lên lịch ít thường xuyên hơn, vì nó chỉ khởi động khi CPU không hoạt động - nói cách khác, khi * không có tiến trình nào có thể lên lịch *. – caf

+0

@caf Cảm ơn rất nhiều cho các quán cà phê con trỏ. Vì vậy, nếu 'NOHZ' không ảnh hưởng đến quá trình lập lịch trình, thì tại sao hiệu suất (như hệ thống bị đóng băng) cải thiện khi' NOHZ = OFF'? Tôi đã thấy nhiều người phàn nàn về điều này là diễn đàn. –

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