web-dev-qa-db-ja.com

strace出力を解釈する方法は?

Straceを使用しているアプリケーションのパフォーマンスをプロファイルする必要があります。ただし、straceが発行するさまざまなシステムコールを解釈する方法がわかりません。それらのいくつかの例を以下に示します。

(A) lseek(3, 1600, SEEK_SET)                = 1600
(B) write(3, "G_DATA    300        0          "..., 800) = 800
(C) close(3)                                = 0
(D) mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b600b179000
(E) munmap(0x2b600b179000, 4096)            = 0
(F) fstat(3, {st_mode=S_IFREG|0644, st_size=1600, ...}) = 0

(A)から(F)までのこれらの行がI/O、転送されるデータ、パフォーマンスの重要性などに関して本当に何を意味するのかを誰かが簡単な英語で簡単に説明できれば幸いです。

私はstraceのmanページを読みましたが、まだあまり自信がありません。あなたが私が読むためのその他の指針があれば、それは素晴らしいことです。

私はオペレーティングシステムに関するいくつかの背景を持ち、システムコール、メモリ、仮想メモリ、スケジューリングなどについて理解しています。

28
mkc

これらを理解するには、POSIXシステムコールに精通する必要があります。これらは、ユーザー空間プログラムがカーネルと対話するために使用するインターフェースです。

lseekwriteclosemmapmunmapおよびfstatはすべて システムコール およびlinuxマニュアルのセクション2に記載されています。

簡単に言うと、lseekは、指定されたファイル記述子の内部ポインタを、SEEK_SET(開始)、SEEK_CUR(現在の位置)から始まり、2番目の引数が指す位置のバイトに移動します。またはSEEK_END(終了)。同じ記述子に対する連続するreadおよびwrite呼び出しは、この位置からアクションを開始します。 lseekは、すべての種類の記述子に対して実装されているわけではありません。ディスク上のファイルに対しては意味がありますが、ソケットやパイプに対しては意味がありません。

writeは、提供されたバッファをカーネルスペースにコピーし、実際に書き込まれたバイト数を返します。記述子の種類に応じて、カーネルはデータをディスクに書き込んだり、ネットワーク経由で送信したりします。これは、このバッファーをカーネルに転送する必要があるため、一般にコストのかかる操作です。

closeは、提供された記述子を閉じ、カーネル内のそれに関連するすべてのリソースが解放されます。各プロセスには同時に開く記述子の数に制限があるため、この制限に達しないように記述子を閉じる必要がある場合があることに注意してください。

mmapは複雑なシステムコールであり、共有メモリを含む多くの目的で使用されます。ただし、一般的な使用法は、プロセスにより多くのメモリを割り当てることです。 mallocおよびcallocライブラリ関数は通常、内部でそれを使用します。

munmapmmap 'pedされたメモリを解放します。

fstatは、ファイルシステムがファイルについて保持しているさまざまな情報(サイズ、最終変更、権限など)を返します。

22

コマンドごとにマニュアルページがあり、manとC関数の名前を入力して読むことができます。 man lseekaproposも確認してください)。また、渡されたパラメーターの説明もあります。

ここに短い要約があります:

  • lseek-ファイル記述子の読み取り/書き込みファイルオフセットの位置を変更します
  • write-バッファからファイル記述子に書き込みます
  • close-プロセスごとのオブジェクト参照テーブルから記述子を削除します
  • mmap-メモリを割り当てるか、ファイルまたはデバイスをメモリにマップします
  • munmap-指定されたアドレス範囲のマッピングを削除します
  • fstat-パスが指すファイルステータスを取得する

単一/ランダムsyscalの解釈は、パフォーマンスの点では意味がないことに注意してください。これらのsyscallのパフォーマンスの重要性をテストするには、各syscallの時間、呼び出し、およびエラーをカウントして要約を報告できる-cパラメーターを使用する必要があります。次に、最も時間がかかっているこれらについて詳しく読むことができます。

出力とstraceパラメータの詳細については、 man strace を確認してください。

参照: シェルでstraceをプレーンテキストに解析する方法?

3
kenorb