この記事はCfP Advent Calendar 2019の9日目です!
1日勘違いしていました!
カンファレンスではないですが「Rubyアソシエーション 開発助成金2019」への応募内容をここで公開します。って、していいものなのでしょうか...「アウトプットを期待」とのことだったのできっと大丈夫!
現在、YARV開発者の笹田耕一さんをメンターに迎えて、RubyでLinuxの高機能トレス技術 eBPF のライブラリである BCC を使えるようにすべく移植実装と、+アルファの考え中です。それが RbBCC プロジェクトです。
将来は iovisor プロジェクトに寄贈したいと考えてもいるんですが、まずは完成度を上げねばという感じです...。
で、このRubyアソシエーション 開発助成、毎年なかなか募集に苦労している印象があり、一つはどういう感じで出せばいいかという情報が少ないのはあるのかな〜と思っております。次回の応募数増に寄与すべく、一番肝であろう「プロジェクトの詳細」の応募時の内容をここに公開します。
プロジェクト名
RbBCC - LinuxにおけるeBPF等のトレーシング技術をCRubyから利用する環境の整備
プロジェクトの詳細
背景
パブリッククラウドの普及、コンテナを筆頭としたクラウドネイティブ技術など、Webを中心に新世代のサーバインフラ技術の台頭が昨今著しい状況です。その中で、Linux OSやプロセス単位のパフォーマンス測定やデバッグ、トレーシングなど、低レイヤでの技術にも新しい動きがあり、再び注目されています。
eBPFはLinuxにおける、低レイヤのデバッグやトレーシングを行うための重要な技術です。eBPFはLinuxバージョン3.15から導入されました。eBPFを利用するとカーネル組み込みのtracepointやカーネル関数自体の追跡、システムコール単位での呼び出し・リターンの追跡、ユーザランド関数のカーネルでの追跡、ネットワークパケットのダンプやフィルタリング等が既存の技術(straceやnetfilterなど)より高速かつ低コスト、安全に行えるようになります。
しかしeBPFの使い方として、まずバイトコードを作成し、それをbpf(2)などのシステムコールに直接渡さなければならないため、利用の敷居は非常に高いものでした。
そこでBCC[*]と呼ばれる、eBPFのバイトコードを隠蔽し、C言語とPython等の軽量言語の組み合わせで扱えるようにしたライブラリが登場しました。このBCCはLinux 4.1から利用でき、現在BCCを利用した数多くの柔軟かつ高速なトレーシングツールが公開されています。
今回のプロジェクトである「RbBCC」は、このBCCの成果をRubyからも利用し、なおかつRubyのコードのみでLinuxカーネルやプロセスのトレーシングツールの開発を可能にすることをゴールとします。
既存のツールとの違い、狙い等
まず、既存実装のBCCのアーキテクチャから説明します。BCCはC++で作成されたlibbccと、libbccをffiで利用するPython/Luaの実装に分かれています。実際にカーネルとシステムコール等を介してやり取りをする箇所をlibbccが行い、Python/Luaのレイヤーではそのほかに必要な文字列操作や、計測結果の集計や表示を行う、という役割分担があります。
現在libbccを利用したライブラリとして、公式にPython、Lua、Go言語が存在しますが、Rubyのものは存在しません。本プロジェクトでは基本的には先述した「Python/Luaのレイヤー」をRubyで置き換える実装を行います。libbccについてはRubyのfiddleライブラリを経由してアクセスし、Rubyを利用してトレーシング機能を使うための高いレイヤーのAPIを整備します。
また、BCCは現在軽量言語のみで利用することは難しく、カーネル内部で動く関数などはC言語で書かないとなりません。RbBCCではRubyからCへのトランスパイラを作成し、最低でも基本的なユースケースではCのコードを書かずともRubyのみ理解すればトレーシングの機能が利用可能になるような実装を考えています。
加えてRubyであることにより、既存のRubyのWeb関連のエコシステムと容易に接続が可能で、Webベースのツールであったり、Webアプリケーションの測定に関して非常に強みを持つと考えています。
まとめ
サーバインフラの進化や複雑化に伴い、トレーシング技術が再注目されています。RbBCCを実用化することで、トレーシングの世界にRubyの生産性を適用することができ、多くの開発者やインフラ運用者が手軽にLinux自体やアプリケーションのパフォーマンス計測、デバッグ、監査やトレースを行ったり、そのためのWebベース等のツールを開発できるようになるでしょう。
応募してみての感想
として、「なんか自分の問題意識だな...」という感じでも、それを整理して出してみると、審査員の方の方でRubyへの貢献についてはアイデアを出していただけるのだなあ、という印象を持っています。なので、多少スコープから外れていても出してみるのがいいんじゃないかと思います。