Cách công bằng nhất để theo dõi tổng thời gian CPU - mỗi người dùng là gì?


25

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:

  1. Nhận từng người dùng và các PID họ đang chạy qua ps aux
  2. Đối với mỗi PID, get x, tổng của utime, cutime, stime và cstime từ/proc/[pid]/stat
  3. 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 auxsẽ 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.


1
500 danh tiếng: o cơ hội tốt cho người mới bắt đầu
Tachyons

Một chút ra khỏi giải đấu của tôi, nhưng một câu hỏi rất thú vị vì vậy tôi đã đào một chút và tìm thấy một cái gì đó mà tôi hy vọng ít nhất là hữu ích để giúp bạn giải quyết điều này: stackoverflow.com/a/1424556/905573
kingmilo 27/212

1
Bạn có biết topcó 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 đó.
Rinzwind

Câu trả lời:


11

Âm thanh như bạn cần quá trình kế toán.

http://www.faqs.org/docs/Linux-mini/Process-Accounting.html

Trên Ubuntu, các công cụ kế toán quy trình có trong acctgói Cài đặt acct

Để nhận báo cáo theo người dùng, hãy chạy

sa -m

Thật không may, điều này sẽ không hoạt động đối với tôi vì "sa" sẽ không tính các quy trình chạy dài. Những gì tôi cần (tôi nghĩ) là một cách để phát hiện các quá trình đang được bắt đầu và chấm dứt, và để ghi lại thời gian cpu của chúng khi chúng thoát, cũng như trong khi chúng đang chạy.
Stefano Palazzo

@StefanoPalazzo Tôi tin rằng đây là thứ tốt nhất bạn sẽ nhận được. Tăng cường nó với thời gian để chạy các quy trình từ /proc/[pid]/stat.
ændrük

Hóa ra, dường như hầu hết tất cả các quy trình sẽ được tính đúng theo sa(.ps.gz) . Và tôi cũng có một cách tốt để "ước tính" các quy trình chạy dài đó, trước khi cuối cùng cũng nhận được một giá trị chính xác cho các quy trình đó. Vì vậy, chúng tôi sẽ sử dụng nó sau tất cả, và tôi rất vui khi trao phần thưởng cho câu trả lời của bạn. Cảm ơn nhiều!
Stefano Palazzo

3

Điều này sẽ đưa ra một dòng cho mỗi người dùng hiển thị tên người dùng và tổng thời gian cpu của họ:

ps -w -e --no-header -o uid,user \
        | sort -u \
        | while read uid user; do
                echo -e "$user\t"$(
                        ps --no-headers -u $uid --cumulative -o time \
                                | sed -e s/:/*3600+/ -e s/:/*60+/ \
                                | paste -sd+ \
                                | bc
                );
        done

2

Một trong những câu trả lời rõ ràng hơn là chỉ mở rộng những gì bạn đang làm hiện tại.

Tôi đã xem qua quy trình giám sát này để sử dụng bash scripting và mysql để theo dõi thời gian cpu của người dùng nhưng nó được kéo dài qua khung thời gian lớn hơn nhiều so với bạn đang nói.

Hy vọng rằng điều này có thể cung cấp cho bạn thêm một số ý tưởng về hướng bạn đang hướng tới.

http://www.dba-oracle.com/t_oracle_unix_linux_vmstat_capture.htmlm


0

Điều này cũng sẽ xử lý các quy trình đã chạy trong nhiều ngày..không chắc chắn làm thế nào để mở rộng trong vài tuần / tháng / năm ..

ps -w -e --no-header -o uid,user \
    | sort -u \
    | while read uid user; do
            echo -e "$user\t"$(
                    ps --no-headers -u $uid --cumulative -o time \
                          | sed -e s/-/*86400+/ -e s/:/*3600+/ -e s/:/*60+/ 
                          | paste -sd+ \
                          | bc
            );
    done
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.