【入門編】 ssコマンドによる高速なソケット統計情報の取得とnetstatからの移行 – トラブルシューティング&ネットワーク運用監視実践ガイド

皆さんは、サーバーの調子がなんだか怪しいとき、最初にどのコマンドで中を覗き見しますか?
「とりあえず netstat かな!」と答えたそこのあなた、長年インフラの世界を支えてきた名優へのリスペクト、素晴らしいです。私も深夜の障害対応で、幾度となく netstat -an に救われてきました。

でも、ちょっと待ってください。
もし、そのサーバーが1秒間に何千ものリクエストをさばくモンスター級のWebサーバーだったらどうでしょう? netstat を叩いた瞬間、画面がフリーズしたかのようにピクリとも動かなくなり、冷や汗をかいた経験はありませんか?

今回は、そんな大規模トラフィックの現場で私たちNOCエンジニアの命を救ってくれる、高速かつスマートなソケット調査の切り札ssコマンドについて、その秘密と使い方を優しく紐解いていきたいと思います。

—

なぜ netstat は重いのか? 郵便配達に例えてみよう

まずは、なぜ従来の netstat が大量のコネクション(通信の繋がり)がある環境で遅くなってしまうのか、身近な例えで考えてみましょう。

想像してください。今、あなたの手元に、日本中の膨大な手紙(ネットワークの通信状態)のリストがあるとします。
netstat のやり方は、いわば「役所の分厚い台帳の棚から、1冊ずつファイルを引っ張り出してきて、机の上で一つひとつ手作業でめくりながら確認していく作業」です。手紙が10通や20通なら一瞬ですが、数万通もあったらどうでしょう? 机の上は埋め尽くされ、探し出すだけで途方もない時間がかかりますよね。これが、カーネル(OSの心臓部)の奥底から一つずつ情報をかき集める netstat の裏側の仕組みです。

一方で、今回主役として登場する ss コマンドはどうでしょう?
彼らは、郵便局の最新システムを使っています。あらかじめ「こういう条件の手紙を教えて!」と専用の窓口(netlinkソケットという仕組みです)に伝えておくと、システムがデータベースからピンポイントで、一瞬のうちにごっそり情報を抜き出して私たちの手元に届けてくれるのです。

この「直接、中枢の仕組み(netlink)を叩く」というアプローチの違いが、数万件以上のコネクションが渦巻く現代のクラウド・データセンター環境において、絶望的なまでの速度差を生み出しているというわけですね。

—

一歩ずつ使ってみよう! ss コマンドの基本の「キ」

それでは、実際に手を動かして ss コマンドの快適さを体感してみましょう。
難しく考える必要は全くありません。一歩ずつ、順番に見ていきましょう!

1. まずは全部の接続を見てみる

おなじみの netstat -an に相当するのが、以下のコマンドです。

# 現在のすべてのソケット(TCP, UDP, UNIXドメイン等)を一覧表示する
$ ss -a

実行すると、画面がバーっと流れていきますよね。でも、netstat と比べてどうですか? 画面の描画速度が圧倒的に速いことに気づくはずです。

2. 名前の解決をスパッと諦めて高速化する

トラブルシューティングの現場では、1秒でも早く原因にたどり着きたいものです。もしIPアドレスをわざわざ「ご丁寧なドメイン名(例: example.com)」に変換しようとすると、DNSの逆引きが発生して動作がモタついてしまいます。
そんなときは、-n オプションを添えましょう。

# IPアドレスやポート番号を名前解決せず、数字のまま高速に表示する
$ ss -an

「数字のままでいいから、とにかく速く正確に教えろ!」という、現場のシニアエンジニアが愛用する必須テクニックです。

3. TCPの接続だけに絞り込んでスッキリさせる

サーバーで問題が起きるとき、その大半はWebやデータベース通信で使われる TCP です。UDPや他の通信が混ざると見づらいので、綺麗に絞り込んでみましょう。

# TCPの接続情報だけを、名前解決なしで一覧表示する
$ ss -t -a -n

ここで使っている -t が「TCPだけにしてね」というおまじないです。

—

現場で本当に使える! 実践的な絞り込みフィルター

「接続が多いのは分かったけど、知りたいのは『今、どこから接続されていて、どこに向かっているのか』なんだよ!」という声が聞こえてきそうですね。
ss の真骨頂は、この絞り込み検索(フィルター)の賢さにあります。

パターンA:特定のポート(例: 80番や443番)で待ち受けている状態を見る

Webサーバーがきちんとクライアントからのアクセスを待ち受けて(Listenして)いるか確認したいときは、こう書きます。

# 443番ポート(HTTPS)で待ち受けているソケットの状態を調べる
$ ss -l -n -p 'sport = :443'
  • -l は「今まさに待ち受けている(Listen状態の)ものだけ」を対象にするオプションです。
  • -p は「どのプロセス(プログラム)がそのソケットを開いているか」を表示してくれます(要管理者権限)。
  • 'sport = :443' がフィルター条件です。「ソース(自分側)のポートが443番のもの」という意味になります。

パターンB:特定の状態(ESTABLISHEDなど)に絞り込む

「現在、実際にやり取りが行われている真っ最中のコネクション」だけを抜き出したいときは、状態(state)を指定します。

# 現在、通信が確立(ESTABLISHED)しているTCPコネクションだけを抽出する
$ ss -t -n state established

もし、大量のアクセススパイクや、悪意あるアクセスに悩まされているときは、この state established や、応答を待っている time-wait などの状態をサクッと切り出してカウントしてみると、ボトルの栓がどこにあるのか一発で分かりますよ。

—

ありがとう netstat、こんにちは ss

長年、私たちのネットワークライフを支えてくれた netstat コマンドは、多くのLinuxディストリビューション(UbuntuやCentOS、RHELなど)で、すでに「非推奨(Deprecated)」扱いとなり、net-tools という古いパッケージの一部になっています。

時代の変化とともに、クラウドが普及し、一つのサーバーが何万、何十万という膨大な並行セッションをさばくのが当たり前になった今、カーネルの奥底とスマートに対話できる ss コマンドへの移行は、インフラエンジニアにとって必須のスキルとなっています。

最初は見慣れないオプションに戸惑うかもしれませんが、基本の組み合わせは netstat とほとんど変わりません。ぜひ今日の業務から、手グセのように ss コマンドを叩く習慣をつけてみてください。その圧倒的なレスポンスの速さに、きっと感動するはずですよ!

それでは、また次回の現場でお会いしましょう。快適なネットワーク運用ライフを!

コメント

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