プロセスごとのCPU・メモリ・I/O使用量を把握することは、システムのパフォーマンストラブルを未然に防ぐ上で欠かせません。Telegrafのprocstat入力プラグインは、topやpsといった単発のツールでは捉えにくい、長期的な傾向や異常パターンを継続的に収集できる強力な仕組みを提供します。ここでは、Apache HTTP Serverを例に、すぐに使える設定例から高度なフィルタリング、主要メトリクスの解釈までを紹介します。
procstatプラグインの基本構成
procstatは、PIDファイル、実行ファイル名、systemdユニット、cgroupなど、複数の方法で監視対象プロセスを特定できます。最もシンプルなのは、PIDファイルを使った監視です。
[[inputs.procstat]]
# ApacheのメインプロセスをPIDファイル経由で監視
pid_file = "/run/httpd/httpd.pid"
# 収集するメトリクス種別
properties = ["cpu", "memory", "io"]
# プロセスIDをタグとして付与
tag_with = ["pid"]
PIDファイルが存在しない環境や、動的にPIDが変わるケースでは、実行可能ファイル名でフィルタリングする方法が便利です。さらに、特定のユーザだけに絞ることも可能です。
[[inputs.procstat]]
# 実行ファイル名ベースの監視
exe = "httpd"
# apacheユーザのプロセスのみ対象
user = "apache"
# メモリ関連指標を詳細に取得
properties = ["memory", "memory_usage", "major_faults"]
systemdとcgroupによる高度なフィルタリング
systemdが稼働するLinux環境では、サービス名を直接指定することで、関連する全プロセスを一括監視できます。ワイルドカードも利用可能です。
[[inputs.procstat]]
# httpdで始まるすべてのsystemdサービスを監視
systemd_unit = "httpd*.service"
# 子プロセスも含める
include_systemd_children = true
コンテナ環境では、cgroupのパスを指定する方法が確実です。たとえば、KubernetesのPod内のプロセスを追跡する場合には次のように記述します。
[[inputs.procstat]]
# 特定のcgroup配下のプロセスを監視
cgroup = "/system.slice/httpd.service"
主要メトリクスの読み解き方
procstatが出力する指標のうち、特にメモリリークの早期発見に役立つ3つを紹介します。
| メトリクス名 | 意味 | 注意すべき兆候 |
|---|---|---|
memory_rss | 実際に確保されている物理メモリ量 | 単調増加し、解放されない |
memory_usage | メモリ使用率(%) | 80%を超え、さらに上昇傾向 |
major_faults | メジャーページフォールトの回数 | 短期間に急増する |
memory_rssが増加する一方で、仮想メモリ(memory_vms)の伸びが緩やかな場合、メモリリークの可能性が疑われます。詳細なメモリマッピング情報が必要な場合は、mmapプロパティを追加します。ただし、システム負荷への影響に注意してください。
[[inputs.procstat]]
exe = "java"
properties = ["memory", "mmap"]
プロセスツリーの再帰監視
バッチ処理のように親プロセスが多数の子プロセスを生成するケースでは、再帰的な監視が有効です。次の例では、ETLスクリプトの2階層までの子プロセスを追跡します。
[[inputs.procstat.filter]]
name = "data_processing"
patterns = ["/opt/scripts/etl_job.py"]
recursion_depth = 2
子プロセスのメトリクスには、自動的にparent_pidとchild_levelタグが付与されるため、Grafana上でプロセスツリーを可視化できます。
クロスプラットフォームの注意点
Linux
ディスクI/Oやネットワーク接続などの高度なメトリクスを収集するには、Telegrafに適切な権限が必要です。CAP_DAC_READ_SEARCHケーパビリティを付与するか、procファイルシステムのパーミッションを調整します。
sudo setcap 'cap_dac_read_search=+ep' /usr/bin/telegraf
Windows
Windowsサービスを監視する場合は、win_serviceパラメータを使用します。以下はSQL Serverの例です。
[[inputs.procstat]]
win_service = "MSSQLSERVER"
macOS
macOSでpatternやsupervisor_unitsを利用する際は、pid_finderをpgrepに明示的に設定する必要があります。
[[inputs.procstat]]
pattern = "com.apple.WebKit.WebContent"
pid_finder = "pgrep"
実運用向けの設定テンプレート
以下は、複数のサービスを系統的に監視するための実用的な設定例です。フィルタを分割し、必要なメトリクスを厳選しています。
[[inputs.procstat]]
name_override = "service_monitor"
[[inputs.procstat.filter]]
name = "http_servers"
executables = ["/usr/sbin/httpd", "/usr/bin/node"]
users = ["apache", "appuser"]
recursion_depth = 1
[[inputs.procstat.filter]]
name = "database_engines"
patterns = ["mysqld", "postgres"]
users = ["mysql", "postgres"]
properties = ["cpu", "memory", "limits", "sockets"]
socket_protocols = ["tcp4", "tcp6", "udp4"]
tag_with = ["pid", "user", "cmdline"]
Grafanaによる可視化
収集したメトリクスは、Grafanaのコミュニティダッシュボードを使って即座に可視化できます。Telegraf向けに公開されているダッシュボード(ID: 928 や 14694)をインポートすれば、CPU使用率のヒートマップ、メモリ消費の推移、プロセス状態の分布などを簡単に確認できます。