Telegraf procstatプラグインによる実践的プロセス監視:リソース消費の継続的追跡

プロセスごとのCPU・メモリ・I/O使用量を把握することは、システムのパフォーマンストラブルを未然に防ぐ上で欠かせません。Telegrafのprocstat入力プラグインは、toppsといった単発のツールでは捉えにくい、長期的な傾向や異常パターンを継続的に収集できる強力な仕組みを提供します。ここでは、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_pidchild_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でpatternsupervisor_unitsを利用する際は、pid_finderpgrepに明示的に設定する必要があります。

[[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使用率のヒートマップ、メモリ消費の推移、プロセス状態の分布などを簡単に確認できます。

タグ: Telegraf procstat プロセス監視 InfluxDB grafana

8月14日 18:28 投稿