【10分で確認】インフラ起因のシステム障害で焦らないための監視系コマンド集

# はじめに

ベンチャー企業や立ち上がって間もない開発組織の場合、事業の成長スピードに対して、インフラ/SREエンジニアへのリソース不足が発生します。

スピード重視の結果、監視設計が不十分なままプロダクトがリリースされることも少なくないため、インフラに強いベテランの方のみが障害対応に当たらざるを得ず、周囲はただ応援するといった形もあるのではないでしょうか。

いざというとき、「アプリケーション起因じゃなければ、私は何もわからない...」とならないために、非インフラ/SREエンジニアでも最低限覚えておきたい障害発生時に役立つ監視系のコマンドをまとめてみようと思います。

本記事で想定している読者は以下の通りです。

:::note info
- インフラ関連の障害時に、問題の切り分けを行うためのコマンドが知りたい人
- 監視系コマンドを実行できる環境構築をサクッと作って動かしながら学びたい人
- 非インフラ/SREエンジニアでインフラ起因の障害発生時にただ立ち尽くしている人
:::

:::note warn
私自身、非インフラ/SREエンジニアであるため内容に不備があれば編集リクエストを頂けると嬉しいです。
:::

# 環境構築

本リポジトリに今回の記事で取り扱うコマンドをインストールしたdocker環境を配置しております。
必要であればクローンして動かしてみてください。

https://github.com/WebEngrChild/system-trouble-commands

# 1. ネットワーク疎通

## ping

指定したホストへICMPパケットを送信する。目的のホストが正しく応答しているか、レイテンシは問題ないかを確認。

## ip

IPアドレス、Macアドレス等が表示される。ネットワークインターフェース関連がの各種設定が正しいか確認。

| オプション | 内容 |
|:-----------|:-----------|
|ip|IPアドレス、Macアドレス等が表示される。ネットワークインターフェース関連がの各種設定が正しいか確認。|
|addr|すべてのアドレスの情報を表示。|
|link|全てのインターフェイスの情報を管理および表示。|
|route|ルーテイングテーブルを表示。|

## traceroute

ネットワーク上のパケットの経路を追跡して、目的地までの経路・経由するルーターのIPアドレスやRTTを表示。パケットがどこで失われたかを確認。

| オプション | 内容 |
|:-----------|:-----------|
|-n|ホスト名を非表示。|
|-I|経路の調査に ICMP ECHO を使用。|
|-p [宛先ポート番号]|宛先のポート番号を指定。|

## hostname

現在のホスト名を表示。ホスト名が正しく設定されているかどうかを確認できる。

| オプション | 内容 |
|:-----------|:-----------|
|-a|ホストの別名（alias）があれば表示。|
|-d|FQDN（Fully Qualified Domain Name）を表示。|
|-s|短い形式のホスト名（最初のドットまでの名前）を表示。| 

## nslookup/dig

DNSサーバーに問い合わせて、指定したホスト名に対応するIPアドレスを表示。DNSサーバーが正しく応答しているかどうかを確認。

__nslookup__
| モード | オプション | 内容 |
|:-----------|:-----------|:-----------|
|type指定|-type=ns google.co.jp|ネームサーバーとIPアドレスを表示。|
|対話モード|server| 参照するDNSサーバーを指定。|
||"ホスト名"|指定したホストの情報を表示。|
||exit|対話モードを終了。|
	 
__dig__
| オプション | 内容 |
|:-----------|:-----------|
|-x 8.8.8.8|逆引き(PTR)|
|google.com @dns.google.|ネームサーバーを指定|

## ss

通信相手とのTCP通信の状態を表示。現在のネットワーク接続状態やリスニング中のポート、アドレス、コネクション数を確認。

| オプション | 内容 |
|:-----------|:-----------|
|-a|接続待ち状態（LISTEN）のソケットと接続待ち状態ではないソケットの両方を表示。|
|-p|ソケットを使用しているプロセスも表示。|
|-nlptu|詳細な出力でリッスン状態のTCP/UDPポートすべてを表示。|

## nc（Netcat）
ncは、ネットワーク接続を確立したり、リッスンしたり、データを送受信したりするためのツールです。スクリプト内での利用やデバッグ、セキュリティテストにおいて役立ちます。

|オプション|内容|
|:-----------|:-----------|
|-l|リッスンモードで起動し、インバウンド接続を待ち受ける。|
|-p <port>|ローカルポート番号を指定。通常はリッスンモードで使用される。|
|-u|UDPモードで起動。デフォルトはTCP。|
|-v|冗長モードで起動し、より多くの情報を出力する。|
|-n|名前解決を行わずに、IPアドレスのみを使用する。|
|-z|ポートスキャンモードで起動し、データ送信を行わない。接続のみをテストする。|

## nmap（Network Mapper）
nmapは、ネットワーク探査およびセキュリティ監査を行うためのツールです。ホストの発見、オープンしているポートのスキャン、サービスやオペレーティングシステムの検出など、広範囲なネットワークテストに利用されます。セキュリティ評価、ネットワークインベントリ、監視サービスのアップグレード計画などに重宝します。

|オプション|内容|
|:-----------|:-----------|
|-sS|SYNスキャンを行う。最も一般的なスキャン方法で、オープンなポートを効率的に検出できる。|
|-sU|UDPスキャンを行う。UDPポートの状態を調査する。|
|-p <port range>|特定のポートまたはポート範囲をスキャンする。例：-p 1-100または-p 80,443|
|-O|オペレーティングシステムの検出を行う。|
|-A|サービスバージョン検出、オペレーティングシステム検出、traceroute、スクリプトスキャンを行う。|
|-v|冗長モードでより詳細な情報を出力する。|
|--script=<script category>|指定したカテゴリのNmap Scripting Engine（NSE）スクリプトを使用してスキャンを行う。|
|--open|オープンなポートのみを表示する。|

:::note warn

ifconfig, arp, route, netstatは非推奨のため本記事では掲載しません
:::

# 2. サーバーリソース確認

## tail

ファイルの最後の数行を表示。

| オプション | 内容 |
|:-----------|:-----------|
|-f|/var/log/syslog システムログの末尾をリアルタイムに表示。ログの内容を確認。|

上記で環境構築を行なっている方は以下を試してから実行ください。

```shell:bash
make delete-conf　# エラーを発生させるため設定ファイルを削除
make test　# 設定ファイルのシンタックスチェックでエラーを発生させる
tail -f /var/log/syslog
```

## lshw

ハードウェアの情報を表示。CPU、メモリ、ハードディスク、ネットワークインターフェースなどに問題がないか確認。

| オプション | 内容 |
|:-----------|:-----------|
|-short|ハードウェア情報を短縮出力する。|

## df

ディスクの空き容量や使用率を表示。

| オプション | 内容 |
|:-----------|:-----------|
|-T|各ファイルシステムの種類を合わせて表示。|
|-H|読みやすい単位で表示する。ただし、1024単位ではなく、1000単位の値を使用。|

## top/htop

実行中のプロセスとそのリソース使用状況を表示。CPUやメモリの使用状況から高負荷のプロセスを確認。

| オプション | 内容 |
|:-----------|:-----------|
|-d 間隔|更新する間隔を「ss.tt秒」で指定。|
|-p プロセスID|監視するプロセスIDを指定。|

## ps

プロセスの状態やプロセスを起動したユーザーなどの情報を表示。CPU使用率、メモリ使用率、プロセスのステータス、起動時間を確認。

| オプション | 内容 |
|:-----------|:-----------|
|-e|全てのプロセスを表示。|
|-r|実行中のプロセスだけを表示。|

## lsof

プロセスがどのファイルを開いているか、またはどのネットワークポートに接続しているかを確認。

| オプション | 内容 |
|:-----------|:-----------|
|-p プロセスID|表示対象にしたいプロセスIDを指定。|

## vmstat/dstat

CPU使用率、ディスクI/O、ネットワークI/O、メモリ使用量、プロセスの状態やスレッド数などを表示。

| オプション | 内容 |
|:-----------|:-----------|
|-a|アクティブ/非アクティブなメモリの量を表示。|
|-d|ディスクの統計情報を表示。|

## iostat

CPUやディスクなどのI/O（入出力）デバイスに関する情報を表示。ディスクの読み書き速度、ネットワークI/Oなど、I/O性能のボトルネックを確認。

| オプション | 内容 |
|:-----------|:-----------|
|-c|CPU使用率のみを出力。|
|-h|読みやすい表示形式で出力する（デバイス名の行と統計行の情報の2行に分かれる）。|

## mpstat
mpstatは、マルチプロセッサシステム上で各CPU（または全体）の性能統計を表示するために使用されるツールです。CPUの使用状況、システムの平均負荷、CPUごとのタスク実行状況など、CPUパフォーマンスの詳細な分析に役立ちます。システムのパフォーマンス監視や、パフォーマンスのボトルネックがCPUに関連しているかどうかを判断する際に有用です。

| オプション | 内容 |
|:-----------|:-----------|
|-P ALL|全てのCPUの統計情報を表示。指定しない場合は、システム全体の平均値が表示される。|
|-u|CPUの使用率に関する詳細な情報を表示。デフォルトで有効。|
|-A|全ての利用可能な情報（CPUの使用率、割り込み統計など）を表示。|

## free

物理メモリとスワップメモリの使用量、空き容量を表示。

| オプション | 内容 |
|:-----------|:-----------|
|-h|読みやすい単位で表示。|
|-s 間隔|再出力の間隔を「ss.tt秒」で指定|

# 3. DB（MySQL)

## show processlist

実行中のプロセス一覧を確認できる

## mysqldumpslow

slow query logを分析してクエリの実行時間やロック状況を表示するツール。
クエリ実行時間やロック状況を表示。ボトルネックとなっているクエリを確認する。

※MySQLサーバーの設定を変更することで、slow query logを有効にする必要あり

MySQLのスロークエリ分析やチューニング方法に興味がある方は、以下の記事も確認してみてください！

https://qiita.com/WebEngrChild/items/035fdb2e7fb173c8e063

# 終わりに

最近ではAWSのCloud Watchを始め各種監視系ツールを導入することで、上記のようなコマンドを知らなくても最低限の監視は行えると思います。

一方で、ローカル環境構築の疎通確認や監視体制が整っていないような現場では、直接ssh接続等で本番サーバーにアクセスして問題の切り分けが必要になることもあるはずです。

上記のようなコマンドと出力される各種指標の意味を学ぶことで、ネットワーク/パフォーマンスの理解を深めることができるため非常に有意義です。

よろしかったら是非参考にしてみてください。