カテゴリー
技術

Debian の perf を高速化するパッチと、そのGPL的な背景

Cargo の flamegraph ツールがDebian の perf のせいでとても遅いという話。

Cargo flamegraph sample

perf コマンドがプロファイルデータを解析する際に libbfd をリンクすればずっと高速になるのですが、Debian のポリシーでライセンスに違反するため libbfd をリンクすることはできないそうです。

[修正] コメントでの指摘を受け修正しました

perf のライセンスが GPL バージョン2、libbfd のライセンスが GPL バージョン3+ であり、これら二つのプロジェクトを合法的にリンクさせる方法がないそう。

Debian の Makefile では、わざわざ生成された perf コマンドが libbfd をリンクして「いない」ことをチェックするようになっているのですね。

そんな訳で、Debian の perf は dso 一つごとに addr2line コマンドをパイプで呼び出す(そして、毎回サブプロセスは終了する)方式となっています。

しかし、大量の perf 呼び出しを行う flamegraph を作ろうとした @leastfixedpoint さんは、いつまでも帰ってこない perf コマンドに業を煮やし、libbfd をリンクさせない範囲での高速化を考えました。

このパッチでは、addr2line を別プロセスとして起動させたままにしておき、dso をデータとして送り付け結果を受け取っても、addr2line プロセスを終了させないことで、とあるデータ量に対して68倍速く処理が終わるようにできたそうです。

対象のデータ量によっては気にならない程度の速度差なのかもしれませんが、同じようにここの処理速度で困ってる人もいるんじゃないでしょうかね。

via Hacker News

「Debian の perf を高速化するパッチと、そのGPL的な背景」への4件の返信

“Debian のポリシーで” これは明確に間違いです。ポリシーなどではありません。ライセンスとしてコンフリクトするのでビルドしたものを配布したらライセンス違反となります。

ライセンス違反を避けるポリシー、のつもりでしたが、たしかにおっしゃる通りでライセンス違反を放置するポリシーのディストリビューションというのもないかもしれないですね。

GPL的な背景、というタイトルについてもよくわかりません。GPLであろうがなかろうが、混ぜると問題のあるライセンスのソースを混ぜてビルドしてバイナリ配布したらまずいのでは?それともこれが「GPL特有である」という何かがあるのでしょうか。

ありがとうございます。このあたりは自分には難しくて勉強になります。同じ名前でバージョンが上がったライセンスのものとリンクすると違反になるというのはわかりにくい仕組みだなと思いましたが、これはGPLに固有の話ではないのではということですね。特有とは書いていませんがGPLでしか起こらないように受け止められると問題があるということを懸念されているということですね。今回の件はGPLのルールに抵触しないよう回避するコードとしてご紹介しようとしたのでこう書いてしまったのですが、どう直すのがよいでしょう。

コメントは受け付けていません。