2014-06-27 12 views
11

Tôi đang làm việc trên mô hình mô phỏng, nơi tôi muốn xác định khi dung lượng lưu trữ IOPS trở thành nút cổ chai (ví dụ: HDD có ~ 150 IOPS, trong khi SSD có thể có 150.000). Vì vậy, tôi đang cố gắng để tìm ra một cách để chuẩn IOPS trong một lệnh (git) cho một số hoạt động khác nhau của nó (push, pull, merge, clone).Làm thế nào để đo IOPS cho một lệnh trong linux?

Cho đến nay, tôi đã tìm thấy các công cụ như iostat, tuy nhiên, tôi không chắc chắn cách giới hạn báo cáo cho những gì một lệnh duy nhất thực hiện.

Ý tưởng tốt nhất mà tôi có thể đưa ra là để xác định công suất IOPS HDD của tôi, sử dụng thời gian vào lệnh thực tế, xem nó kéo dài bao lâu, nhân rằng bằng cách IOPS và những người đang IOPS của tôi:

HDD ->150 IOPS 
time df -h 

real 0m0.032s 

150 * .032 = 4.8 IOPS 

Nhưng, điều này tất nhiên rất ngu ngốc, vì thời gian thực hiện có thể liên quan đến việc sử dụng CPU hơn là sử dụng HDD, vì vậy trừ khi sử dụng HDD là 100% trong thời gian đó, sẽ không có ý nghĩa gì để đo lường những thứ như thế.

Vì vậy, làm cách nào để đo IOPS cho lệnh?

+1

Bản sao có thể có của [câu hỏi SO này] (http://stackoverflow.com/questions/249570/how-can-i-record-what-process-or-kernel-activity-is-using-the-disk- in-gnu-linux) hoặc [Câu hỏi lỗi máy chủ này] (http://serverfault.com/questions/586774/getting-iops-of-the-processes-on-linux) Không thể đánh dấu là trùng lặp do tiền thưởng – Appleman1234

+0

hệ thống điều hành của bạn là gì? Bạn đã kiểm tra [DTrace] (http://www.brendangregg.com/dtrace.html) dành cho Unix/MacOS X/Solaris hay [SystemTap] (https://sourceware.org/systemtap/examples/keyword-index .html) có thể được sử dụng cho Linux? – VolenD

Trả lời

11

Có nhiều lệnh (1) lệnh trên một hệ thống Linux điển hình; mặc định là một bash (1) nội trang được phần nào cơ bản. Ngoài ra còn có /usr/bin/time mà bạn có thể chạy bằng cách gọi chính xác như vậy, hoặc bảo bash (1) không sử dụng bí danh và nội trang dựng sẵn bằng cách thêm tiền tố vào trước đó: \time. Debian có nó trong gói "thời gian" được cài đặt theo mặc định, Ubuntu có thể giống hệt nhau, và các bản phân phối khác sẽ khá giống nhau.

Gọi nó trong một thời trang tương tự như được xây dựng trong vỏ là đã tiết hơn và nhiều thông tin, mặc dù có lẽ đục hơn trừ khi bạn đã quen thuộc với những gì các con số thực sự có nghĩa là:

$ \time df 
[output elided] 
0.00user 0.00system 0:00.01elapsed 66%CPU (0avgtext+0avgdata 864maxresident)k 
0inputs+0outputs (0major+261minor)pagefaults 0swaps 

Tuy nhiên, tôi muốn muốn gây sự chú ý của bạn vào trang người đàn ông trong đó liệt kê các -f tùy chọn để tùy chỉnh định dạng đầu ra, và đặc biệt là định dạng %w mà đếm số lần quá trình này đã từ bỏ timeslice CPU của nó cho I/O:

$ \time -f 'ios=%w' du Maildir >/dev/null 
ios=184 
$ \time -f 'ios=%w' du Maildir >/dev/null 
ios=1 

Lưu ý rằng lần chạy đầu tiên dừng lại cho I/O 184 lần, nhưng lần chạy thứ hai dừng lại chỉ một lần.Con số đầu tiên là đáng tin cậy, vì có 124 thư mục trong số ~/Maildir của tôi: đọc thư mục và inode cung cấp khoảng hai IOPS cho mỗi thư mục, ít hơn một chút vì một số inode có khả năng cạnh nhau và đọc trong một thao tác. thêm một lần nữa để lập bản đồ trong du (1) nhị phân, thư viện được chia sẻ, v.v.

Con số thứ hai dĩ nhiên thấp hơn do bộ nhớ cache trên đĩa của Linux. Vì vậy, phần cuối cùng là xóa bộ nhớ cache. sync (1) là một lệnh quen thuộc, xóa sạch dữ liệu ghi trên đĩa, nhưng không xóa bộ đệm đọc. Bạn có thể xóa bằng cách viết 3 đến /proc/sys/vm/drop_caches. (. Các giá trị khác cũng thỉnh thoảng có ích, nhưng bạn muốn 3 đây) Là một người sử dụng không phải root, cách đơn giản nhất để làm điều này là:

echo 3 | sudo tee /proc/sys/vm/drop_caches 

Kết hợp điều đó với /usr/bin/time nên cho phép bạn xây dựng các kịch bản bạn cần để các lệnh chuẩn bạn quan tâm đến

Như trẻ vị thành niên sang một bên, tee (1) được sử dụng vì điều này sẽ không làm việc:.

sudo echo 3 >/proc/sys/vm/drop_caches 

lý do? Mặc dù echo (1) chạy dưới dạng root, chuyển hướng là tài khoản người dùng bình thường của bạn, nhưng không có quyền ghi vào drop_caches. tee (1) có hiệu quả chuyển hướng là root.

+0

TIL' '\ time'' và xóa bộ nhớ cache. Cảm ơn – xtreak

4

Bạn có thể sử dụng pidstat:
pidstat -d 2
Cụ thể hơn pidstat -d 2 | grep COMMAND hoặc pidstat -C COMMANDNAME -d 2

Lệnh pidstat được sử dụng để theo dõi các nhiệm vụ cá nhân hiện đang được quản lý bởi hạt nhân Linux. Nó ghi vào các hoạt động đầu ra tiêu chuẩn cho mọi tác vụ được chọn với tùy chọn -p hoặc cho mọi tác vụ do nhân Linux quản lý nếu tùy chọn -p ALL đã được sử dụng. Không chọn bất kỳ nhiệm vụ nào tương đương với việc chỉ định -p TẤT CẢ nhưng chỉ các tác vụ đang hoạt động (các nhiệm vụ có giá trị thống kê khác không) sẽ xuất hiện trong báo cáo. Lệnh pidstat cũng có thể được sử dụng để giám sát các tiến trình con của các tác vụ được chọn.

-C chỉ hiển thị các tác vụ có tên lệnh bao gồm chuỗi ký tự. Chuỗi này có thể là một biểu thức chính quy.

+0

Điều này nghe có vẻ thú vị, vì vậy tôi đã thử nó trên hộp Ubuntu 13.04 của tôi và có lệnh 'không tìm thấy: pidstat'. Hóa ra nó không được bao gồm theo mặc định, vì vậy tôi đã phải 'sudo apt-get install sysstat'. (Chỉ đề cập đến việc lưu các người qua đường khác một chút về googling và/hoặc 'apt-file search'ing ...) – evadeflow

8

Lệnh iotop thu thập thông tin sử dụng I/O về các quy trình trên Linux. Theo mặc định, nó là một lệnh tương tác nhưng bạn có thể chạy nó trong chế độ hàng loạt với -b/--batch. Ngoài ra, bạn có thể danh sách các quy trình với -p/--pid. Vì vậy, bạn có thể giám sát hoạt động của một lệnh git với:

$ sudo iotop -p $(pidof git) -b 

Bạn có thể thay đổi sự chậm trễ với -d/--delay.

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