Linux Instrumentationの今後?

http://lwn.net/Articles/370715/rssで、LinusがNAKしてマージが難航しているutraceですが、その後の展開をみると結構おもしろいことになっています。
Linusが言うことにも一理あるわけで、utraceだけ見ればptraceしか普通のユーザは使わないから、utraceみたいなレイヤは不要だということになります。確かに個人的な経験からしても、LinusあるいはLinuxメンテナたちは、汎用的になるからという理由だけで新しいレイヤを付け加えるという意見には賛同しないでしょう。私見では、Linuxの場合、大体次のシナリオを通ると、汎用レイヤの実装がすんなり行くのではないかと思います。

  1. 一般化できる可能性があるが、特定の目的に特化した機能が一つ入る。
  2. その機能のコードの一部を複製したような(機能的に重複する)別の目的の機能が入る。
  3. 時として、さらに同じような機能が追加される。
  4. それらを統合してメンテナンスを楽にしよう、ついでに将来を考えて汎用的にしようということでレイヤ分けをする。

今回の場合、utraceはptraceが汚すぎ、拡張性がないからという理由で開発されているのですが、肝心のutraceのユーザがptraceしかない状態です。他の有効な使い道を示せていないため、Linusが難色を示すのも頷けます。でもuprobeとSystemtapがあるじゃないか、という意見もありますが、uprobeについては今後の方向が議論されているものの、残念ながらいまだsystemtapLinux開発者たちに人気がないというのが現状です。systemtapの一部に、カーネルモジュールのコードが含まれており、そのコードがLinuxカーネルの開発ツリーと同期していないのがその理由です。つまり、オープンソースにもかかわらず、プロプラエタリなドライバと同じ問題(カーネルAPIが変更されるのについていくことができない)を抱えていると認識されています。機能的には優れた部分がたくさんあり、現在のところDtraceのような汎用Instrumentationに使えるツールとしては、これしかないのですが(用途を選べば他にも選択肢はありますが、LTTngとか)。

それで、その後perf/ftraceのメンテナのIngo Molnarが議論に参加してくるのですが、相変わらず興味深いアイデアを出しています。

Right now we support simple C-syntax expressions like:

   perf record -R -f -e irq:irq_handler_entry --filter 'irq==18 || irq==19'

More could be done - a simple C-like set of function perhaps - some minimal 
per probe local variable state, etc. (perhaps even looping as well, with a 
limit on number of predicament executions per filter invocation.)

(適当に意訳)今のところフィルタルールは'irq==18 || irq==19'みたいな簡単なものしかサポートしていないが、これをもっと拡張して、Cの関数みたいな機能を持たせたい。多分ループも使えるようにできる。

  IMHO that would be a superior concept for security modules too: there's no 
  reason why all the current somewhat opaque security hooks couldnt be 
  expressed in terms of more generic filter expressions, via a facility that
  can be used both for security and for instrumentation. That's all what 
  SELinux boils down to in the end: user-space injected policy rules. 

(超適当に意訳)この機能をセキュリティフックに当てはめれば、セキュリティフックの動作をコントロールするプログラムを書いてSELinuxを置き換えられるだろう。

今後Linuxでも、DTraceみたくバイトコード(あるいはインタプリタ)をサポートする方向にいくかもしれません。さらにその上で、それを使ってSELinuxを置き換えたりするのかもしれません。そんなに簡単には行かないと思いますが、できるなら個人的にはiptablesまわりも置き換えてほしいですね;-)。