Là tổng của tất cả các PID của utime Hồi giáo là tổng số hệ thống không?


9

Để đo tổng thời gian CPU của người dùng, tôi đang sử dụng trường "utime" ngoài /proc/[pid]/stat:

utime %lu   Amount of time that this process has been scheduled in user
            mode, measured in clock ticks (divide by
            sysconf(_SC_CLK_TCK).  This includes guest time, guest_time
            (time spent running a virtual CPU, see below), so that
            applications that are not aware of the guest time field do
            not lose that time from their calculations.

(từ người đàn ông Proc (5) )

Vì vậy, "utime người dùng" của tôi là tổng utimecủa tất cả các PID mà người dùng này đang chạy.

Tôi hy vọng điều này sẽ mang lại cho tôi một giá trị chính xác cho số giây CPU mà người dùng này đã bỏ ra. Có phải tôi đang trên đường ray bên phải không?

Một số điều tôi chưa hiểu hoặc chưa tính đến:

  • Mỗi PID cũng có một cha mẹ (hoặc không). Nhưng tôi đang đếm từng PID, không chỉ những người có ppid bằng 0. Điều này có đúng không?
  • Ngoài ra, ngoài utime, stime, cutime và cstime. Tôi có cần phải lo lắng về những điều đó? Tôi giả định rằng utime là tổng số giây cpu cho một bộ vi xử lý, không tính phụ huynh.

Nếu tôi tính tổng thời gian cpu của hệ thống bằng cách sử dụng /proc/uptime, giá trị này khá gần với tổng của tôi cho tất cả người dùng, nhưng sự khác biệt là đáng kể. Chẳng hạn (tính bằng phút):

system cpu_time:         96.13
sum of users_cputime:   111.45

Điều chỉnh:

Tôi nhận được các giá trị "tìm kiếm hợp lý" cho tất cả các loại. Hiện tại tôi đang sử dụng tổng hợp của utime, stime, cutime và cstime. Và nó báo cáo các giá trị mà trong khi tôi không hiểu chúng, thì tương quan rất tốt với các phép đo từ đó time.

Nếu tôi hoàn toàn đi sai đường, có một câu hỏi khác:


/proc/cputimekhông có bất kỳ thông tin nào về thời gian dành cho các quá trình thực thi CPU, vì vậy tôi rất băn khoăn không biết tính toán cpu_time của hệ thống của bạn là gì. Nếu bạn đang làm gì đó với số thứ hai, đó là thời gian dành cho nhiệm vụ nhàn rỗi ; Tôi không biết chính xác điều đó có nghĩa gì trong thực tế.
Gilles 'SO- ngừng trở nên xấu xa'

1
Thời gian người dùng của bạn, người dùng sẽ phải thêm các giá trị không tưởng từ tất cả các quy trình chết. Làm thế nào để bạn đưa những tài khoản vào?
Gilles 'SO- ngừng trở nên xấu xa'

Ừm. Cái mà tôi gọi là "thời gian cpu hệ thống" chỉ là giá trị đầu tiên từ / Proc / thời gian hoạt động, "giây hệ thống". Tôi đã nghĩ rằng điều này là quá cao, vì nó cũng tính các chuỗi nhân, nhưng như bạn có thể thấy tổng của tất cả các giá trị "utime" vẫn cao hơn thời gian hệ thống từ / Proc / utime. Liên kết của bạn, theo như tôi có thể nói, giải thích tại sao. Mặc dù rõ ràng: tôi thực sự không quan tâm đến con số đó. Tôi quan tâm đến "thời gian cpu cho mỗi người dùng".
Stefano Palazzo

Đối với nhận xét thứ hai: Hiện tại, tôi đã lên kế hoạch đo lường định kỳ này (nói mỗi giây), sẽ bỏ qua các quy trình ngắn.
Stefano Palazzo

Vậy tính toán thời gian cpu hệ thống của bạn là ($ 1- $ 2 / $ number_of_cups) trong đó $ 1 và $ 2 là các giá trị từ /proc/uptimeđâu? Sau đó, tôi đoán rằng I / O được gán cho nhiệm vụ nhàn rỗi sẽ giải thích sự khác biệt. Tôi không biết gì về chủ đề này, vì vậy tôi nghi ngờ mình đang thiếu một điều quan trọng: Tôi sẽ không mong đợi quá nhiều sẽ xảy ra trong nhiệm vụ nhàn rỗi, đặc biệt khi xem xét rằng tổng số người dùng của bạn có thể bị thiếu rất nhiều quá trình sống.
Gilles 'SO- ngừng trở nên xấu xa'

Câu trả lời:


3

Cách truyền thống để ghi nhật ký và theo dõi thời gian CPU của người dùng là quá trình kế toán . Trên Linux, cài đặt các tiện ích kế toán GNU , thường được cung cấp bởi gói có tên acct. Tôi không chắc chính xác đến mức nào khi theo dõi thời gian dành cho các quy trình có thời gian rất ngắn, nhưng ít nhất nó sẽ liệt kê tất cả các quy trình từng được thực hiện.

Chạy lastcommđể nhận danh sách tất cả các lệnh được thực thi bởi bất kỳ người dùng nào và thời gian dành cho mỗi lệnh (làm tròn đến ~ 10ms cho các quy trình có thời gian ngắn, dự kiến ​​sẽ thấy rất nhiều 0.00). Chạy sađể hiển thị số tiền khác nhau và số liệu thống kê. Đặc biệt, sa -mhiển thị tổng số trên mỗi người dùng. Số liệu thống kê được tích lũy bằng cách sachạy từ vòng quay cuối cùng của nhật ký kế toán (thường nằm ở /var/log/account/).

Lưu ý rằng bạn sẽ không nắm bắt tất cả các quy trình bằng cách lấy mẫu theo chu kỳ, không phải là quá xa. Bạn sẽ bỏ lỡ gần như tất cả các quy trình tồn tại ngắn và vài giây cuối cùng của các quy trình dài. Kế toán quy trình không liệt kê tất cả các quá trình trong quá khứ.

Trong đó /proc/$pid/stat, thời gian của người dùng là thời gian dành cho việc tính toán, trái ngược với thời gian hệ thống dành cho việc thực hiện I / O. Cái nào cần đếm phụ thuộc vào những gì bạn muốn làm với thông tin.

Đếm tất cả các PID là đúng. Tôi không biết PID cha mẹ phải làm gì với điều này.

Về phía hệ thống, mô tả của bạn /proc/uptimecó vẻ sai. Wikipedia có nó ngay khi tôi viết. Trường đầu tiên là thời gian thực trôi qua kể từ khi hệ thống khởi động, trừ đi bất kỳ thời gian nào bị treo hoặc ngủ đông. Trường thứ hai là thời gian tích lũy dành cho tác vụ nhàn rỗi trên tất cả các CPU. Tôi không chắc điều đó thực sự có nghĩa là gì; Nó chắc chắn không phải là tổng thời gian nhàn rỗi trên máy của tôi. Trong hạt nhân, giá trị được tóm gọn tronguptime_proc_show từ biến cập nhật trongaccount_idle_time .


Những gì về quá trình chạy rất dài? Có phải sađợi quá trình thoát ra trước khi báo cáo thời gian cpu không?
Stefano Palazzo

@StefanoPalazzo Có, dữ liệu kế toán được ghi khi một quy trình chết. Điều đó cũng có nghĩa là bạn không nhận được dữ liệu cho các quy trình đang chạy sau sự cố hệ thống, theo như tôi biết.
Gilles 'SO- ngừng trở nên xấu xa'

Đó là một vấn đề - điều đó có nghĩa là tôi không thể sử dụng nó, vì chúng ta sẽ có nhiều quy trình dài.
Stefano Palazzo
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.