パフォーマンス低下のトラブルシューティング:「netstat」と「ss」の効果的な使用法
Linuxシステムでアプリケーションのパフォーマンス低下や予期せぬ接続動作を診断する場合、ネットワークスタックは最初に確認すべき場所であることがよくあります。確立済み、リッスン中、一時的な接続を理解することは、ボトルネック、不正なプロセス、またはセキュリティの異常を特定するために不可欠です。従来、管理者は主にnetstatユーティリティに頼ってきました。しかし、最新のLinuxディストリビューションでは、より高速で多機能なss(ソケット統計)ユーティリティが推奨されています。
このガイドでは、netstatとssの包括的な比較を提供し、両方のツールを効果的に使用してTCPおよびUDPソケットを監視し、接続状態を分析し、システム上のパフォーマンスの問題を特定する方法を詳述します。
ネットワークソケットを監視する理由
ネットワークの遅延や動作が鈍い場合、CPUやメモリの枯渇よりも接続の問題が原因であることがよくあります。ソケットを監視することで、管理者は以下のような重要な疑問に答えることができます。
- どのポートが接続をリッスンしていますか?
SYN_RECVまたはTIME_WAIT状態でスタックしている接続が多すぎませんか?- どのプロセス(PID)が特定のポートを使用していますか?
- 予期せぬアウトバウンド接続が発生していませんか?
ソケット統計を調べることで、ネットワーク構成の問題を迅速に除外したり、接続処理に関連するリソース競合を特定したりできます。
従来のツール:「netstat」
netstatは何十年にもわたり、ネットワーク接続、ルーティングテーブル、インターフェイス統計、およびマスカレード接続を表示するための標準的なユーティリティでした。多くの最新システムではssへの移行が非推奨となっていますが、依然として広く利用可能であり、長年の管理者に馴染みのあるツールです。
一般的なnetstatの例
netstatで最も一般的に使用されるフラグは、包括的な概要を提供します。
| フラグ | 説明 |
|---|---|
-a |
すべてのソケット(リッスン中および非リッスン中)を表示 |
-n |
ホスト名やサービス名の解決を試みる代わりに、数値アドレスを表示(出力を高速化) |
-t |
TCP接続を表示 |
-u |
UDP接続を表示 |
-l |
リッスン中のソケットのみを表示 |
-p |
ソケットに関連付けられたPID/プログラム名を表示(root権限が必要) |
例:すべての有効なTCP接続を数値で表示
sudo netstat -ant
例:ポート80(HTTP)でリッスンしているものを検索
sudo netstat -antlp | grep ':80'
接続状態の理解(netstat)
netstatの出力には多くの場合State列が含まれます。注意すべき主要な状態は次のとおりです。
- LISTEN: 着信接続を待機中。
- ESTABLISHED: アクティブで開いている接続。
- TIME_WAIT: 閉じられた後、遅延したパケットが処理されることを保証するために短時間待機しているソケット。
- SYN_RECV: 3ウェイハンドシェイクの最終確認を待機中(過剰な場合はSYNフラッド攻撃を示す可能性あり)。
netstatに関する警告:netstatは/proc/net/*ファイルを解析することに依存していることが多く、特にアクティブな接続数が非常に多いシステム(数千)では遅くなる可能性があります。これがssが開発された主な理由です。
最新の代替ツール:「ss」(ソケット統計)
ssユーティリティは、ファイルシステム検索という遅いプロセスを回避し、Netlinkソケットを使用してカーネルスペースから直接ソケット情報を取得するため、netstatよりも大幅に高速です。
一般的なssの例
ssのフラグ構造はnetstatと非常によく似ており、移行が容易です。
| フラグ | 説明 |
|---|---|
-a |
すべてのソケットを表示 |
-n |
数値アドレスを表示 |
-t |
TCPソケットを表示 |
-u |
UDPソケットを表示 |
-l |
リッスン中のソケットを表示 |
-p |
プロセス情報(PID/プログラム)を表示 |
例:すべての有効なTCP接続を数値で表示(netstat -antと同等)
ss -ant
例:ポート443(HTTPS)でリッスンしているものを検索
sudo ss -antlp | grep ':443'
ssによる高度なフィルタリング
ssの最大の利点の1つは、接続状態に対して直接フィルタリングを実行できることです。これはnetstatの出力をgrepにパイプするよりもはるかに効率的です。
接続状態によるフィルタリング
接続の蓄積を診断するのに非常に役立つstateオプションをssコマンド内で直接使用できます。
現在TIME-WAIT状態にあるすべてのソケットの検索:
ss -s state time-wait
SYN-SENT状態にあるすべてのソケットの検索(クライアント側がサーバー応答を待機中):
ss -s state syn-sent
ポートまたはアドレスによるフィルタリング
宛先または送信元のアドレス/ポートによるフィルタリングは簡単です。
ポート22(SSH)宛ての確立済み接続の表示:
ss -tn state established '( dport = :22 or sport = :22 )'
特定のローカルIPアドレスに関連する接続の表示:
ss -ant '( daddr = 192.168.1.100 or saddr = 192.168.1.100 )'
パフォーマンス分析:「netstat」と「ss」の比較
トラブルシューティングを行う際、ツール間の選択は速度と詳細さにかかっていることがよくあります。
| 機能 | netstat |
ss |
|---|---|---|
| 速度 | 遅い(ファイルを読み込む) | 非常に高速(Netlinkソケットを使用) |
| 構文 | 成熟しており、文書化が豊富 | 類似のフラグ、新しい固有のオプション |
| フィルタリング | grepへのパイプが必要 |
ネイティブのステートおよびアドレスフィルタリングサポート |
| 情報の深さ | 基本的には良好 | ソケットバッファサイズに関する詳細情報が多い(TCP Info) |
| 利用可能性 | ほぼ普遍的 | 最新のLinuxディストリビューションでは標準 |
接続確立の遅延の診断
クライアントが接続が遅いと報告する場合、ハンドシェイクを待ってスタックしているソケットがないか確認します。ssを使用するのが最も速い方法です。
- 高い
SYN-RECVカウントの確認: これは、サーバーが接続要求を受け取っているものの、ハンドシェイクを完了できていないことを示唆しており、リソース枯渇や高いトラフィック負荷が原因である可能性があります。
bash ss -s | grep syn-rec - 高い
SYN-SENTカウントの確認: サーバー自体が多くの接続を開始している場合(例:データベースや他のAPIへのクライアントとして機能している場合)、これは応答を待っていることを示します。
bash ss -s | grep syn-sent
どちらかのカテゴリで異常に高い数値が見られた場合、それらの接続を開始しているアプリケーションがネットワークの遅延またはファイアウォールの問題に直面している可能性があります。
ネットワークトラブルシューティングのベストプラクティス
- 常に
-nを使用する: パフォーマンスのトラブルシューティングやスクリプト作成の際は、DNS解決の遅延を防ぐために数値フラグ(-n)を使用し、診断の停滞を防ぎます。 ssを優先する:ssをデフォルトのツールとして採用します。ssが利用できないレガシーシステムでのみnetstatを予約します。- PID確認にはRootで実行する: どのプログラムがポートを使用しているかを確認するには、両方のユーティリティで
-pフラグを使用する場合、通常sudoまたはroot権限が必要です。 - インターフェイス統計を確認する: インターフェイスカウンターを忘れないでください。物理層の問題ではなくソケットの問題である可能性があるパケットロスやエラーを確認するには、
ip -s link show <interface_name>を使用します。
ssの最新機能とnetstatが提供する基本的なコンテキストを理解することで、システム管理者はあらゆるLinuxホストのネットワーク状態について強力な洞察を得ることができ、パフォーマンス診断を大幅にスピードアップできます。