問題タブ [systemtap]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
linux - mlockall() を呼び出した後、同じアドレスでマイナーなページフォールトが繰り返される
問題
アプリケーションでのマイナーなページフォールトの発生を減らしたりなくしたりしようとしている過程で、私は紛らわしい現象を発見しました。つまり、ページフォルトを防ぐために十分な措置を講じたと思っていたにもかかわらず、同じアドレスへの書き込みに対してマイナーなページフォルトを繰り返しトリガーしています。
バックグラウンド
hereのアドバイスに従って、mlockall
現在および将来のすべてのページをメモリにロックするように呼び出しました。
私の元のユースケース (かなり大きな配列が関係していました) では、こちらのアドバイスに従って、すべての要素 (または少なくともすべてのページ) に書き込むことにより、データを事前にフォールトしました。RT パッチを適用したカーネルを実行しているユーザーを対象としたアドバイスであることは理解していますが、書き込みを強制して COW を阻止し、ページングを要求するという一般的な考え方は引き続き適用できるはずです。
mlockall
マイナーなページ フォールトを防ぐために使用できると考えていました。マニュアル ページはメジャー フォールトが発生しないことを保証しているように見えますが、他のさまざまなリソース (上記など) では、マイナー ページ フォールトを防ぐためにも使用できると述べています。
カーネルのドキュメントもこれを示しているようです。たとえば、unevictable-lru.txtとpagemap.txtは、mlock()
'ed ページは不可避であるため、再利用には適していないと述べています。
それにもかかわらず、私はいくつかのマイナーなページフォールトを引き起こし続けました.
例
問題を説明するために、非常に簡素化された例を作成しました。
ここでは、同じアドレスに繰り返し書き込みます。cat /proc/[pid]/status | awk '{print $10}'
初期化が完了してから長い間、マイナーなページフォールトが発生し続けることは (たとえば を介して) 簡単にわかります。
pfaults.stp
に含まれているスクリプトの修正版*を実行してsystemtap-doc
、各ページ フォールトの時刻、フォールトをトリガーしたアドレス、フォールトをトリガーした命令のアドレス、メジャー/マイナー、読み取り/書き込みを記録しました。スタートアップ および からの最初の障害の後mlockall
、すべての障害は同一x
でした。
連続するページフォールトの間隔には、顕著なパターンが見られます。ある特定の実行では、間隔は秒単位でした:
2, 4, 4, 4.8, 8.16, 13.87, 23.588, 40.104, 60, 60, 60, 60, 60, 60, 60, 60, 60, ...
これは (ほぼ) 指数関数的なバックオフのようで、絶対的な上限は 1 分です。
分離された CPU で実行しても影響はありません。より高い優先順位で実行することもありません。ただし、リアルタイムの優先度で実行すると、ページフォールトがなくなります。
質問
- この動作は予期されたものですか?
1a. タイミングの説明は? - これを防ぐことは可能ですか?
バージョン
3.13.0-24-generic
カーネルと Systemtap のバージョンで Ubuntu 14.04 を実行しています2.3/0.156, Debian version 2.3-1ubuntu1 (trusty)
。追加のフラグなしでコンパイルされたコードgcc-4.8
。ただし、最適化レベルは問題ではないようです (asm volatile
ディレクティブがそのまま残っている場合。そうでない場合、書き込みは完全に最適化されます)。
stap
関連性があれば、詳細 (正確なスクリプト、元の出力など) を喜んで含めます。
*実際には、vm.pagefault
カーネルと systemtap の私の組み合わせでは、カーネルの関数に存在しなくなった変数を参照していたため、プローブが壊れていましたhandle_mm_fault
が、修正は簡単でした)
systemtap - systemtap で syscall ドキュメントを取得する方法
プローブ、関数ドキュメントについて
のドキュメントfindを読みました
と使用法:
probe::ioblock.end [probe::ioblock] (3stap) - ブロック I/O 転送が完了するたびに起動する probe::ioblock.request [probe::ioblock] (3stap) - 一般的なブロック I/O を作成するたびに起動する〇お願い
しかし、man example から syscall doucment を取得する方法
: syscall.write
document
c - Linux カーネルの特定の関数をベンチマークまたはトレースするにはどうすればよいですか?
ftrace() (またはその他のもの) を使用して、Linux カーネル内の特定のユーザー定義関数をトレースするにはどうすればよいですか? いくつかのマイクロベンチマークを作成して実行しようとしているので、特定の機能を実行するのに時間がかかるようにしたいと考えています。ドキュメントを(少なくともできる限り)読みましたが、正しい方向への一歩は素晴らしいでしょう。
私は ftrace() に傾倒していますが、Ubuntu 14.04 で動作させるのに問題があります。
linux - Systemtap スクリプトの「$location」を理解する方法は?
Systemtap スクリプト:
kfree_skb() のソースコードは次のとおりです。
知りたいのは、どこ$location
から来たのですか?との
関係は?ありがとうございました。$location
kfree_skb()
systemtap - systemtap プローブでシステムコールを実行できますか?
たとえば、与えられた
pwrite のプローブで preread を実行できますか?
ありがとう!
エルベン
linux - Linux カーネル空間での pread の同等性 (O_DIRECT を使用)
Linux カーネル空間にある systemtap プローブを使用しているため、通常の pread syscall を使用できません。カーネル空間に pread syscall と同等のものはありますか?
私の友人はこれを見つけました: http://lxr.free-electrons.com/source/fs/read_write.c?v=2.6.32#L433 しかし、私が含める必要があるヘッダファイルは何ですか?
ありがとう!
エルベン
linux - SystemTap スクリプトの奇妙な動作
ファイルごとのプロセス io サイズをカウントする単純な ST スクリプトがあります。
私が実行すると、次のstap test.stp -c 'cat test.stp'
ようになります:
これはほぼ正しいです。しかし、私が実行するstap test.stp -c 'cat test.stp > /dev/null'
と、何か奇妙なことが起こります:
test.stp opened as 3
2 番目のケースで表示されないのはなぜ ですか?
私はstraceでいくつかのテストを行います:
1) strace -e open -o trace cat test.stp
:
2) strace -e open -o trace cat test.stp > /dev/null
:
区別なし。
linux-kernel - カーネル 3.1 でのパフォーマンス/システム タップのインストールに関する問題
カーネル 3.1 と glibc 2.14 でカスタム Linux を使用しています。perf/systemtap をインストールしようとすると、glibc2.15 が要求されますが、依存関係がリンクされているため、既存の glibc2.14 を削除できません。 perf/system tap をインストールする方法はありますか。自分自身を明確に説明できることを願っています。
詳細: perf には glibc2.15 を必要とする libnewt と libslang が必要なため、デッドロックに陥っています。