Trên hệ thống nhiều người dùng, tôi muốn đo mức sử dụng CPU của mỗi người dùng trong vài giây thời gian cpu. Với mục đích của phép đo này, tôi giả sử rằng nếu một PID thuộc về người dùng, thì người dùng này đang gây ra thời gian cho CPU - đó là tôi bỏ qua trình nền và nhân.
Hiện tại tôi đang làm điều này, cứ năm giây một lần:
- Nhận từng người dùng và các PID họ đang chạy qua
ps aux
- Đối với mỗi PID, get
x
, tổng của utime, cutime, stime và cstime từ/proc/[pid]/stat
- tính toán
t = x / interval
(khoảng thời gian không phải luôn luôn chính xác 5 giây khi có tải cao)
Nếu tôi chạy cái này, tôi sẽ có được các giá trị tìm kiếm hợp lý. Ví dụ: Một người dùng trên hệ thống này đã quay bằng python ( while True: pass
) và hệ thống đang hiển thị khoảng 750 mili giây thời gian CPU mỗi giây. Khi hệ thống treo một chút, nó báo cáo 1600ms cho một giây trong một giây. Điều này có vẻ đúng, nhưng tôi khẳng định rằng những giá trị này có thể bị lừa dối, đặc biệt là tôi không thực sự hiểu chúng.
Vì vậy, câu hỏi của tôi là:
Một cách công bằng và chính xác để đo tải CPU trên cơ sở mỗi người dùng là gì?
Phương pháp phải khá chính xác. Có thể có hàng trăm người dùng trên hệ thống này, do đó, trích xuất tỷ lệ phần trăm từ ps aux
sẽ không đủ chính xác, đặc biệt là đối với các luồng tồn tại ngắn mà nhiều phần mềm muốn sinh ra.
Trong khi điều này có thể phức tạp, tôi hoàn toàn biết nó có thể. Đây là điểm khởi đầu của tôi:
Nhân theo dõi thời gian tạo quy trình cũng như thời gian CPU mà nó tiêu thụ trong suốt vòng đời của nó. Mỗi đồng hồ đánh dấu, kernel cập nhật lượng thời gian trong các cảnh báo mà quy trình hiện tại đã sử dụng trong hệ thống và trong chế độ người dùng. - (từ Dự án Tài liệu Linux )
Giá trị tôi theo sau là số giây (hoặc jiffies) mà người dùng đã chi cho CPU, không phải là tỷ lệ phần trăm của tải hệ thống hoặc sử dụng cpu.
Điều quan trọng là chúng tôi đo thời gian CPU trong khi các quy trình vẫn đang chạy. Một số quy trình sẽ chỉ kéo dài trong nửa giây, một số quy trình sẽ kéo dài trong nhiều tháng - và chúng tôi cần nắm bắt cả hai loại, để chúng tôi có thể tính toán thời gian CPU của người dùng với độ chi tiết tốt.
top
có thể làm chế độ hàng loạt? top -b -n 1 -u {user} | awk 'NR>7 { sum += $9; } END { print sum; }'
sẽ hiển thị tải cho {user} tại thời điểm đó.