こんにちは!NOC(ネットワークオペレーションセンター)で日々、数千台のサーバーやルーターの脈動を見守っているシニアエンジニアです。
データセンターの深夜、ふとアラートが鳴り響く。「おい、Webサーバーの応答が急激に遅くなっているぞ! コネクションが溢れてるんじゃないか!?」——そんな修羅場を、僕らは幾度となくくぐり抜けてきました。
障害の現場で、真っ先に私たちが手にする武器は何だと思いますか? そう、ネットワークの状態を覗き見る診断コマンドです。長年、エンジニアたちの相棒といえば netstat でしたよね。「あぁ、若かりし頃はとりあえず netstat -anp って叩いておけば安心だったな……」なんて、懐かしく思い出す先輩方も多いはずです。
しかし、現代のモダンなLinux環境、特に数万・数百万アクセスをさばく超巨大なクラウド基盤やコンテナ環境において、古い netstat はすでに「おじいちゃん」になりつつあります。そこに現れたのが、今回主役として取り上げる ss コマンドです。
なぜ、私たちは netstat から ss へと移行しなければならないのでしょうか? その背景にある「カーネルとユーザー空間のドラマ」を、身近な例えを交えながら一歩ずつ優しく紐解いていきましょう!
—
1. なぜ netstat は現代のインフラで息切れしてしまうのか?
まずは、私たちが長年使ってきた netstat が、今の巨大なサーバー環境でなぜ苦しくなっているのか、その理由からお話ししますね。
イメージしてください。あなたの手元に、世界中から毎日何百万通もの手紙(パケット)が届く、超巨大な中央郵便局があります。
局員(OSのカーネル)は、今まさに「どんな手紙が、どこから来て、どの窓口に置かれているか(=ネットワークソケットの状態)」を把握しています。
ここで、あなたが「今、どんな手紙が届いているか全部リストアップして教えて!」と局員に頼んだとします。
古い netstat がやっていた方法(procfs を使った方法)は、例えるならこんな感じです。
1. 局員は、持っている情報をわざわざ裏の倉庫に走り、一枚の巨大な紙の台帳に、一文字ずつ手書きで書き写す。
2. その台帳を、ダンボール箱に詰めて、表の受付まで「はい、どうぞ」と持ってくる。
3. netstat は、その重たいダンボール箱を受け取り、ペラペラとページをめくって私たちに見せてくれる。
……どうですか? 想像しただけで、すごく時間がかかりそうですよね。
そう、netstat は /proc/net/ という「テキストファイル(紙の台帳)」を毎回一生懸命読みに行っていたのです。サーバーがヒマな時はこれでも良かったのですが、現代のWebサーバーのように、一瞬の間に何万ものコネクションが生まれ消えていく世界では、この「紙に書き写して持ってきて、それを読む」というプロセスがあまりにも重すぎて、CPUの負荷をバカ食いしてしまうのです。
「おいおい、もっとダイレクトに最新の状況を教えてくれよ!」
そんな現場からの切実な叫びから生まれたのが、今回の主役である ss コマンドなんです。
—
2. ss コマンドの設計思想:カーネルと直結する「専用ホットライン」
では、ss コマンドは netstat と何が違うのでしょうか?
ひと言で言えば、ss は 「Kernel Netlink Socket」 という、カーネルと直接会話するための専用の高速ホットライン(地下通路)を使っています。
再び郵便局の例えに戻りましょう。
ss コマンドは、裏の倉庫でわざわざ紙の台帳に書き写すようなまどろっこしいことはしません。専用のインターホン(Netlink)を使って、局員の耳元に直接こう囁くのです。
「おい、今の状態をピンポイントでくれ!」
局員は、今まさに自分の手元にある最新のメモ(カーネルメモリ)を、そのままダイレクトにシュッと高速で ss に投げ返します。
netstat:ファイルシステム(procfs)を介するため、テキスト変換のオーバーヘッドが大きい(遅い・重い)ss:Kernel Netlink を使うため、カーネル空間からユーザー空間へ直接、超高速でデータを取得できる(速い・軽い)
この設計思想の違いこそが、ソケットが数万・数十万規模に膨れ上がるモダンなLinux環境で、ss が圧倒的な優位性を誇る理由なのです。「百聞は一見にしかず」、実際にその圧倒的なスピードとスマートさを体験してみましょう!
—
3. 実践! 今すぐ使える ss コマンドの基本レシピ
「理屈は分かったけれど、普段の業務ではどう書けばいいの?」
ご安心ください! ここからは、インフラ現場で私たちが毎日のように使っている、実用的な ss コマンドのレシピをご紹介します。コピペして、お使いの環境(UbuntuやCentOSなどのLinux)でぜひ試してみてくださいね。
① まずはこれ! すべての「待ち受け(LISTEN)」ポートをスマートに一覧化する
サーバーを構築したとき、「今、どのポートが開いていて、誰からのアクセスを待っているんだっけ?」を確認する定番のコマンドです。
# -t: TCPのソケットを表示
# -l: 待ち受け(LISTEN)状態のソケットのみを表示
# -n: IPアドレスやポート番号を名前解決せず、数字のまま高速表示
# -p: そのソケットを開いているプロセス名やPIDを表示(要root権限)
sudo ss -tlnp
【出力例と見方のポイント】
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=1234,fd=6))
Local Address:Portが0.0.0.0:80になっていれば、「このサーバーのすべてのIPアドレスの80番ポート(HTTP)で、みんなからのアクセスを待ち構えているんだな」と直感的に分かります。- 右端の
Process列を見ると、nginxがしっかりとPID1234で待ち受けているのが一目でわかります。netstatだとこのプロセス情報を出すのに一苦労でしたが、ssなら瞬時に引き出せます。
② 接続が溢れていないか? 「キューの溜まり具合」を監視する
アクセス集中やDDoS攻撃、あるいはバックエンドのデータベースが詰まっているとき、ネットワークの「待ち行列(キュー)」がどうなっているかを見るのは、シニアエンジニアの腕の見せ所です。
# すべての確立された接続(ESTAB)と、そのキューの状況を表示する
ss -tin
ここで注目してほしいのが、出力に含まれる Send-Q(送信待ちのデータ量)と Recv-Q(受信側でまだ読み込まれていないデータ量)です。
もしこの数値が常にポツポツと溜まっている場合、アプリケーションの処理が追いついていないか、ネットワークのどこかでボトルネック(渋滞)が発生しているサインです。アラートの予兆をキャッチするのに非常に役立ちます。
③ 特定のポートだけを秒速でフィルタリングする
「あぁ、なんだか443番ポート(HTTPS)周りが怪しいぞ」というときは、grepなどをパイプで繋がなくても、ss 自体に条件を伝えることができます。
# 443番ポートに絡む通信だけをフィルタリングして表示する
ss -tn 'sport = :443 or dport = :443'
sportは送信元(Source Port)、dportは宛先(Destination Port)を意味します。- このように、
ssはフィルタリングの構文が非常に洗練されており、巨大なデータの中から見たい情報だけを瞬時に引き抜くことができます。
—
4. 古き良き netstat からの卒業、そして未来へ
いかがでしたでしょうか? 今回は、ss コマンドの裏側にある設計思想と、netstat から移行すべき背景について、カーネルとユーザー空間のドラマを交えて解説しました。
- 従来の
netstatは、procfsという「紙の台帳」を読みにいくため、大量のソケットがある環境ではどうしても重くなってしまう。 - 新時代の
ssコマンドは、Kernel Netlink Socketという「直通のホットライン」を使い、カーネルからダイレクトに高速かつ軽量に情報を吸い上げることができる。
すでに多くのモダンなLinuxディストリビューションでは、netstat を含む net-tools パッケージはデフォルトではインストールされなくなっており、ss コマンドが標準のネットワーク診断ツールとして君臨しています。
「昔からの習慣で、ついつい netstat って打っちゃうんだよね」という方も、今日を境にぜひ ss コマンドを叩いてみてください。その圧倒的なレスポンスの速さと、スマートな出力結果に、きっと感動するはずです。
ネットワークのパケットがどこを走り、カーネルがどう応答しているか——その裏側の仕組みを少しだけ想像できるようになると、インフラを触る毎日の仕事が何倍も楽しく、そしてエキサイティングになりますよ。
それでは、また次回のNOC現場レポートでお会いしましょう! 安全で健やかなネットワークライフを!
コメント