このエントリは2021/06/10現在の情報に基づいています。将来の機能追加や変更に伴い、記載内容との乖離が発生する可能性があります。
先日以下のエントリを書いた。
Azure Monitor の パフォーマンスカウンターで得られるUsed Memory MBytesの値とfreeコマンドで得られるusedの値が異なる
https://logico-jp.io/2021/06/01/used-memory-mbytes-from-performance-counter-is-not-equal-to-used-by-free-command/
問い合わせ主に回答したところ、関連する以下の質問をもらった。
以下の数値算出方法は?
メモリー使用率(% Used Memory)
ディスク使用率(% Used Space)
ディスク使用量(Free Megabytes)
CPU使用率(% Processor Time)
どうやって収集しているのか?
エージェントはPAL(Platform Abstraction Layer)というコンポーネントを使って、ノードの種々のメトリックを収集、算出してAzure Monitorに送っている。PALのコードはGitHubに公開されている。
GitHub – microsoft/pal: Platform Abstraction Layer (both SCXCoreLib and SCXSystemLib)
https://github.com/microsoft/pal
メモリーやCPU、ディスクの情報はSCXSystemLibで集計していて、算出ロジックは*instance.cppというソースコードに記載されている。以下では算出方法を見ていく。
メモリー
コードは scxsystemlib/memory/memoryinstance.cpp を参照。コードを見ると、/proc/meminfo
と/proc/vmstat
をデータソースとして使っていることがわかる。
メモリー使用量(Used Memory MBytes)
前回のエントリの通り、以下の式で計算できる。Linuxの場合、この行に記載がある。
Used Memory MBytes = MemTotal - MemAvailable
メモリー使用率(% Used Memory)
以下の式で計算できる。
% Used Memory = (MemTotal - MemAvailable) / MemTotal * 100
ディスク
コードのうち、instanceを含むファイルは5つあるが、パフォーマンスカウンターでは下図の通り論理ディスクの情報を収集しているので、scxsystemlib/disk/staticlogicaldiskinstance.cpp を参照。

ディスクの空き(Free Megabytes)
PALでstatvfs()
を呼び出し、その結果から f_bfree * f_frsize
(基本的なファイル・システムのブロック・サイズ×解放ブロックの合計数)で計算していることがわかる。
m_availableSpace = f_bfree * f_frsize
ディスク使用率(% Used Space)
df -m
で確認できるUse %と同じだが、計算式は以下の通り。
% Used Space = (m_sizeInBytes - m_availableSpace) / m_sizeInBytes * 100
CPU
コードは scxsystemlib/cpu/cpuinstance.cpp を参照。
CPU使用率(% Processor Time)
Tick数のデルタ値を使って算出していることがこの行で確認できる。これによると、計算式は以下のようである。
m_processorTime = (user_delta_tics + nice_delta_tics + system_delta_tics + irq_delta_tics + softirq_delta_tics) /
total_delta_tics * 100
値としては、mpstat
で確認できる値から算出したものに近い(近いと書いているのは、mpstat
の出力情報は丸められており、完全に一致するわけではないから)。