View on GitHub

wsa

Linuxのトレースツールの体系化

目次

1.はじめに

筆者が所属する、GMOペパボのホスティングサービスでお客様に貸し出しているLinuxのWebサーバの運用・開発において以下のような課題がある。

ホスティングはサービスの特性上、お客様が自由にプログラムを実行できる環境にあり、実行されるプログラムの種類は多種多様である。 また、共有サーバとして安価に提供しており1台のサーバを多くの人が利用するほどコストを抑えることができる。 その状況下で、障害の原因特定や、多種多様のプログラムを効率よく高速に実行できるようにすることは非常に重要なポイントだと考える。

我々は、サーバを安定稼働させるための情報としてサーバのCPUやメモリ、ログ、サービスレスポンスタイムなどを収集している。 冒頭に述べたような課題について、現在収集している情報では原因の特定に至ることができない場合がある。

例えば、高負荷などの障害が発生した時にリアルタイムに topps といったコマンドでどのプロセスが原因なのかが特定できることがあり、 strace でシステムコールのトレースや lsof によるプロセスがOpenしているファイルを確認することで原因を特定できる場合がある。特定できない場合に、やむおえずプロセスの再起動を実施することでなんとなく解決する場合などもある。

サーバの障害の予防や原因の特定の情報としてシステムコールのトレースなどが有効に活用することができたが、原因不明で終わってしまうこともしばしば発生する。原因の所在を特定するためにUser-levelのみのトレースではなくkernelレベルのトレース情報も活用することで現状から打開する策を検討したいと考える。

例えば、 strace のような、オーバーヘッドの大きい (*1) トレースツールではなく、オーバーヘッドが少なく、自由度の高いツールにスコープとして動作の仕組みを理解し活用の可能性を探った。

我々がオーバーヘッドが少ないツールを選ぶことには理由がある。 トレース対象はプロダクション環境でお客様が利用しているためサービス品質に影響を与えたくないこと。 また、我々が見舞われる障害はいつ発生するか分からないため常に必要な情報を収集したい。その際に、オーバーヘッドが大きければ継続してパフォーマンスの劣化が発生するためである。

オーバーヘッドが少なく、自由度の高いツール

上記として、以下の赤枠に示すツールからピックアップして動作の仕組みを理解するところから始める。

perf_tool_full

Image from: http://www.brendangregg.com/linuxperf.html

サービスのWebオペレーションエンジニアが Linux トレーシングに精通したエンジニアばかりで構成されることは稀であろう。本エントリでは、ほとんどのエンジニアが手軽に Linux のトレースを行って問題解決の範囲を拡大できるように体系化した知見に落とし込んでいくことを目標とする。

(*1) straceの動作の仕組みから分かるオーバヘッド

strace

strace(1) では、 ptrace(2) を使っておりシステムコールの解析中に解析対象のプロセスが瞬間的に停止を伴う実装となっているため、オーバーヘッドが大きいと考えられる。

2.トレース手法の整理

tools

既存のトレースツールには色々な種類があるが、それぞれどういう役割を持っているのだろうか? 本章では、その役割の種類を分類し全体像を掴む。

2.1.イベントの分類

トレースと言っても、何をトレースするかというと各所から発行されるイベントをトレースすることになる。

イベントは以下のように分類できる。

events

2.2.ツールの分類

Systemtap, eBPF, BCC, perf, kprobe, uprobe … 色々な単語が出てきた。それぞれのコンポーネントは何の役割があるのだろうか? まずは、以下の3つのレイヤに分類していく。

layer

筆者は、世の中にトレースツールやコンポーネントが多く存在していることで混乱していたがレイヤとして区切ることでそれぞれの立ち位置を理解すやすくなった。

3.トレース手法の仕組み

2章でトレース手法の全体像が把握できた。本章では、それぞれがどういう仕組で動作しているのかを理解する。

3.1.データソース

PMU (Performance Monitoring Units)

kprobe/uprobe

tracepoint

3.2.フレームワーク

Ftrace

perf_events

eBPF

eBPFの少し詳しい動きについては、2017/12/16に私が行った以下のプレゼンテーションの資料をご参照のこと。

3.3.ツール

perf

BCC (BPF Compiler Collection)

Systemtap

3.4.トレースツールの歴史

4.おわりに

当初は、多くのトレースツールを目の前にして混乱していたがこのエントリによってトレースツールの全体像と大まかな種類や簡単な動作原理を理解することができた。

トレースツールを選択することに関しては、以下のように考える。

今後について