システムが重いのにhtopコマンドでは原因が掴めないとき
Webサイトが突然5〜10秒ほど応答しなくなり、ユーザーから問い合わせが殺到しているのに、SSHでログインしてtopやhtopを叩くとCPU使用率がたったの5%だった……そんな経験はありませんか?何事もなかったかのように正常に見えるのが厄介な点です。CLIツールは画面を見ているまさにその瞬間のスナップショットしか切り取れません。一方で、PrometheusやZabbixなどの監視スタックは通常15〜30秒間隔でメトリクスを収集します。そのインターバルは長すぎるのです。ディスクI/Oの詰まりや突発的なループクエリは、エージェントがデータを収集する前に収束して消えてしまうことがよくあります。
筆者はこれまでNode.jsからLaravelまで多様なサービスを動かす20台以上のVPSを運用してきましたが、OSセットアップ直後に必ず行うのがNetdataの導入です。Netdataは1秒単位のきめ細かな粒度(per-second granularity)でメトリクスを記録してくれます。しかも、エージェント自体のCPU使用率はわずか1〜2%程度に収まる点が極めて優秀です。
アーキテクチャの本質:なぜNetdataは1秒のレイテンシを実現できるのか?
NetdataはLinux上で直接稼働する分散型のパフォーマンス監視デーモンです。生データを中央サーバーに送信して集約処理を行うのではなく、ノード自身がその場で分析を完結させます。
- 1秒ごとのデータ収集:Netdataは
/proc、/sys、およびeBPFプローブを通じてカーネルから直接データを読み取ります。コアエンジンは純粋なC言語で書かれており、バイナリ解析が極めて高速なため、OSへのオーバーヘッドはほぼ皆無です。 - インメモリ保存とdbengineによる圧縮:チャート描画を遅延なく行うため、直近のメトリクスはRAM上に保持されます。過去データは多層圧縮されてディスクへ書き出され、消費メモリはわずか数百MB程度にとどまります。
- サービスの自動検出(Zero-config):起動すると、NetdataはNginx、MySQL、Docker、Redisなどポートを開放しているプロセスを自動検出します。YAMLでエクスポーターの設定を一から書かなくても、対応するダッシュボードが自動生成されます。
- 組み込みのWebインターフェース:Grafanaなどを別途立ち上げてRAMを浪費する必要がなく、軽快に動作するダッシュボードがすぐに使えます。マウスホイールで1秒単位まで自在にズームイン可能です。
実践:UbuntuへのNetdata導入とセキュリティ設定
ステップ 1: システムのアップデート
まずはVPS上のパッケージリストを最新化します:
sudo apt update && sudo apt upgrade -y
sudo apt install -y curl wget apt-transport-https
ステップ 2: 公式キックスタートスクリプトによるインストール
Netdata公式のスクリプトを利用するのが最も手軽で確実な方法です。スクリプトがUbuntuのバージョン(20.04、22.04、24.04など)を自動認識し、APTリポジトリを登録して安定版(stable)をセットアップしてくれます:
wget -O /tmp/netdata-kickstart.sh https://get.netdata.cloud/kickstart.sh
sh /tmp/netdata-kickstart.sh --stable-channel --disable-telemetry
--disable-telemetryオプションを付けることで、提供元のクラウドへの匿名利用統計データの送信を無効化できます。プライバシーを重視する社内サーバーでは付けておくのが推奨されます。
処理が完了するまで1〜2分ほど待った後、サービスの状態を確認します:
sudo systemctl status netdata
緑色でactive (running)と表示されていれば、プロセスは正常に起動しています。
ステップ 3: ポート19999の外部アクセスを遮断
ここで多くの人が見落としがちな落とし穴があります。Netdataはデフォルトでポート19999を外部全体(0.0.0.0:19999)に開放しており、認証も不要です。そのため、IPアドレスをスキャンされただけで、プロセス一覧、RAM消費量、ネットワークトラフィックなどが第三者から丸見えになってしまいます。
Netdataがローカルホスト(localhost)のみをリッスンするように設定を変更しましょう:
sudo /etc/netdata/edit-config netdata.conf
[web]セクションを探し、bind toディレクティブを編集します:
[web]
bind to = 127.0.0.1
ファイルを保存し、プロセスを再起動します:
sudo systemctl restart netdata
ssコマンドでポートの待受状態を再確認します:
sudo ss -tulpn | grep 19999
# 期待される出力例: tcp LISTEN 0 4096 127.0.0.1:19999
リッスンIPが127.0.0.1になっていれば安全です。
ステップ 4: NginxリバースプロキシとHTTP基本認証の設定
個人のブラウザからダッシュボードへアクセスできるようにするため、パスワード認証を挟んだNginxのリバースプロキシを経由させます。
アクセス認証用のアカウントを作成します:
sudo apt install -y apache2-utils
sudo htpasswd -c /etc/nginx/.netdata_auth devops_admin
プロンプトが表示されたら、安全なパスワードを入力してください。
続いて、/etc/nginx/sites-available/netdata.confにバーチャルホスト設定ファイルを作成します:
upstream netdata_backend {
server 127.0.0.1:19999;
keepalive 64;
}
server {
listen 80;
server_name monitor.example.com;
auth_basic "Server Monitor - 認証が必要です";
auth_basic_user_file /etc/nginx/.netdata_auth;
location / {
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://netdata_backend;
proxy_http_version 1.1;
proxy_pass_request_headers on;
proxy_set_header Connection "keep-alive";
proxy_store off;
}
}
サイトを有効化し、Nginxの設定をリロードします:
sudo ln -s /etc/nginx/sites-available/netdata.conf /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
ブラウザを開き、設定したドメインまたはサーバーIPにアクセスします。認証ダイアログが表示されたら、設定したユーザー名とパスワードを入力してダッシュボードにログインします。
ステップ 5: 1GB〜2GB RAMのVPS向けメモリ最適化
MySQLやRedisを併用しているメモリ容量の少ないVPS(1GB〜2GB)では、Netdataに過剰なキャッシュを持たせるべきではありません。設定ファイルを再度開きます:
sudo /etc/netdata/edit-config netdata.conf
[db]セクションを探し、保存リソースの上限を調整します:
[db]
mode = dbengine
dbengine tier 0 disk space MB = 256
dbengine tier 0 retention days = 7
この設定により、1秒精度のメトリクス保持用ディスク容量が256MBに制限され、履歴は7日間に絞られます。先週発生したトラブルの追跡に十分なデータを残しつつ、エージェントのRAM消費量を100〜150MB程度に抑え込むことができます。
小規模サーバーに適した監視ツール選び
Prometheus、Alertmanager、Grafanaの構成は非常に魅力的ですが、その分リソースを消費します。各種エクスポーターやJava/Goデーモンだけでも数百MBのメモリを圧迫します。数十台規模のクラスタであればその構成が真価を発揮しますが、単体サーバーの運用においてはNetdataの方がはるかに合理的です。2分で導入でき、メトリクスを自動検出し、ホストサーバーに負荷をかけることなく一瞬のマイクロスパイクまで確実に捉えてくれます。

