【実務・中級編】 ssコマンドによる高速なソケット情報収集とnetstatとの性能比較 – トラブルシューティング&ネットワーク運用監視実践ガイド

その「netstat」で消耗していませんか?大規模環境でこそ輝く「ss」コマンドの底力

深夜3時、データセンターで障害対応をしていると、ふとした瞬間に自分の「古臭い習慣」がボトルネックになっていることに気づかされます。

サーバーの接続数が急増し、Web APIのレスポンスが悲鳴を上げている状況。あなたは焦って netstat -an を叩きますよね。でも、その瞬間、ターミナルがフリーズしたような状態になり、数秒間(あるいは数十秒間)の空白が生まれる……。その間にパケットはドロップし、SLIは崩壊する。

そんな経験があるなら、今日で netstat とは決別しましょう。今回は、現代のLinuxインフラエンジニアが必須で使いこなすべき ss コマンドの世界について、現場の知見を交えて語ります。

—

なぜ netstat は「重い」のか?

netstat がなぜ大量接続環境で遅いのか。それは、このコマンドが /proc/net/ 配下のテキストファイルを読み込んで解析するという、非常に泥臭い処理を行っているからです。

接続数が数千、数万と増えると、カーネル内のソケット情報をいちいちテキスト形式に変換してユーザー空間に渡すコストが無視できなくなります。これは、現代の超高速なネットワーク環境においては致命的なオーバーヘッドです。

一方、ss(Socket Statistics)は違います。ss はカーネルの netlink インターフェースを直接叩きます。カーネルが管理しているソケット情報に直接アクセスし、バイナリデータとして高速に情報を引き抜く。この設計思想の違いが、数千接続規模の環境で天と地ほどの差を生むのです。

—

ss コマンドの基本と「実務的な」パラメーター

現場でまず覚えておくべきは、この組み合わせです。

# 接続状態(ESTAB)をフィルタし、プロセスIDも表示する
ss -ntp state established
  • -n: 名前解決をしない(これ重要です。障害時にDNSの応答待ちで止まるのは最悪です)
  • -t: TCPソケットのみを表示
  • -p: ソケットを使用しているプロセスを表示
  • state established: 確立済みの接続のみに絞り込む

もし、APIサーバーで大量の TIME_WAIT が発生してポート枯渇を起こしているなら、以下のようにして原因を特定します。

# TIME_WAIT 状態のソケットを数えてみる
ss -ant state time-wait | wc -l

接続元IP別の統計を秒速で出す

障害時、「どのクライアントから異常な接続が来ているか?」を特定する際、ss と awk を組み合わせれば、一瞬で切り分けが完了します。

# 接続元IPアドレスごとの接続数をカウントし、多い順にソートする
ss -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr | head -n 10

このコマンドは、netstat でやろうとするとCPUを食いすぎてサーバーの負荷をさらに上げてしまう可能性がありますが、ss なら驚くほど軽快に動作します。

—

実践:Python でソケット状態を監視する際の視点

API設計者として知っておいてほしいのは、OS側のソケット状態をプログラムからどう捉えるか、という点です。例えば、PythonでクライアントからAPIを叩く際、接続プールを適切に管理しないと TIME_WAIT が爆発します。

import requests
from requests.adapters import HTTPAdapter

# 接続プールを再利用することで、TIME_WAITの発生を抑制する
session = requests.Session()
adapter = HTTPAdapter(pool_connections=100, pool_maxsize=100)
session.mount('https://', adapter)

# これを意識しないと、ssコマンドで確認した際に
# 無数のTIME_WAITソケットが放置されることになる
response = session.get('https://api.example.com/v1/data')

もし、インフラ担当から「あなたのAPI、TIME_WAIT が多すぎてカーネルのパラメータ net.ipv4.tcp_tw_reuse をいじらなきゃいけないんだよ」なんて言われたら、それは設計を見直すサインです。まずは ss -ant で実際の接続状況を可視化することから始めましょう。

—

シニアエンジニアからの最後のアドバイス

障害現場における鉄則は、「システムに負荷をかけずに情報を収集すること」です。

netstat は歴史あるコマンドですが、現代のLinux環境においては「過去の遺産」となりつつあります。トラブルシューティングの最中に netstat を叩いてサーバーが重くなるような事態は、プロとして避けなければなりません。

まずは、今日から netstat のエイリアスを ss に書き換えてみてください。数週間もすれば、その軽快さに手放せなくなるはずです。

ネットワークのトラブルは、往々にして「見えないもの」を「見える化」した瞬間に解決の糸口が見つかります。ss コマンドという強力な武器を手に、現場の荒波を乗り越えていきましょう。何かあればいつでも質問してください。現場からは以上です。

コメント

タイトルとURLをコピーしました