ユーザーごとの合計CPU時間を監視する最も公平な方法は何ですか?


25

マルチユーザーシステムでは、各ユーザーのCPU使用率をCPU時間の秒単位で測定します。この測定のために、PIDがユーザーに属している場合、このユーザーがCPU時間を引き起こしていると想定します。つまり、デーモンとカーネルを無視しています。

現在、5秒ごとにこれを行っています。

  1. 各ユーザーと彼らが実行しているPIDを取得する ps aux
  2. 各PIDについて、get xからutime、cutime、stime、cstimeの合計/proc/[pid]/stat
  3. 計算t = x / interval(高負荷の場合、間隔は常に正確に5秒とは限りません)

これを実行すると、賢明な見た目の値が得られます。たとえば、このシステムのユーザーはpython(while True: pass)で回転しており、システムは毎秒約750ミリ秒のCPU時間を示していました。システムが少しハングしたとき、1秒のインバーバルにつき1600ミリ秒を報告しました。これはほぼ正しいように思えますが、特にこれらの値が本当に理解されていないことを考えると、これらの値が欺くことができることわかりませ

だから私の質問はこれです:

ユーザーごとにCPU負荷を測定する公正で正しい方法は何ですか?

メソッドはかなり正確でなければなりません。このシステムには何百人ものユーザーが存在する可能性があるためps aux、特に多くのソフトウェアが生成する短命スレッドの場合、パーセンテージを抽出することは十分に正確ではありません。

これは複雑かもしれませんが、それが可能であることは絶対に知っています。これが私の出発点でした:

カーネルは、プロセスの作成時間と、その存続期間中に消費するCPU時間を追跡します。クロックティックごとに、カーネルは現在のプロセスがシステムモードとユーザーモードで費やした時間を一瞬で更新します。—(Linux Documentation Projectから

後の値は、ユーザーがCPUに費やした秒数(またはjiffies)であり、システム負荷やCPU使用率のパーセンテージではありません。

プロセスの実行中にCPU時間を測定することが重要です。プロセスのなかには0.5秒しか続かないものもあれば、数か月続くものもあります。両方の種類をキャッチして、ユーザーのCPU時間をきめ細かく把握できるようにする必要があります。


1
500評判:beginersのための良い機会O
タキオン

私のリーグから少し外れていますが、非常に興味深い質問なので、少し掘り下げて、少なくともあなたがこれを解決するのに役立つことを願っています:stackoverflow.com/a/1424556/905573
kingmilo

1
あなたはtopバッチモードを実行できることを知っていますか?top -b -n 1 -u {user} | awk 'NR>7 { sum += $9; } END { print sum; }'その時点で{user}の負荷を表示する必要があります。
リンツウィンド

回答:


11

プロセス会計が必要なようです。

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

Ubuntuでは、プロセスアカウンティングツールはパッケージに含まれていacctます acctをインストールする

ユーザーごとのレポートを取得するには、次を実行します

sa -m

残念ながら、「sa」は実行時間の長いプロセスをカウントしないため、これは機能しません。私が必要とする(私が思う)のは、プロセスの開始と終了を検出し、プロセスが終了したときと実行中のCPU時間を記録する方法です。
ステファノパラッツォ

@StefanoPalazzoこれが最高だと思う からプロセスを実行する時間でそれを増やします/proc/[pid]/stat
アーンドリューク

結局のところ、ほとんどすべてのプロセスsa(.ps.gz)によって適切に説明れるようです。そして、最終的にそれらのプロセスの正確な値を得る前に、これらの長時間実行プロセスを「推定」する良い方法もあります。結局、私たちはそれを使用します、そして私はあなたの答えへの報奨金を授与することができてうれしいです。たくさんありがとう!
ステファノパラッツォ

3

これにより、ユーザー名と合計CPU時間を示す各ユーザーの行が表示されます。

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

より明白な答えの1つは、現在あなたが現在していることを単に拡張することです。

bashスクリプトとmysqlを使用してユーザーのCPU時間を追跡するためのこのモニタープロセスに出会いましたが、それはあなたが話していたよりもはるかに長い時間枠にまたがっていました。

うまくいけば、これがあなたが向かう方向についてのより多くのアイデアをあなたに与えることができるでしょう。

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


0

これは、数日間実行されていたプロセスも処理します。数週間/月/年拡張する方法がわからない

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.