2008-10-30 29 views
14

Trên một máy chủ Debian cụ thể, iostat (và tương tự) báo cáo một khối lượng bất ngờ cao (tính bằng byte) của đĩa ghi đang diễn ra. Tôi đang gặp khó khăn khi tìm ra quy trình nào đang thực hiện những việc viết này.Làm cách nào để ghi lại quá trình hoặc hoạt động hạt nhân đang sử dụng đĩa trong GNU/Linux?

Hai điểm thú vị:

  1. thử tắt các dịch vụ hệ thống cùng một lúc không có kết quả. Hoạt động của đĩa vẫn tương đối cao và bất ngờ cao.

  2. Mặc dù văn bản, dường như không tiêu thụ nhiều không gian tổng thể hơn trên đĩa.

Cả hai đều khiến tôi nghĩ rằng văn bản có thể là hạt nhân đang làm nhưng tôi không đổi, vì vậy không rõ tôi có thể viết gì để viết.

thể thử trên đỉnh:

http://www.atcomputing.nl/Tools/atop/

nhưng muốn tránh vá hạt nhân của tôi.

Bất kỳ ý tưởng nào về cách theo dõi sự cố này?

Trả lời

0

Bạn có thể thử sử dụng SystemTap, nó có rất nhiều ví dụ và nếu tôi không nhầm, nó cho thấy cách thực hiện điều này.

1

Bạn có thể sử dụng lệnh UNIX lsof (liệt kê các tệp đang mở). Điều đó in ra quá trình, process-id, người dùng cho bất kỳ tập tin mở.

2

Bạn có thể muốn điều tra iotop cho Linux. Có một số phiên bản Solaris nổi xung quanh, nhưng có một gói Debian chẳng hạn.

3

Nếu bạn đang sử dụng hạt nhân mới hơn 2.6.20 rất dễ, vì đó là phiên bản đầu tiên của hạt nhân Linux bao gồm kế toán I/O. Nếu bạn đang biên dịch hạt nhân của riêng bạn, hãy đảm bảo bao gồm:

CONFIG_TASKSTATS=y 
CONFIG_TASK_IO_ACCOUNTING=y 

Nhân từ gói Debian đã bao gồm những lá cờ này, vì vậy không cần phải biên dịch lại hạt nhân của bạn. Tiện ích tiêu chuẩn để truy cập dữ liệu kế toán I/O trong thời gian thực là iotop (1). Nó cung cấp cho bạn một danh sách đầy đủ các quy trình được quản lý bởi I/O scheduler, và hiển thị cho mỗi thống kê quy trình cho đọc, ghi và tổng số I/O băng thông được sử dụng.

16

iotop tốt (tuyệt vời, thực sự).

Nếu bạn có hạt nhân từ trước 2.6.20, bạn không thể sử dụng hầu hết các công cụ này.

Thay vào đó, bạn có thể thử như sau (mà nên làm việc cho IIRC hầu hết 2,6 kernel):

  
sudo -s 
dmesg -c 
/etc/init.d/klogd stop 
echo 1 > /proc/sys/vm/block_dump 
rm /tmp/disklog 
watch "dmesg -c >> /tmp/disklog" 
    CTRL-C when you're done collecting data 
echo 0 > /proc/sys/vm/block_dump 
/etc/init.d/klogd start 
exit (quit root shell) 

cat /tmp/disklog | awk -F"[() \t]" '/(READ|WRITE|dirtied)/ {activity[$1]++} END {for (x in activity) print x, activity[x]}'| sort -nr -k2 

Các dòng -c dmesg xóa log kernel. Các logger sau đó được tắt, bằng tay (sử dụng đồng hồ) đổ vào một đĩa (bộ nhớ đệm là nhỏ, đó là lý do tại sao chúng ta cần phải làm điều này). Hãy để nó chạy trong khoảng năm phút hoặc lâu hơn, và sau đó là CTRL-c quá trình xem. Sau khi tắt quá trình ghi nhật ký và khởi động lại klogd, hãy phân tích kết quả bằng cách sử dụng chút xíu ở cuối.

+0

Bất kỳ lý do nào mà gốc sẽ không thể thực thi 'echo 1>/proc/sys/vm/block_dump' với lỗi sau "bash: echo: write error: Operation not allowed"? Đây là một môi trường ảo hóa, vì vậy tôi đoán đó là lý do tại sao ... :( –

+5

Tôi chưa bao giờ thử trên một hệ thống ảo hóa. Nếu bạn đang chạy qua sudo, hãy lưu ý rằng bạn không thể chỉ làm sudo echo 1>/proc/sys/vm/block_dump, bởi vì chỉ echo được sudoed, không phải là chuyển hướng.Bạn sẽ cần phải làm sudo bash -c "echo 1>/proc/sys/vm/block_dump" – Mikeage

1

Bạn cũng có thể sử dụng htop, bật cột IO_RATR. Htop là một thay thế hàng đầu exelent.

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