最近36協定だ、ワークライフバランスだゴシャゴシャ言うけど一回休みなく仕事したらどういう境地に至るのか確かめてもみたい。大抵ゴシャゴシャ言うやつは月100すら体験してないと思うの。 https://t.co/GTY68NZZ1W
— Y平 (@yhei_hei) 2016年6月21日
調子こいてすまなかった。ここ二日、性能測定が佳境を迎え、どんどん溢れる発注にない新規依頼、やってもやっても満足しないお客様、諸々の事情で2日ほど深夜残業をしたわけだが死んだ。何がどういう境地に至るのか確かめてみたいだ。もう境地きたわ。すぐにギリギリきたわ。ほんと定時退社できる状態って素晴らしい。
んで、佳境中の佳境の性能測定だが、なんか思った通り、性能測定の結果ざっくり遅いところがわかったら次はどこが遅いのかはっきりさせろと依頼。そんなの発注にないでしょ? 測定して終わりという話では? まあ、計画書を鑑みれば、すげえぼやかして書いてあるけど、広義ではボトルネック分析もやれとも読み取れる。発注時に曖昧に言って状況によって依頼をどんどんアップデートしていくシステム。要するに当初の依頼にはなかったものでもお金の足りる限り限界ギリギリまで依頼をこなせという依頼。ソフトウェアあるある。やりますよ。
そんで厄介なことに性能測定してた対象がゴリゴリのオープンソースだったため死んだ。オープンソースといえば昔AndroidのFramework担当だったけれどもあの時もソース読んでもろくに分からないまま終わった。あの時できなかったことが今になって? 成長したからできる? と思いきやまったくできなかった。3年前できなかったことが今できるとは限らない。APIの初めのあたりで処理がどこに行ったかわからなくなった。テンプレートやらtypedefやら無名関数やら訳の分からない仮想関数やらもう分かりやすくしようとして逆に分かりにくくなってるあれで死んだ。無理。これ1年あっても全貌分からない自信ある。オープンソースだから当然ドキュメントなし。みなまで言うな。
ソースコード解析を早々に断念しツールに頼ることにした。ubuntuではメジャーなプロファイルツールのperfを使った。したらあれよ。特定の関数呼び出しの後、TCPスタックに出て行くまでのスタックトレース取れた。信じらんないから。dlopenのダイナミックロード先も当然のようにスタック取れてるし、30kstepあるソースの全関数にprintf入れようと思ってたのがバカみたい。平たく言うと、自分のプログラムからOSのよくわからない関数までの道筋が明確に見えた。しかもどこが処理速度重いかパーセンテージで出るんだよ。神か。
ということでperfを使うとよくわからないオープンソースもスタックが取れるから、プロファイルだけじゃなくてトレースツールとしても役に立つよという話。仕事のお話ばかりでつまんない。