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ページを読みましたが、まだあまり自信がありません。あなたが私が読むためのその他の指針があれば、それは素晴らしいことです。
私はオペレーティングシステムに関するいくつかの背景を持ち、システムコール、メモリ、仮想メモリ、スケジューリングなどについて理解しています。
これらを理解するには、POSIXシステムコールに精通する必要があります。これらは、ユーザー空間プログラムがカーネルと対話するために使用するインターフェースです。
lseek
、write
、close
、mmap
、munmap
およびfstat
はすべて システムコール およびlinuxマニュアルのセクション2に記載されています。
簡単に言うと、lseek
は、指定されたファイル記述子の内部ポインタを、SEEK_SET
(開始)、SEEK_CUR
(現在の位置)から始まり、2番目の引数が指す位置のバイトに移動します。またはSEEK_END
(終了)。同じ記述子に対する連続するread
およびwrite
呼び出しは、この位置からアクションを開始します。 lseek
は、すべての種類の記述子に対して実装されているわけではありません。ディスク上のファイルに対しては意味がありますが、ソケットやパイプに対しては意味がありません。
write
は、提供されたバッファをカーネルスペースにコピーし、実際に書き込まれたバイト数を返します。記述子の種類に応じて、カーネルはデータをディスクに書き込んだり、ネットワーク経由で送信したりします。これは、このバッファーをカーネルに転送する必要があるため、一般にコストのかかる操作です。
close
は、提供された記述子を閉じ、カーネル内のそれに関連するすべてのリソースが解放されます。各プロセスには同時に開く記述子の数に制限があるため、この制限に達しないように記述子を閉じる必要がある場合があることに注意してください。
mmap
は複雑なシステムコールであり、共有メモリを含む多くの目的で使用されます。ただし、一般的な使用法は、プロセスにより多くのメモリを割り当てることです。 malloc
およびcalloc
ライブラリ関数は通常、内部でそれを使用します。
munmap
はmmap
'pedされたメモリを解放します。
fstat
は、ファイルシステムがファイルについて保持しているさまざまな情報(サイズ、最終変更、権限など)を返します。
コマンドごとにマニュアルページがあり、man
とC関数の名前を入力して読むことができます。 man lseek
(apropos
も確認してください)。また、渡されたパラメーターの説明もあります。
ここに短い要約があります:
lseek
-ファイル記述子の読み取り/書き込みファイルオフセットの位置を変更しますwrite
-バッファからファイル記述子に書き込みますclose
-プロセスごとのオブジェクト参照テーブルから記述子を削除しますmmap
-メモリを割り当てるか、ファイルまたはデバイスをメモリにマップしますmunmap
-指定されたアドレス範囲のマッピングを削除しますfstat
-パスが指すファイルステータスを取得する単一/ランダムsyscalの解釈は、パフォーマンスの点では意味がないことに注意してください。これらのsyscallのパフォーマンスの重要性をテストするには、各syscallの時間、呼び出し、およびエラーをカウントして要約を報告できる-c
パラメーターを使用する必要があります。次に、最も時間がかかっているこれらについて詳しく読むことができます。
出力とstrace
パラメータの詳細については、 man strace
を確認してください。