Cách kiểm tra mức sử dụng I / O của đĩa trên mỗi tiến trình


45

Tôi gặp vấn đề với hệ thống Linux đang bị đình trệ và tôi đã tìm thấy sysstat / sar để báo cáo các đỉnh lớn trong việc sử dụng I / O của đĩa, thời gian phục vụ trung bình cũng như thời gian chờ trung bình tại thời điểm ngừng hoạt động của hệ thống.

Làm thế nào tôi có thể đi để xác định quá trình nào gây ra các đỉnh này vào lần tiếp theo?
Có thể thực hiện với sar (tức là: tôi có thể tìm thấy thông tin này từ các tệp sar được ghi lại không?

Đầu ra cho "sar -d", gian hàng hệ thống đã xảy ra vào khoảng 12,58-13,01pm.

12:40:01          DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
12:40:01       dev8-0     11.57      0.11    710.08     61.36      0.01      0.97      0.37      0.43
12:45:01       dev8-0     13.36      0.00    972.93     72.82      0.01      1.00      0.32      0.43
12:50:01       dev8-0     13.55      0.03    616.56     45.49      0.01      0.70      0.35      0.47
12:55:01       dev8-0     13.99      0.08    917.00     65.55      0.01      0.86      0.37      0.52
13:01:02       dev8-0      6.28      0.00    400.53     63.81      0.89    141.87    141.12     88.59
13:05:01       dev8-0     22.75      0.03    932.13     40.97      0.01      0.65      0.27      0.62
13:10:01       dev8-0     13.11      0.00    634.55     48.42      0.01      0.71      0.38      0.50

Đây là một câu hỏi tiếp theo cho một chủ đề tôi đã bắt đầu ngày hôm qua: Đột nhiên đỉnh tải và khối đĩa chờ đợi , tôi hy vọng rằng tôi đã tạo ra một chủ đề / câu hỏi mới về vấn đề này vì tôi chưa thể giải quyết vấn đề.


Có vẻ như vấn đề có thể là một quá trình cụ thể và nhiều hơn một đĩa không phản hồi. Đĩa làm những thứ này ở cấp độ hệ thống dường như là vách đá mà hệ thống đâm vào. Nếu bạn không tìm thấy thủ phạm, thì đã đến lúc điều tra hệ thống phụ đĩa.
slashdot



Câu trả lời:


47

Nếu bạn đủ may mắn để nắm bắt giai đoạn sử dụng cao điểm tiếp theo, bạn có thể nghiên cứu các số liệu thống kê I / O theo quy trình một cách tương tác, sử dụng iotop .


Này cảm ơn nhé! Một đồ chơi đam mê khác để lưu trữ trong hộp công cụ của tôi. :-)
Janne Pikkarainen

Chạy iotop trong chế độ hàng loạt có thể là sự bổ sung / thay thế rất tốt cho giải pháp "ps -eo" ở trên. Cảm ơn!
Avada Kedavra

2
Tuyệt vời, "iotop -n 1 -b -o" cung cấp chính xác đầu ra tôi cần. Cảm ơn!
Avada Kedavra

có vẻ như điều này yêu cầu quyền truy cập root vào hệ thống để chạy
user5359531

30

Bạn có thể sử dụng pidstat để in số liệu thống kê io tích lũy cho mỗi quy trình cứ sau 20 giây với lệnh này:

# pidstat -dl 20

Mỗi hàng sẽ có các cột follwing:

  • PID - ID tiến trình
  • kB_rd / s - Số kilobyte mà tác vụ đã gây ra được đọc từ đĩa mỗi giây.
  • kB_wr / s - Số kilobyte mà tác vụ đã gây ra hoặc sẽ được ghi vào đĩa mỗi giây.
  • kB_ccwr / s - Số kilobyte có ghi vào đĩa đã bị hủy bởi tác vụ. Điều này có thể xảy ra khi tác vụ cắt bớt một số pagecache bẩn. Trong trường hợp này, một số IO mà một nhiệm vụ khác đã được tính sẽ không xảy ra.
  • Lệnh - Tên lệnh của tác vụ.

Đầu ra trông như thế này:

05:57:12 PM       PID   kB_rd/s   kB_wr/s kB_ccwr/s  Command
05:57:32 PM       202      0.00      2.40      0.00  jbd2/sda1-8
05:57:32 PM      3000      0.00      0.20      0.00  kdeinit4: plasma-desktop [kdeinit]              

05:57:32 PM       PID   kB_rd/s   kB_wr/s kB_ccwr/s  Command
05:57:52 PM       202      0.00      0.80      0.00  jbd2/sda1-8
05:57:52 PM       411      0.00      1.20      0.00  jbd2/sda3-8
05:57:52 PM      2791      0.00     37.80      1.00  kdeinit4: kdeinit4 Running...                   
05:57:52 PM      5156      0.00      0.80      0.00  /usr/lib64/chromium/chromium --password-store=kwallet --enable-threaded-compositing 
05:57:52 PM      8651     98.20      0.00      0.00  bash 

05:57:52 PM       PID   kB_rd/s   kB_wr/s kB_ccwr/s  Command
05:58:12 PM       202      0.00      0.20      0.00  jbd2/sda1-8
05:58:12 PM      3000      0.00      0.80      0.00  kdeinit4: plasma-desktop [kdeinit]              

10

Không có gì đánh bại việc theo dõi liên tục, bạn chỉ đơn giản là không thể lấy lại dữ liệu nhạy cảm với thời gian sau sự kiện ...

Tuy nhiên, có một vài điều bạn thể kiểm tra để ngụ ý hoặc loại bỏ tuy nhiên - /proclà bạn của bạn.

sort -n -k 10 /proc/diskstats
sort -n -k 11 /proc/diskstats

Các trường 10, 11 là các lĩnh vực được viết tích lũy và thời gian viết (ms) tích lũy. Điều này sẽ hiển thị các phân vùng hệ thống tập tin nóng của bạn.

cut -d" " -f 1,2,42 /proc/*/stat | sort -n -k +3

Các trường đó là PID, lệnh và tích tắc IO-chờ tick. Điều này sẽ hiển thị các quy trình nóng của bạn, mặc dù chỉ khi chúng vẫn đang chạy . (Bạn có thể muốn bỏ qua các chủ đề tạp chí hệ thống tập tin của bạn.)

Tính hữu ích của những điều trên phụ thuộc vào thời gian hoạt động, bản chất của các quy trình chạy dài của bạn và cách sử dụng hệ thống tệp của bạn.

Hãy cẩn thận: không áp dụng cho hạt nhân trước 2.6, kiểm tra tài liệu của bạn nếu không chắc chắn.

(Bây giờ hãy đi và làm cho tương lai của bạn một ưu tiên, cài đặt Munin / Nagios / Cacti / bất cứ điều gì ;-)


10

Sử dụng atop. ( http://www.atoptool.nl/ )

Ghi dữ liệu vào một tệp nén atopcó thể đọc sau này theo kiểu tương tác. Hãy đọc (delta) cứ sau 10 giây. thực hiện 1080 lần (3 giờ; vì vậy nếu bạn quên nó, tệp đầu ra sẽ không khiến bạn hết đĩa):

$ atop -a -w historical_everything.atop 10 1080 &

Sau khi điều tồi tệ lại xảy ra:

(ngay cả khi nó vẫn đang chạy trong nền, nó chỉ xuất hiện sau mỗi 10 giây)

% atop -r historical_everything.atop

Vì bạn đã nói IO, tôi sẽ nhấn 3 phím: tdD

t - move forward to the next data gathering (10 seconds)
d - show the disk io oriented information per process
D - sort the processes based on disk activity
T - go backwards 1 data point (10 seconds probably)
h - bring up help
b - jump to a time (nearest prior datapoint) - e.g. b12:00 - only jumps forward
1 - display per second instead of delta since last datapiont in the upper half of the display

5

Sử dụng btrace. Thật dễ dàng để sử dụng, ví dụ btrace /dev/sda. Nếu lệnh không có sẵn, nó có thể có sẵn trong gói blktrace .

EDIT : Vì debugfs không được kích hoạt trong kernel, bạn có thể thử date >>/tmp/wtf && ps -eo "cmd,pid,min_flt,maj_flt" >>/tmp/wtfhoặc tương tự. Lỗi ghi nhật ký trang tất nhiên không giống với sử dụng btrace, nhưng nếu bạn may mắn, nó có thể cung cấp cho bạn một số gợi ý về các quy trình đói đĩa nhất. Tôi vừa thử một trong những máy chủ chuyên sâu I / O nhất của tôi và danh sách bao gồm các quy trình tôi biết đang tiêu thụ rất nhiều I / O.


Xin chào Janne, kernel rất tiếc không được biên dịch với hệ thống tệp gỡ lỗi và nó là một hệ thống trực tiếp nên tôi không thể biên dịch lại kernel. Có cách nào khác để làm điều này mà không cần biên dịch lại không?
Avada Kedavra

OK, tôi đã chỉnh sửa câu trả lời của mình một chút :)
Janne Pikkarainen

Tuyệt, giờ chúng ta đang đến một nơi nào đó! Tôi nghĩ về việc đưa cái này vào một cronjob và thực hiện nó đồng thời với công việc sar cron. Sau đó, lần tới khi máy chủ ngừng hoạt động, tôi sẽ có thể so sánh tốc độ của các lỗi trang để xem quy trình / quy trình nào có tỷ lệ lỗi trang tăng lên. Tôi đoán rằng tôi có thể không may mắn và thấy sự gia tăng trong đĩa io cho tất cả các quy trình trong gian hàng, nhưng chắc chắn nó đáng để thử. Cảm ơn Janne! (tôi sẽ bỏ phiếu cho câu trả lời của bạn nếu tôi có thể: S)
Avada Kedavra

Không có gì. Hãy cho tôi biết nó đã diễn ra như thế nào, đây chỉ là một nỗ lực giải quyết vấn đề sáng tạo từ tôi. :-)
Janne Pikkarainen

Đầu ra iotop dễ hiểu hơn, vì vậy không chấp nhận giải pháp đó. Tôi sẽ trở lại để bỏ phiếu cho câu trả lời của bạn ngay sau khi tôi kiếm được đại diện đủ để làm như vậy. Cảm ơn sự hỗ trợ của bạn!
Avada Kedavra
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.