深夜2時のデータセンター。冷え切ったサーバー室で、ファンの爆音が耳鳴りのように響く中、私の目の前では本番サービスのWebサーバーが悲鳴を上げていました。
「おい、またAPIの応答が返らなくなってるぞ!」
「マジか、DBへのコネクションが枯渇(こかつ)してるのか? 急いで確認してくれ!」
若手エンジニアの焦る声を聞きながら、私は静かにキーボードを叩きます。こんな修羅場で私たちインフラエンジニアの相棒となるのは、いつだってコマンドラインです。昔は netstat というコマンドが定番でしたが、現代の巨大なトラフィックを捌くLinuxサーバーの前では、あいつは少しばかり息切れしてしまいます。今、私たちの手元にある最強の武器、それは ss コマンドです。
今回は、ネットワークやインフラの世界に飛び込んだばかりのあなたへ向けて、この ss コマンドの使い方と、その裏側にあるTCPの「状態遷移」のドラマを、身近な例えを交えながらたっぷりとお伝えしていきますね。一歩ずつ、リラックスして読み進めていきましょう!
—
1. なぜ今、netstat ではなく ss なのか?
ネットワークの調子が悪いとき、まず「今、どこにつながっているんだろう?」と調べるために、私たちはソケット(通信の窓口)の一覧を確認します。
昔のエンジニアはみんな netstat というコマンドを使っていました。「ネットスタット」と読みます。これはこれで歴史のある名コマンドなのですが、現代のクラウド時代、数万・数百万ものアクセスが押し寄せる巨大なサーバーで netstat を叩くと……どうなるでしょうか?
そう、結果が表示されるまでに何秒も、下手すると何十秒も待たされてしまうのです。なぜなら、netstat はOSのあちこちをドタバタと探し回って情報をかき集めているからなんですね。
郵便配達の「聞き込み調査」と「住民台帳の閲覧」
ここでちょっと、身近な例え話をさせてください。
netstat のやり方は、いわば「町中をしらみつぶしに歩いて、一件一件『今、誰と手紙のやり取りをしていますか?』と聞き込み調査をして回るお巡さん」です。町が小さいうちはこれでもいいのですが、高層マンションが建ち並ぶ巨大なメガシティ(現代のサーバー)になった途端、調査が終わる頃には状況が変わってしまっています。
一方、今回主役として紹介する ss コマンド(Socket Statisticsの略)は、Linuxカーネル(OSの心臓部)が持っている「最新の住民台帳(sock_diagインターフェース)を直接パッと開き、一瞬で全員の状況をリストアップする敏腕係長」のようなものです。
だからこそ、ss コマンドは圧倒的に速い。この「速さ」こそが、障害対応の現場で何よりも尊ばれる理由なのです。
—
2. TCPの「状態(State)」ってなんだろう?
ss コマンドを叩くと、画面には見慣れないアルファベットの羅列が並びます。ESTABLISHED や TIME-WAIT などですね。
「なんだか難しそう……」と思いましたか? 大丈夫です。これらはすべて、通信の相手と私たちが「電話で会話をしている時のマナーや現在のフェーズ」を表しているに過ぎません。
TCPという通信ルールは、いきなり話し始めるのではなく、以下のような厳格なステップを踏みます。
1. 「もしもし、聞こえますか?」 (接続の要求)
2. 「はい、聞こえますよ。そちらはどうですか?」 (接続の許可とお返事)
3. 「じゃあ、本題に入りますね」 (接続の確立)
この一連の流れや、電話を切り終わった後の後片付けの状態が、そのまま ss コマンドで表示される「TCPの状態遷移」の正体です。代表的なものをいくつか、日常のシーンに例えて見てみましょう。
よく見るTCPの状態とリアルな例え
LISTEN(リッスン)- 例え: お店を開いて、カウンターの前に座って「いらっしゃいませ!お客さまからのご注文をいつでもお待ちしております!」と待ち構えている状態です。WebサーバーやDBサーバーが起動しているときは、この状態のポートが必ず存在します。
ESTABLISHED(エタブリスティド)- 例え: 「もしもし、聞こえますか?」「はい、バッチリ聞こえてます!」と、まさに電話で会話が盛り上がっている真っ最中の状態です。通信が正常に行われているときは、ここが一番賑やかになります。
TIME-WAIT(タイムウェイト)- 例え: 電話を切った後、「さっきの会話、ちゃんと相手に最後の一言まで届いたかな……? もし途中で切れてたら失礼だし、少しの間だけ念のため電話機をガチャ切りせずに机に置いておこう」と、余韻に浸っている(名残を惜しんでいる)状態です。これが多すぎると、新しい電話をかけるための回線が足りなくなるトラブル(ポート枯渇)に繋がります。
—
3. 実践! ss コマンドを使いこなそう
それでは、実際に端末(ターミナル)を開いたつもりで、よく使う実用的な ss コマンドのレシピを見ていきましょう。どれも現場で明日からそのまま使えるものばかりです。
基本のき:現在つながっている通信をすべて見る
まずは、今サーバーがどんな通信を行っているのか、全体を俯瞰(ふかん)してみましょう。
# すべてのTCP接続を、名前解決(IPをドメイン名に変換する処理)をせずに高速表示する
# -t: TCPのソケットだけを対象にする
# -a: 待ち受け中(LISTEN)のものも含めてすべて表示する
# -n: IPアドレスやポート番号を名前(httpなど)に変換せず、数字のままで素早く表示する
ss -tan
このコマンドを叩くと、画面が一気にスクロールします。上から順に、どのIPアドレスの、どのポートから、どこへ繋がっているのかが数字でずらりと並びます。
「お医者さん状態」を特定する:特定のステータスで絞り込む
障害対応で最も多いのが、「あ、TIME-WAIT や SYN-RECV が異常に増えてるぞ!」という状況を突き止める場面です。そんなときは、状態を指定して絞り込みを行いましょう。
# TCPの状態が「TIME-WAIT」になっているソケットだけを抽出して数える
# stateキーワードの後に状態名を指定します
ss -t state TIME-WAIT
もし、この TIME-WAIT が数万件もズラリと並んでいたら、「おや、アプリケーションがデータベースや外部APIとの接続をちゃんと閉じずに、雑に放置しているんじゃないか?」という鋭い仮説が立てられます。これがエンジニアとしての勘と推理の第一歩です。
「誰がその通信を使っているの?」:プロセス名を暴く
ネットワークの接続が見つかったとしても、「一体どのプログラム(プロセス)がこの通信を行っているのか?」が分からなければ意味がありません。ゾンビのような怪しいプログラムが勝手に通信している可能性もありますよね。
そんなときは、-p オプションの出番です。
# TCP接続一覧に、それを開いているプログラム名(プロセス名)とPID(プロセスID)を表示する
# ※管理者権限(sudo)が必要になるケースが多いです
sudo ss -tulpn
-uはUDP、-tはTCPを表します。-lはLISTEN(待ち受け中)のポートに絞ります。-pがプロセス名を表示してくれる魔法のスイッチです。
実行すると、一番右の列に pid=1234,users:(("nginx",pid=1234,fd=6)) のように、どのソフトがそのポートを掴んでいるのかが丸裸になります。「犯人はお前だな!」と特定できる瞬間は、エンジニアにとってなかなかの快感です。
—
4. トラブルシューティングの現場から:ソケット枯渇にどう立ち向かうか?
ここで、冒頭のデータセンターでのエピソードに戻りましょう。
あのとき、私たちが遭遇していたのは、まさに大量のクライアントからのアクセス急増による「TIME-WAITの急増とポート枯渇」でした。Webサーバーが外部のAPIサーバーへリクエストを投げまくる設計になっていたため、通信が終わるたびに TIME-WAIT が発生し、新しい通信のための「電話番号(エフェメラルポート)」が底をついてしまっていたのです。
私たちはすかさず以下のコマンドを打ち込みました。
# 現在のTCP接続の状態ごとの件数を集計してサマリー表示する
# ネットワークの健康診断の最初に行う定番の構文です
ss -s
この ss -s を実行すると、以下のような綺麗な要約レポートが返ってきます。
Total: 4520 (kernel 4890)
TCP: 2540 (estab 1800, closed 200, orphaned 15, timewait 520)
...
「おっ、やっぱり timewait が500を超えてるな。しかも orphaned(どの親からも管理されずに彷徨っているかわいそうなソケット)もいるぞ」
原因が分かれば、対策は打てます。一時的な処置としてOSのカーネルパラメータ(net.ipv4.tcp_tw_reuse など)を見直すか、あるいはアプリケーション側のコネクションプーリング(接続の使い回し)の設定を修正してもらうよう開発チームにパスを出す。
すべては、ss コマンドがほんのコンマ数秒で教えてくれた「現在のソケットの正確な状態」から始まったストーリーです。
—
5. おわりに:ネットワークと対話する楽しさを知ろう
いかがでしたでしょうか?
ss コマンドは、単なる文字の羅列を吐き出す冷たいツールではありません。それは、「今、サーバーの中を流れているパケットたちが、どんなドラマを繰り広げているのか」を私たちにリアルタイムで教えてくれる、頼もしい通訳者です。
最初は難しく見えるアルファベットのオプションも、一つひとつの意味を紐解き、日々の運用の中で実際に手を動かしていくうちに、自然と身体が覚えていきます。
焦らず、一歩ずつ。
次にサーバーの様子がおかしくなったときは、ぜひ恐れずに ss -tan や ss -s をそっと叩いてみてください。きっと、OSがあなたにそっと現状を打ち明けてくれるはずですよ。
それでは、また次のデータセンターの片隅でお会いしましょう!
コメント