- パフォーマンス障害が起きてから診断ツールの導入を始めると、復旧よりも準備作業に時間を取られるため、Linuxサーバーのイメージには危機対応ツールをあらかじめ入れておくべき
- 推奨リストは procps、util-linux、sysstat、iproute2、tcpdump、perf、bcc/bpftrace、trace-cmd、ethtool などで、CPU・ディスク・ネットワーク・カーネルトレースをすぐ確認するための最小パッケージ
- bcc と bpftrace には重複するツールが多いが、bcc は CLI オプションが豊富で、bpftrace は現場で編集しやすく、実行時には同じBPFバイトコードを出力する
- 障害中のインストールは、遅い SSH、壊れた apt 設定、リポジトリ遮断、ファイアウォール、不変ファイルシステム、権限エラーといった要因により、数十分の損失につながる可能性がある
- コストは主にディスク容量とイメージ配布時間だが、推奨パッケージの大半は小さく、エンタープライズ Linux ディストリビューションに標準搭載すれば、パフォーマンス障害への対応をより早く始められる
障害前にそろえておくべき最小ツール
- パフォーマンス障害が発生すると、原因診断に必要なツールをインストールする時間そのものが損失になるため、Linuxサーバーには危機対応ツールを標準で導入しておくほうが安全
- リストは Systems Performance 2nd Edition の「Linux Crisis Tools」表をもとにしている
- Ubuntu パッケージ基準の推奨ツールは以下のとおり
procps: ps, vmstat, uptime, top
util-linux: dmesg, lsblk, lscpu
sysstat: iostat, mpstat, pidstat, sar
iproute2: ip, ss, nstat, tc
numactl: numastat
tcpdump: tcpdump
linux-tools-common, linux-tools-$(uname -r): perf, turbostat
bpfcc-tools または bcc: opensnoop, execsnoop, runqlat, softirqs, hardirqs, ext4slower, ext4dist, biotop, biosnoop, biolatency, tcptop, tcplife, trace, argdist, funccount, profile など
bpftrace: bpftrace, 標準版の opensnoop, execsnoop, runqlat, biosnoop など
trace-cmd: trace-cmd
nicstat: nicstat
ethtool: ethtool
tiptop: tiptop
cpuid: cpuid
msr-tools: rdmsr, wrmsr
bcc と bpftrace をどう使い分けるか
- bcc と bpftrace には重複するツールが多いが、使いやすい場面は異なる
- bcc ツールは CLI オプションなどの機能が多く、完成されたツールとして使いやすい
- bpftrace ツールは現場でその場で編集できるため、状況に応じた確認がしやすい
- どちらか一方がより高速という意味ではない
- 両ツールは同じ BPF バイトコードを出力する
- 実行中の速度は同等に速い
- bcc は Python ベースのツールを libbpf C に移行する方向で進化している
- CO-RE と BTF を使用する
- まだパッケージは再構成されていない
- 将来的には
bpfcc-tools はツールのバイナリだけを含む、より小さな libbpf-tools パッケージに置き換えられるべき
サーバー種別ごとに追加で必要なツール
- 上記の一覧はあくまで最小構成
- アクセラレータを搭載したサーバーなら、その機器を分析するツールも含めるべき
- Intel GPU サーバー:
intel-gpu-tools
- NVIDIA サーバー:
nvidia-smi
gdb のようなデバッグツールも、危機時にすぐ使えるよう事前に入れておける
- 必須の分析ツールは頻繁には変わらないため、この一覧は数年に一度程度の更新でも足りる可能性がある
標準インストールの実際のコスト
- パッケージ追加で最初に目につく欠点はディスク使用量
- クラウドインスタンスでは、標準サーバーイメージが数 MB 増えるだけでも、インスタンス配備時間が数秒、あるいは数分の1秒伸びる可能性がある
- 推奨パッケージの大半は小さく、bcc も今後さらに小さくなる見込みのため、容量と時間のコストは大きくないはず
- debuginfo は合計で約1GBに達し、標準同梱をためらわせる容量面の懸念が実際にあった
障害中にインストールが詰まる流れ
- 障害発生後にツールを導入しようとすると、診断よりもインストール問題の解決に時間を奪われることがある
- 例としては次のような流れ
- 4:00pm: 会社のサイトがダウン、または極端に遅くなり利用不能になる
- 4:01pm: 監視ダッシュボードでバックエンドサーバー群に異常が見つかり、高いディスク I/O が疑われる
- 4:02pm: サーバーへ SSH 接続しようとするが、ログインが非常に遅い
- 4:03pm:
iostat -xz 1 を実行しようとするが iostat がなく、sysstat のインストール案内が表示される
- 4:07pm: パッケージインストールがリポジトリ解決に失敗し、
/etc/apt の設定問題が判明する
- 4:10pm: 修正した設定で
apt-get update を実行する必要があるが、これも非常に遅い
- 4:13pm: 接続タイムアウトが発生し、リポジトリ接続かパフォーマンス問題が疑われる
- 4:17pm: ネットワークセキュリティチームが予期しないトラフィックとして HTTP/HTTPS/FTP の outbound apt リクエストを遮断していたことが判明する
- 4:20pm: ファイアウォールを無効化したあと
apt-get update は通るが、インストールで権限エラーが発生する
- 4:24pm: プラットフォームセキュリティチームが、実行バイナリ領域など一部ファイルシステムへの書き込みが禁止された不変システムだと説明する
- 4:27pm: SRE チームが大規模障害を告知し、経営陣は状況更新と復旧 ETA を求めるが、実際の診断はほとんど進んでいない
- 4:30pm:
cat /proc/diskstats で粗い iostat の代替を試みるが、Linux のドキュメントを読む必要があり、ディスクが忙しいという既知の事実しか確認できない
- 4:55pm: 書き込み可能なファイルシステムを持つ新しいサーバーイメージが立ち上がり
sysstat をインストールできるようになるが、サーバー再起動でサイトが復旧しただけで、原因は修正されていない
- 12:50am: ファイアウォールとファイルシステム保護を無効化した影響で、サイトがハッキングされるという例に続く
- 12:50am の出来事は実体験ではないが、それ以外は実体験に基づく例
- 以前の勤務先では、約 15 分時点で “traffic team” がクラウドリージョンのフェイルオーバーを開始することがあり、
iostat のインストールが終わる頃には対象システムがすでにアイドル状態になっていることもあった
標準イメージに入れておくべき理由
- 上記シナリオは、本番障害の最中に後からツールを導入する方式がどれほど脆弱かを示している
- 一部の企業では、必要なツールを含めたカスタムサーバーイメージを OS チームが作成して利用している
- それでも標準の Linux をそのまま運用しているサイトは多く、その場合は障害を経験して初めて必要性に気づくことが多い
- エンタープライズ Linux ディストリビューションがこうした危機対応ツールを標準搭載すれば、大小さまざまな企業がパフォーマンス障害発生時にすぐ診断を始められる
1件のコメント
Hacker Newsのコメント
この一覧は役に立つ。
aptリポジトリの解決失敗のように、サーバー自体が壊れている状況では、クラウドがうまくはまることが多い修復しようとして抱え込むより、マシンを落とすかプールから外して新しいマシンを立ち上げれば、新しいマシンとアプリがきれいな状態で起動し、障害は終わる。問題のあるマシンはホットパスの外で別途調べればよい
物理世界の「部品交換しかできない人」のソフトウェア版になる
すべてのサーバーがコンテナ化されているわけではないが、かなりの数はコンテナであり、それ自体の難しさがある
Dockerイメージ内のデバッグツールは、自動セキュリティスキャナで「攻撃者がシステムの動作を観察・改変するのに役立つ不要なツール」として検出されることが多い。
gdbのようにもっともな懸念もあるが、そうでないものも多いそのため一部のツールは別ボリュームに、できれば 静的バイナリ として置くか、マウントパスをインストールプレフィックスとしてコンパイル・インストールする。デバッグが必要なら、運用チームに読み取り専用で一時マウントしてもらうよう依頼する
また、あるデバッグツールが特定のカーネル機能の有効化を要求すると、同じホスト上のほかのコンテナにどんな影響があるのかという質問や懸念がよく出る
このポリシーに意味があるシナリオは、「組織が セキュリティスキャナを誤用している」以外にはあまり思いつかない
デバッガを使うには
SYS_PTRACE権限、ユーザー0、--privilegedのようなフラグが多く必要になるので、2つ目のコンテナを起動するほうがたいていはよいこの方法なら本番コンテナを再起動せずに済み、再現の証拠を失う可能性も減る
ただし障害時にこの手順を思い出すのは簡単ではないので、事前に試し、ランブック に手順を段階ごとに書いておくべきだ
関連して、FreeBSD 5.2、つまり2004年以降、すべてのFreeBSDシステムには
/rescue/*がある約150個の中核ツールを1つにまとめた 静的リンクバイナリ が通常の名前でハードリンクされており、サイズは約17MBだ
https://man.freebsd.org/cgi/man.cgi?rescue
https://github.com/freebsd/freebsd-src/blob/main/rescue/resc...
Netflixにいたとき、Brendanと彼のチームが
bpftrace、bcc、ちゃんと動くperfのような デバッグツール をあちこちに入れておいてくれた何度も命を救ってくれたツールだった
その一覧に
straceがないのは驚きだった。たいてい最初に手に取るツールの1つだとくにプログラムが役に立たない、または間違ったエラーメッセージを返すとき、
straceは本当に有用だstraceは最後の手段としては悪くないが、本番環境で安全な代替はperf traceと BPF トレーシングツールだhttps://www.brendangregg.com/blog/2014-05-11/strace-wow-much...
fuserとlsofも有用だhttps://man7.org/linux/man-pages/man1/fuser.1.html
https://en.m.wikipedia.org/wiki/Lsof
SRE系の職種の面接では、こうしたツールはいつも話題になる
候補者が特定のコマンドをどれだけ暗記しているかが重要なのではなく、新しいツールを知っていれば印象的ではあるが、何が可能で、どんなツールがあり、どう使うかを見る
ネットワークトラフィック、システムコール、実行プロファイルをキャプチャ・分析し、OSとハードウェアの状態を調べられるという感覚が重要だ
こうした危機的状況でツールをインストールできないなら、Dockerでさまざまなユーティリティを実行できる
たとえばコンテナをワンライナーでビルドしたり、ホストネットワークに接続して
netstat系のツールを実行したり、/procをマウントし、--privileged、--net host、--pid hostでiostat、sar、vmstat、mpstat、pidstatのような システムツール を動かせるもちろん
yum installのほうがよいが、Dockerが使えて必要なマッピングを許容できるなら代替になる。rootless や Podman の構成ではたぶんうまくいかないだろうaptがパッケージをダウンロードしてインストールできないのに、Dockerは新しいコンテナを取得できるという状況はあるのか?aptのライブラリが壊れている、といった場合だろうか?busyboxにこうしたツールがもっと多く入っているとよいサーバーにアップロードしてすぐ実行できる1MBくらいのファイルがあれば、とても助かる
みんな root アクセス権をもらえるのか? 自分は何をするにも システム管理者チケット を起票しなければならない
セキュリティ担当者、建物への入館を通してくれる気まずいジャケット姿の人たちの名前を覚え、Starbucksカードも持っておくとよい
清掃担当にも礼儀正しく接し、名前を覚えれば、自分の席はきれいになる。たまに遅くまで残ってこうした人たちを知るのも価値がある
経理部にも友人を作るとよい。コーヒーを飲み、昼食を取り、仕事以外の話もしながら関心を示せば、適切な人たちはレイオフが来るときや会社の資金に余裕が出たときに知らせてくれる
IT、つまりノートPCを配ってメールを管理している人たちにも良くしておくべきだ。自分のPCからくだらないセキュリティツールをどれだけ早く外してくれるか、アップグレードの列でどれだけ前にしてくれるかが違ってくる
いちばん重要なのは システム管理者 だ。root のためだけではなく、優れたシステム管理者はコーディングできるのに決して大声では言わないからだ。優れた管理者は、どこか暗い隅に死体があるのか、それが壁一面のクローゼットなのか共同墓地なのかを教えてくれる。彼らのプラットフォームに合わせてビルドする方法を学べば、はるかに大きな裁量が得られる。彼らに頼まれたことは引き受けるべきだ
この記事は、ITが提供したインフラ上でアプリを運用する人たちに向けたものだ。例にあるようなやり取りが必要なら、それは技術的問題ではなく 組織レベルの失敗 だ
私たちには非常に明確で信頼できるコミュニケーションの線があり、人々はチャットではなく電話、最近なら Teams のような場で、開発・運用・セキュリティ・コンプライアンスと一緒に動いていた
実際には、すべてのチームに少なくとも連絡担当がいて、通常は開発者が運用チーム提供のリソース上でアプリを動かしていた。コンプライアンスが構成を承認し、サービス信頼性は開発の責務だった。この意味で DevOps をやれば、多くの問題は消える
nmap、netstat、ncが見当たらない。これらのツールにも何度も救われた1つだけ追加するなら
nmapだネットワーク接続の問題は、アプリによっては常に明確に現れるとは限らない
screen、tmux、byobu、pv、rsync、そしてもちろんvimも必要だ