Làm thế nào để CPU biết có IO đang chờ xử lý?


17

Tôi đã xem xét iowaittài sản được hiển thị trong đầu ra tiện ích hàng đầu như dưới đây.

top - 07:30:58 up  3:37,   1 user,  load average: 0.00, 0.01, 0.05
Tasks:  86 total,   1 running,   85 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.3 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st

iowait thường được định nghĩa như sau:

"Đó là thời gian mà CPU không hoạt động và có một số IO đang chờ xử lý."

Theo hiểu biết của tôi rằng một quá trình được chạy trên một CPU. Sau khi nó được hủy theo lịch trình vì nó đã sử dụng hết khe thời gian hoặc sau khi bị chặn, cuối cùng nó có thể được lên lịch lại trên bất kỳ một CPU nào.

Trong trường hợp yêu cầu IO, CPU đặt quá trình trong chế độ ngủ không bị gián đoạn có trách nhiệm theo dõi iowaitthời gian. Các CPU khác sẽ báo cáo cùng lúc với thời gian nhàn rỗi ở cuối vì chúng thực sự không hoạt động. Giả định này có đúng không?

Hơn nữa, giả sử có một yêu cầu IO dài (có nghĩa là quá trình này có một số cơ hội để được lên lịch nhưng không được lên lịch vì IO chưa hoàn thành), làm thế nào để CPU biết có "IO đang chờ xử lý"? Loại thông tin đó được lấy từ đâu? Làm thế nào CPU có thể đơn giản phát hiện ra rằng một số quá trình đã được đưa vào trạng thái ngủ một thời gian để IO hoàn thành vì bất kỳ CPU nào cũng có thể khiến quá trình đó ngủ. Tình trạng "IO đang chờ xử lý" được xác nhận như thế nào?


3
"Một tiến trình được chạy trên một CPU". Không hẳn vậy. Một luồng được chạy trên một lõi CPU, nhưng các quy trình hiện đại có nhiều luồng và CPU hiện đại có nhiều lõi.
MSalters

@MSalters Và thậm chí sau đó, trong khi một luồng chỉ có thể thực thi trên một lõi tại bất kỳ thời điểm nào thì lõi mà nó thực thi có thể thay đổi sau khi chuyển ngữ cảnh.
JAB

1
Có một thứ gọi là yêu cầu ngắt (IRQ) nhưng nó có thể là phần cứng nhiều hơn chúng ta quan tâm.
mathreadler

Câu trả lời:


33

CPU không biết gì về điều này, bộ lập lịch tác vụ thực hiện.

Định nghĩa bạn trích dẫn có phần sai lệch; dòng điện procfs(5)manpage có một định nghĩa chính xác hơn, với hãy cẩn thận:

iowait (kể từ Linux 2.5.41)

(5) Thời gian chờ I / O hoàn thành. Giá trị này không đáng tin cậy, vì những lý do sau:

  1. CPU sẽ không đợi I / O hoàn thành; iowaitlà thời gian mà một nhiệm vụ đang chờ I / O hoàn thành. Khi CPU chuyển sang trạng thái không hoạt động cho I / O xuất sắc, một tác vụ khác sẽ được lên lịch trên CPU này.

  2. Trên CPU đa lõi, tác vụ chờ I / O hoàn thành không chạy trên bất kỳ CPU nào, do đó, iowaitmỗi CPU rất khó tính toán.

  3. Giá trị trong lĩnh vực này có thể giảm trong một số điều kiện nhất định.

iowaitnói chung, cố gắng đo thời gian chờ đợi I / O. Nó không được theo dõi bởi một CPU cụ thể, cũng không thể (điểm 2 ở trên - cũng phù hợp với những gì bạn đang thắc mắc). Nó được đo trên mỗi CPU, càng xa càng tốt.

Bộ lập lịch tác vụ mà Cameron biết là có I / O đang chờ xử lý, vì nó biết rằng nó bị đình chỉ một nhiệm vụ nhất định vì nó đang chờ I / O. Điều này được theo dõi cho mỗi nhiệm vụ trong in_iowaitlĩnh vực task_struct; bạn có thể tìm kiếm in_iowaittrong lõi lập lịch để xem cách thiết lập, theo dõi và xóa. Bài viết gần đây của Brendan Gregg về mức trung bình tải Linux bao gồm thông tin cơ bản hữu ích. Các iowaitmục trong /proc/stat, đó là những gì kết thúc trong top, được tăng lên bất cứ khi nào một bộ đếm thời gian đánh dấu được chiếm, và quá trình hiện “trên” CPU là nhàn rỗi; bạn có thể thấy điều này bằng cách tìm kiếm account_idle_timetrong mã theo dõi thời gian CPU của bộ lập lịch .

Vì vậy, một định nghĩa chính xác hơn sẽ là thời gian dành cho CPU này chờ I / O, khi không có gì tốt hơn để làm ...

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.