Linux
Linux では、この情報は /proc ファイル システムで利用できます。各 Linux ディストリビューションは、少なくとも 1 つの重要なファイルをカスタマイズしているように見えるため、私は使用されるテキスト ファイル形式の大ファンではありません。「ps」のソースをざっと見てみると、混乱が明らかになります。
しかし、あなたが探している情報を見つける場所はここにあります:
/proc/meminfoには、求めるシステム全体の情報の大部分が含まれています。ここでは、私のシステムのように見えます。MemTotal、MemFree、SwapTotal、およびSwapFreeに興味があると思います。
Anderson cxc # more /proc/meminfo
MemTotal: 4083948 kB
MemFree: 2198520 kB
Buffers: 82080 kB
Cached: 1141460 kB
SwapCached: 0 kB
Active: 1137960 kB
Inactive: 608588 kB
HighTotal: 3276672 kB
HighFree: 1607744 kB
LowTotal: 807276 kB
LowFree: 590776 kB
SwapTotal: 2096440 kB
SwapFree: 2096440 kB
Dirty: 32 kB
Writeback: 0 kB
AnonPages: 523252 kB
Mapped: 93560 kB
Slab: 52880 kB
SReclaimable: 24652 kB
SUnreclaim: 28228 kB
PageTables: 2284 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
CommitLimit: 4138412 kB
Committed_AS: 1845072 kB
VmallocTotal: 118776 kB
VmallocUsed: 3964 kB
VmallocChunk: 112860 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
Hugepagesize: 2048 kB
CPU 使用率については、少し作業を行う必要があります。Linux では、システムの起動以降の全体的な CPU 使用率が利用可能になります。これはおそらくあなたが興味を持っているものではありません。最後の 1 秒間または 10 秒間の CPU 使用率を知りたい場合は、情報を照会して自分で計算する必要があります。
情報は/proc/statにあります。これはhttp://www.linuxhowtos.org/System/procstat.htmにかなり詳しく文書化されています。私の4コアボックスでは次のようになります。
Anderson cxc # more /proc/stat
cpu 2329889 0 2364567 1063530460 9034 9463 96111 0
cpu0 572526 0 636532 265864398 2928 1621 6899 0
cpu1 590441 0 531079 265949732 4763 351 8522 0
cpu2 562983 0 645163 265796890 682 7490 71650 0
cpu3 603938 0 551790 265919440 660 0 9040 0
intr 37124247
ctxt 50795173133
btime 1218807985
processes 116889
procs_running 1
procs_blocked 0
まず、システムで使用できる CPU (またはプロセッサ、または処理コア) の数を決定する必要があります。これを行うには、「cpuN」エントリの数を数えます。ここで、N は 0 から始まり、増分します。cpuN 行の組み合わせである「cpu」行はカウントしないでください。私の例では、cpu0 から cpu3 まで、合計 4 つのプロセッサが表示されます。これからは、cpu0..cpu3 を無視して、「cpu」行だけに注目してください。
次に、これらの行の 4 番目の数値はアイドル時間の測定値であることを知っておく必要があります。したがって、「cpu」行の 4 番目の数値は、起動時以降のすべてのプロセッサの合計アイドル時間です。この時間は Linux の「jiffies」で測定され、1/100 秒です。
しかし、アイドル時間の合計は気にしません。最後の 1 秒など、特定の期間のアイドル時間を気にします。それを計算してください。このファイルを 1 秒間隔で 2 回読み取る必要があります。次に、行の 4 番目の値の diff を実行できます。たとえば、サンプルを取得して取得した場合:
cpu 2330047 0 2365006 1063853632 9035 9463 96114 0
次に、1 秒後に次のサンプルを取得します。
cpu 2330047 0 2365007 1063854028 9035 9463 96114 0
2 つの数値を引くと、差分が 396 になります。これは、CPU が最後の 1.00 秒のうち 3.96 秒アイドル状態だったことを意味します。もちろん、秘訣は、プロセッサの数で割る必要があることです。3.96 / 4 = 0.99、アイドル率があります。99% アイドル、1% ビジー。
私のコードでは、360 エントリのリング バッファがあり、このファイルを毎秒読み取ります。これにより、1 秒、10 秒などから 1 時間までの CPU 使用率をすばやく計算できます。
プロセス固有の情報については、/proc/pidを調べる必要があります。pid を気にしない場合は、/proc/self を調べることができます。
プロセスが使用する CPU は/proc/self/statで確認できます。これは、1 行で構成される奇妙に見えるファイルです。例えば:
19340 (whatever) S 19115 19115 3084 34816 19115 4202752 118200 607 0 0 770 384 2
7 20 0 77 0 266764385 692477952 105074 4294967295 134512640 146462952 321468364
8 3214683328 4294960144 0 2147221247 268439552 1276 4294967295 0 0 17 0 0 0 0
ここで重要なデータは、13 番目と 14 番目のトークン (ここでは 0 と 770) です。13 番目のトークンはプロセスがユーザー モードで実行した jiffy の数であり、14 番目はプロセスがカーネル モードで実行した jiffy の数です。この 2 つを合計すると、合計 CPU 使用率が得られます。
繰り返しになりますが、プロセスの CPU 使用率を経時的に判断するには、このファイルを定期的にサンプリングし、差分を計算する必要があります。
編集: プロセスの CPU 使用率を計算するときは、1) プロセス内のスレッドの数、および 2) システム内のプロセッサの数を考慮する必要があることに注意してください。たとえば、シングルスレッド プロセスが CPU の 25% しか使用していない場合、それは良いことも悪いこともあります。シングル プロセッサ システムでは良好ですが、4 プロセッサ システムでは不十分です。これは、プロセスが常に実行されており、利用可能な CPU サイクルの 100% を使用していることを意味します。
プロセス固有のメモリ情報については、次のような /proc/self/status を確認する必要があります。
Name: whatever
State: S (sleeping)
Tgid: 19340
Pid: 19340
PPid: 19115
TracerPid: 0
Uid: 0 0 0 0
Gid: 0 0 0 0
FDSize: 256
Groups: 0 1 2 3 4 6 10 11 20 26 27
VmPeak: 676252 kB
VmSize: 651352 kB
VmLck: 0 kB
VmHWM: 420300 kB
VmRSS: 420296 kB
VmData: 581028 kB
VmStk: 112 kB
VmExe: 11672 kB
VmLib: 76608 kB
VmPTE: 1244 kB
Threads: 77
SigQ: 0/36864
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: fffffffe7ffbfeff
SigIgn: 0000000010001000
SigCgt: 20000001800004fc
CapInh: 0000000000000000
CapPrm: 00000000ffffffff
CapEff: 00000000fffffeff
Cpus_allowed: 0f
Mems_allowed: 1
voluntary_ctxt_switches: 6518
nonvoluntary_ctxt_switches: 6598
「Vm」で始まるエントリは興味深いものです。
- VmPeakは、プロセスが使用する仮想メモリの最大容量 (kB (1024 バイト)) です。
- VmSizeは、プロセスが現在使用している仮想メモリ空間 (kB) です。私の例では、かなり大きく、651,352 kB、つまり約 636 メガバイトです。
- VmRssは、プロセスのアドレス空間にマップされたメモリの量、またはその常駐セット サイズです。これはかなり小さいです (420,296 kB、または約 410 メガバイト)。違い: 私のプログラムは mmap() を介して 636 MB をマップしましたが、そのうちの 410 MB しかアクセスしていないため、410 MB のページしか割り当てられていません。
よくわからない唯一の項目は、現在プロセスで使用されている Swapspace です。これが利用可能かどうかはわかりません。