Bất cứ ai có thể giải thích chính xác IOWait là gì?


194

Nhiều như tôi đã đọc về iowait, nó vẫn còn là bí ẩn đối với tôi.

Tôi biết rằng đó là thời gian dành cho CPU để chờ các hoạt động IO hoàn thành, nhưng loại hoạt động IO nào chính xác? Điều tôi cũng không chắc, là tại sao nó lại quan trọng đến vậy? CPU không thể làm gì khác trong khi hoạt động IO hoàn thành và sau đó quay lại xử lý dữ liệu?

Ngoài ra các công cụ phù hợp để chẩn đoán quá trình (es) đã làm chính xác chờ đợi IO.

Và những cách để giảm thiểu thời gian chờ đợi IO là gì?


Và còn nữa, iowait cao là gì?
Muhamed Huseinbašić

Câu trả lời:


99

Tôi biết rằng đó là thời gian dành cho CPU để chờ các hoạt động IO hoàn thành, nhưng loại hoạt động IO nào chính xác? Điều tôi cũng không chắc, là tại sao nó lại quan trọng đến vậy? CPU không thể làm gì khác trong khi hoạt động IO hoàn thành và sau đó quay lại xử lý dữ liệu?

Có, hệ điều hành sẽ lên lịch cho các quá trình khác chạy trong khi một quá trình bị chặn trên IO. Tuy nhiên, bên trong quá trình đó, trừ khi nó sử dụng IO không đồng bộ, nó sẽ không tiến triển cho đến khi hoàn thành bất kỳ thao tác IO nào.

Ngoài ra các công cụ phù hợp để chẩn đoán quá trình (es) đã làm chính xác chờ đợi IO.

Một số công cụ bạn có thể thấy hữu ích

  • iostat, để theo dõi thời gian phục vụ của đĩa của bạn
  • iotop (nếu kernel của bạn hỗ trợ nó), để theo dõi sự cố của các yêu cầu IO trên mỗi tiến trình
  • strace, để xem xét các hoạt động thực tế được ban hành bởi một quy trình

Và những cách để giảm thiểu thời gian chờ đợi IO là gì?

  • đảm bảo bạn có bộ nhớ vật lý miễn phí để HĐH có thể lưu trữ các khối đĩa trong bộ nhớ
  • giữ mức sử dụng đĩa hệ thống tập tin của bạn dưới 80% để tránh phân mảnh quá mức
  • điều chỉnh hệ thống tập tin của bạn
  • sử dụng bộ điều khiển mảng pin
  • Chọn kích thước bộ đệm tốt khi thực hiện các thao tác io

6
Đừng quên "đảm bảo rằng bộ lưu trữ phụ trợ của bạn đủ nhanh để theo kịp tải I / O của bạn."
jgoldschrafe

1
@Dave Cheney, và khi quá trình của tôi không hoạt động, đó là vì nó đang chờ trên IO. Vậy sự khác biệt giữa IOWait và nhàn rỗi là gì?
ctrl-alt-delor

4
Khi ở IOwait, quá trình này ở "giấc ngủ không bị gián đoạn" có nghĩa là nó không thể bị giết, để tránh những rủi ro làm hỏng dữ liệu trên đĩa. một quá trình nhàn rỗi bình thường thực sự không làm gì cả, vì vậy sẽ có ít rủi ro hơn khi giết chết nó.
mveroone

1
Trên thực tế, điều đó có nghĩa là IO của bạn quá chậm. "Làm cho máy chủ nhanh hơn" là khác nhau cho dù bạn bị giới hạn CPU hay CPU của bạn đang bị đói vì ai đó đã quyết định đĩa máy tính xách tay chậm là đủ để chạy máy chủ cơ sở dữ liệu và tải IO làm cho CPU chỉ sử dụng 2% những gì có thể, chờ đợi điên cho IO kết thúc.
TomTom

OMG Tôi không thể tin rằng 3 câu trả lời hàng đầu ở đây là quá sai . Câu trả lời dưới đây của haridsv là chính xác. Không có cpu nào đang "chờ" để io hoàn thành. Có, một số io có thể bị chặn - thường có lý do chính đáng cho việc này và trong một số trường hợp, tất cả io đều có thể bị chặn. Nhưng bạn cũng có thể thấy iowait xảy ra cho các hoạt động hoàn toàn không đồng bộ.
symcbean

47

Câu hỏi cũ, gần đây bị trả lời, nhưng cảm thấy câu trả lời hiện tại là không đủ.

Định nghĩa và tính chất của IOWait

IOWait (thường được dán nhãn %waở trên cùng) là một danh mục con của trạng thái nhàn rỗi ( %idlethường được biểu thị là tất cả không hoạt động trừ các danh mục con được xác định), có nghĩa là CPU không làm gì cả. Do đó, miễn là có một quy trình khác mà CPU có thể xử lý, nó sẽ làm như vậy. Ngoài ra, nhàn rỗi, người dùng, hệ thống, iowait, vv là một phép đo đối với CPU. Nói cách khác, bạn có thể nghĩ về iowait là sự nhàn rỗi do chờ đợi io.

Chính xác, iowait là thời gian dành cho việc nhận và xử lý các ngắt phần cứng dưới dạng phần trăm của bộ xử lý. Các ngắt phần mềm thường được labled riêng như %si.

Tầm quan trọng & quan niệm sai lầm tiềm năng

IOWait rất quan trọng vì nó thường là một số liệu chính để biết liệu bạn có bị tắc nghẽn trên IO hay không. Nhưng sự vắng mặt của iowait không có nghĩa là ứng dụng của bạn không bị tắc nghẽn trên IO. Hãy xem xét hai ứng dụng đang chạy trên một hệ thống. Nếu chương trình 1 bị tắc nghẽn nặng nề và chương trình 2 là người dùng CPU nặng, thì %user + %systemCPU vẫn có thể giống như ~ 100% và tương ứng, iowait sẽ hiển thị 0. Nhưng đó chỉ là vì chương trình 2 chuyên sâu và dường như không nói gì về chương trình 1 vì tất cả điều này là từ quan điểm của CPU.

Công cụ phát hiện IOWait

Xem bài viết của Dave Cheney và Xerxes

Nhưng cũng đơn giản topsẽ hiển thị trong %wa.

Giảm IOWait

Ngoài ra, như chúng ta hiện đang gần như bước vào năm 2013, ngoài những gì người khác nói, tùy chọn đơn giản là các thiết bị lưu trữ IO tuyệt vời có giá cả phải chăng, cụ thể là SSD. SSD thật tuyệt vời !!!


35

iowait

iowaitlà thời gian mà bộ xử lý / bộ xử lý đang chờ (nghĩa là ở trạng thái không hoạt động và không làm gì cả ), trong thời gian đó thực tế các yêu cầu I / O đĩa nổi bật.

Điều này thường có nghĩa là các thiết bị khối (tức là đĩa vật lý, không phải bộ nhớ) quá chậm hoặc đơn giản là bão hòa.

Do đó, bạn nên lưu ý rằng nếu bạn thấy mức trung bình tải cao trên hệ thống của mình và trên thông báo kiểm tra rằng hầu hết điều này thực sự là do chờ đợi I / O, điều đó không nhất thiết có nghĩa là hệ thống của bạn gặp sự cố - và điều này xảy ra khi bạn máy đơn giản là không có gì để làm, ngoài các quy trình ràng buộc I / O (tức là các quy trình thực hiện nhiều I / O hơn bất kỳ thứ gì khác (các cuộc gọi hệ thống không liên kết I / O)). Điều đó cũng rõ ràng từ thực tế là bất cứ điều gì bạn làm trên hệ thống vẫn rất nhạy.

công cụ

  • sar(từ sysstatgói, có sẵn trên hầu hết các máy * nix)
  • iostat
  • sarface(một mặt trước để sar)

7
Lưu ý rằng, nói đúng ra, định nghĩa về thời gian chờ I / O chỉ có hiệu lực trên các hệ thống xử lý đơn. Nó cần được tinh chỉnh một chút cho các hệ thống đa bộ xử lý: veithen.blogspot.be/2013/11/iowait-linux.html
Andreas Veithen

Đến mức độ nào iowaitảnh hưởng Load Average? Nói, 100 chủ đề đang chờ mạng, LA sẽ là 100?
Ivan Balashov

32

Tôi thấy lời giải thích và ví dụ từ liên kết này rất hữu ích: "iowait" chính xác là gì? . BTW, để hoàn thiện, I / O ở đây đề cập đến I / O của đĩa, nhưng cũng có thể bao gồm I / O trên một đĩa được gắn trên mạng (như nfs), như được giải thích trong bài đăng khác này .

Tôi sẽ trích dẫn một vài phần quan trọng (trong trường hợp liên kết bị chết), một số trong đó sẽ là sự lặp lại của những gì người khác đã nói, nhưng với tôi ít nhất những điều này đã rõ ràng hơn:

Để tóm tắt nó trong một câu, 'iowait' là phần trăm thời gian CPU không hoạt động VÀ có ít nhất một I / O đang diễn ra.

Mỗi CPU có thể ở một trong bốn trạng thái: user, sys, idle, iowait.

Tôi đã tự hỏi điều gì xảy ra khi hệ thống có các quy trình khác sẵn sàng để chạy trong khi một quy trình đang chờ I / O. Dưới đây giải thích nó:

Nếu CPU không hoạt động, thì nhân sẽ xác định xem có ít nhất một I / O hiện đang tiến hành với một đĩa cục bộ hay một đĩa được gắn từ xa (NFS) đã được khởi tạo từ CPU đó hay không. Nếu có, thì bộ đếm 'iowait' được tăng thêm một. Nếu không có I / O trong tiến trình được khởi tạo từ CPU đó, bộ đếm 'nhàn rỗi' được tăng thêm một.

Và đây là một ví dụ:

Hãy nói rằng có hai chương trình chạy trên CPU. Một là chương trình 'dd' đọc từ đĩa. Chương trình còn lại là chương trình không có I / O nhưng dành 100% thời gian để thực hiện công việc tính toán. Bây giờ giả sử rằng có một vấn đề với hệ thống con I / O và rằng I / O vật lý đang chiếm một giây để hoàn thành. Bất cứ khi nào chương trình 'dd' ngủ trong khi chờ I / O của nó hoàn thành, chương trình kia có thể chạy trên CPU đó. Khi ngắt đồng hồ xảy ra, sẽ luôn có một chương trình chạy ở chế độ người dùng hoặc chế độ hệ thống. Do đó, giá trị% idle và% iowait sẽ là 0. Mặc dù hiện tại iowait là 0, nhưng điều đó không có nghĩa là KHÔNG có vấn đề I / O vì rõ ràng có một vấn đề nếu I / O vật lý đang hoàn thành trong một giây.

Toàn văn đáng để đọc. Đây là một tấm gương của trang này , trong trường hợp nó đi xuống.


1

Đối với Solaris, tôi sử dụng DTrace để xem các quy trình đang làm gì nếu tôi cần xem các hoạt động I / O đang chạy. Đối với Linux, có một chương trình tương tự gọi là systemtap cung cấp mức độ tiếp xúc tương tự với kernel và xử lý các cuộc gọi.

Một ví dụ tôi đã sử dụng khi học DTrace là so sánh một cplệnh với một ddlệnh. Bạn có thể thấy rằng ddđọc nhiều hơn cho ghi, trong khi cpkhông, chủ yếu là do kích thước bộ đệm ddsử dụng theo mặc định (nếu tôi nhớ chính xác).


0

Loại hoạt động IO nào sẽ phụ thuộc vào ứng dụng và thiết lập của bạn.

Điều quan trọng là trong một số trường hợp, CPU không thể nhận được dữ liệu hoặc hướng dẫn mà nó cần tiếp tục. Trong một số trường hợp, nó có thể tiếp tục, nhưng nó sẽ phụ thuộc vào ứng dụng nào đang chạy như những gì nó có thể làm. Nếu bạn có một ứng dụng luồng đơn có nhiều quyền truy cập đĩa thì bạn sẽ phải chờ.

Để giảm thiểu thời gian IO, hãy mua bộ nhớ nhiều hơn và nhanh hơn, lấy đĩa nhanh hơn, chống phân mảnh đĩa bạn có.

Nếu đó là một ứng dụng nội bộ, đó là nút cổ chai xem liệu nó có thể được tối ưu hóa để đọc trong các khối lớn hơn hay thực hiện IO không đồng bộ.


Được rồi, vậy iowait là thời gian dành cho hoạt động chặn IO?
Peter Krumins

Vì vậy, ví dụ, nếu tôi thực hiện select () hoặc poll () và nó chặn, thì thời gian chờ đợi cho đến khi một mô tả có sẵn sẽ tạo thành thời gian iowait?
Peter Krumins

Tôi nghĩ rằng nó sẽ thuộc về SO vì nó giống như một câu hỏi lập trình.
Jeremy Pháp

Peteris - vâng, đó là một cách tốt để suy nghĩ về nó.
dùng2278

0

sử dụng ps aux có thể in quá trình STAT
nếu stat là D hoặc Ds, quá trình ở chế độ ngủ không bị gián đoạn (thường là IO)
khi một quá trình đi vào giấc ngủ không bị gián đoạn, nr_iowait của runqueue được thêm vào và nếu nr_iowait> 0, thì thời gian nhàn rỗi của cpu để iowait

vmstat cũng cho thấy có bao nhiêu khối quy trình
r: Số lượng quá trình đang chờ thời gian chạy.
b: Số lượng quá trình trong giấc ngủ không bị gián đoạn.

http://bencane.com/2012/08/06/troubledhoot-high-io-wait-in-linux/

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.