FreeBSDのsystatとcollectdでリソース情報を取得
生成AIにAPI経由でサーバーのパフォーマンス解析レポートを定期実行させようとしているときの覚書。
環境: FreeBSD 14.3-RELEASE-p2
1. systatとは?
systatは、FreeBSDのパフォーマンス統計情報を対話的に表示するコマンドラインツール。
topコマンド: プロセス視点「どのプロセスがCPUやメモリを消費しているか」
systatコマンド: システム視点「システム全体のどのコンポーネント(I/O, メモリ, ネットワーク等)がボトルネックになっているか」
基本的な使い方
5秒間隔更新で起動。
# systat 5
最初からvmstatビューを1秒間隔で表示。
# systat -vmstat 1
起動中に「:help」を入力するとビュー名が表示される。
「:(ビュー名)」で各ビューに切り替わる。
Ctrl-Cで終了。
ビューの一覧
- vmstat: システム全体のCPU、メモリ、ページング、プロセス状態をまとめたビュー。
- pigs: CPUを最も消費しているプロセスを降順で表示する、いわゆる「CPUの豚(hogs)」。
- iostat: ディスクデバイスごとのI/O統計情報。ディスク性能のボトルネック調査に必須。
- ifstat: ネットワークインターフェースごとの通信量をリアルタイムで表示。
- netstat: 現在アクティブなネットワークコネクションの状態を表示。netstat -anの対話版。
- ip: IPプロトコルレベルでの統計情報。パケットの送受信、破棄、フラグメンテーションなど。
- tcp: TCPプロトコルレベルでの詳細な統計情報。
- icmp: ICMPプロトコル(ping, traceroute)レベルでの統計情報。
- swap: スワップ領域の使用状況をパーティションごとに表示。
- zarc: ZFSのキャッシュ(ARC, L2ARC)の統計情報。
vmstatの見方
- Mem usage: Phy: 物理メモリ全体の使用率。
- Mem usage: Kmem: カーネルが使用しているメモリの割合。
- SWAP PAGER: in: スワップ領域からメモリにデータが読み戻された回数(スワップイン)
- SWAP PAGER: out: メモリからスワップ領域にデータが書き出された回数(スワップアウト)。
物理メモリが不足している明確な兆候。 - Proc: r (runnable): 実行待ちのプロセス数。
CPUが空くのを待っている行列の長さ。
CPUコア数よりも常にこの値が大きい場合CPUがボトルネック。 - Proc: d (disk wait): ディスクI/Oの完了を待っているプロセス数。
この値が高い場合、ディスクI/Oがボトルネック。 - Proc: Sys: OS(カーネル)の処理。
- Proc: Intr: ハードウェア割り込み処理。
- Proc: User: アプリケーションなど、ユーザー空間の処理。
- Proc: Idle: CPUが何もしていない時間(アイドル状態)。
- Disks: tps: 1秒あたりのI/Oリクエスト数。
- Disks: 1秒あたりのデータ転送量。
- Disks: %busy: そのディスクがI/O処理でビジーだった時間の割合。
右側は詳細なカーネル内部の統計情報。CPUのコア数も分かる。
2. collectdとは?
collectdは、システムやアプリケーションのパフォーマンス状況を定期的かつ継続的に収集するための、オープンソースのサービス。
- systat: 「今、この瞬間のシステムの状態を対話的に診断するツール」
- collectd: 「過去から現在に至るまでのシステムのパフォーマンスデータを時系列で記録・蓄積するツール」
collectdの特徴
- 軽量・高性能: C言語で書かれており、リソース消費が非常に少ないため、本番環境のサーバーに常駐させてもパフォーマンスへの影響は僅か。
- プラグインベース: collectdの核となるアーキテクチャ。機能はすべてプラグインとして提供。
- 高い拡張性: 100種類以上の公式プラグインに加え、独自のスクリプトを実行してカスタムメトリクスを収集することも可能。
- 優れたエコシステム: 多くのモダンな監視・可視化ツール(Grafana, InfluxDBなど)との連携が容易で、収集したデータを高度に分析・可視化できる。
3. collectdのインストール
pkg経由でインストール。
# pkg search collectd
# pkg install collectd5
設定を確認。
# less /usr/local/etc/collectd.conf
ほとんどコメントで訳が分からない。
Gemini先生が生成した設定ファイルに置き換える。
# mv /usr/local/etc/collectd.conf /usr/local/etc/collectd.conf.default
# vim /usr/local/etc/collectd.conf
# === 1. グローバル設定 ===# このセクションでは、collectd全体の基本的な動作を定義します。# Hostname: 収集したデータに付与されるホスト名。監視ツール上でどのサーバーのデータかを識別するために使います。# デフォルトではOSのホスト名が使われますが、ここで明示的に指定することも可能です。# Hostname "my-freebsd-server"# BaseDir: collectdが使用する作業ディレクトリ。BaseDir "/var/db/collectd"# PIDFile: collectdプロセスのプロセスIDを保存するファイル。PIDFile "/var/run/collectd.pid"# PluginDir: 各プラグインの共有ライブラリ(.soファイル)が格納されているディレクトリ。PluginDir "/usr/local/lib/collectd"# TypesDB: 収集するメトリクスの型(COUNTER, GAUGEなど)が定義されているファイル。TypesDB "/usr/local/share/collectd/types.db"# Interval: メトリクスを収集する間隔(秒単位)。# 短くするほどデータの粒度は細かくなりますが、サーバー負荷とストレージ消費量は増えます。# 一般的には10秒や60秒がよく使われます。Interval 10# === 2. Readプラグイン (何を収集するか) ===# このセクションで、収集したいメトリクスの種類に応じたプラグインを有効化(LoadPlugin)します。# [syslog] プラグイン: collectd自体のログをシステムのsyslogに出力します。LoadPlugin syslog<Plugin syslog>LogLevel info</Plugin># [cpu] プラグイン: CPUの使用率を状態別(user, system, idle, waitなど)に収集します。LoadPlugin cpu# [df] プラグイン: ディスクの空き容量と使用量をファイルシステムごとに収集します。LoadPlugin df# [interface] プラグイン: ネットワークインターフェースごとのトラフィック量(送受信バイト/パケット数)を収集します。LoadPlugin interface# [load] プラグイン: システムのロードアベレージ(1分, 5分, 15分の平均負荷)を収集します。LoadPlugin load# [memory] プラグイン: 物理メモリの使用状況(使用中, 空き, キャッシュなど)を収集します。LoadPlugin memory# --- 各Readプラグインの詳細設定 ---# いくつかのプラグインは、より具体的に何を監視するかを設定できます。# [df] プラグインの設定<Plugin df># MountPoint: 監視対象とするマウントポイントを指定します。MountPoint "/mnt"# FSType: 監視対象とするファイルシステムのタイプを指定します。(例: "ufs", "zfs")FSType "zfs"# IgnoreSelected: falseの場合、上記で指定した対象「だけ」を監視します。# (trueにすると、指定したものを「除外」して監視します)IgnoreSelected false</Plugin># [interface] プラグインの設定<Plugin "interface"># Interface: 監視対象とするネットワークインターフェース名を指定します。# 物理NIC(vtnet0, em0 등)やループバック(lo0)などを指定できます。Interface "vtnet0"</Plugin># === 3. Writeプラグイン (どこに書き込むか) ===# このセクションで、収集したデータをどこに保存・転送するかを指定します。# [rrdtool] プラグイン: 収集したデータをRRD(Round Robin Database)形式のファイルとしてローカルに保存します。# RRDは時系列データを効率的に保存するためのデータベースで、古いデータは自動的に丸められて容量を節約します。# Grafanaなど多くのツールがこの形式のデータを可視化できます。LoadPlugin rrdtool# [rrdtool] プラグインの設定<Plugin rrdtool># DataDir: RRDファイルを保存するディレクトリを指定します。# このディレクトリ配下に `ホスト名/プラグイン名/メトリクス名.rrd` のような階層でファイルが作成されます。DataDir "/var/db/collectd/rrd"</Plugin>
テストして起動ファイルに書き込んでサービス起動。
# collectd -t
# sysrc collectd_enable="YES"
# service collectd start
エラー。
システムログを確認。
# less /var/log/messages
Aug 25 14:37:14 hoge01 collectd[19252]: plugin_load: Could not find plugin "rrdtool" in /usr/local/lib/collectdAug 25 14:37:14 hoge01 collectd[19252]: There is configuration for the `rrdtool' plugin, but the plugin isn't loaded. Please check your configuration.Aug 25 14:37:14 hoge01 root[19257]: /usr/local/etc/rc.d/collectd: WARNING: failed to start collectd
rrdtoolをインストール。
# pkg search rrdtool
# pkg install rrdtool
テストしてサービス起動。
# collectd -t
# service collectd start
同じエラー。
rrdtoolプラグインをインストールするには、portsからビルドする必要がある。
まずはrrdtoolをアンインストール。
# pkg install rrdtool
不要な依存関係を確認(ドライラン)して削除する。
# pkg autoremove -n
# pkg autoremove
csvプラグイン
Gemini先生がcsvで保存するのをお勧めするので従う。
# less /usr/local/etc/collectd.conf
# [csv] プラグインの設定<Plugin csv># DataDir: CSVファイルを保存するディレクトリを指定します。DataDir "/var/db/collectd/csv"# StoreRates: trueに設定すると、カウンタ型のデータを「1秒あたりのレート」に変換して保存します。# (例: バイト数 -> バイト/秒)。通常はtrueが便利です。StoreRates true</Plugin>
テストしてサービス起動。
# collectd -t
# service collectd start
# service collectd status
無事起動。
データの中身を確認。
# less /var/db/collectd/csv/hoge01.jp/cpu-0/cpu-idle-2025-08-25
collectdのデータ保存先としてGoogle Cloudを思い付いて、Gemini先生と会話しているうちにOpenTelemetryという技術を知った。
4. collectdからOpenTelemetry Collectorへ
OpenTelemetry(略称: OTel)は、アプリケーションやインフラからテレメトリデータを生成・収集・エクスポートするための、標準化されたオープンソースのフレームワーク。
テレ(Tele:遠隔)メトリ(metry:測定) = 離れた場所にある機器の健康診断データ
collectdをアンインストール
サービスを停止して、自動起動を無効にする。
# service collectd stop
# sysrc -x collectd_enable
アンインストール実行。
# pkg remove collectd5
不要な依存関係を確認(ドライラン)して削除する。
# pkg autoremove -n
# pkg autoremove
設定ファイルも削除する。
# rm /usr/local/etc/collectd.conf*
OpenTelemetryを次回詳しく調べる。