ISUCON6で惨敗したけどlibpcre3のGoバインディングは動いた #isucon

ISUCON6に参加して惨敗しました。

チーム「AppArmorGo」という名前で今年も @matsuu @ishikawa84g ご両人と共に参戦。 去年はバグ情報でGoを避けて惨敗したので今年はGoでいこう、と事前に話して準備万端。 結果的にGoで突破できませんでした。

結構練習はできていたのだけどダメでした。。。 この夏に双子が産まれてとにかく時間がなかったのだけど、ヨメが義父(私の父)にかけあって子守参加週末に時間を作ってくれたのでひとり喫茶店で練習したり。 前回は惨敗で家庭不和とか体調不良で大変だったので会場(会社)近くに前泊しました。 お陰で体調バッチリで臨むことができました。ダメだったけど。

流れは チームメイトmatsuuさんが書いてくれてる通り でした。 strings.Replacer にはたどり着けず。最終スコアは24000。ラスト90分でperlに乗り換えて出したスコアとしてはまあまあでした。

sshrcを使ってスムーズに環境構築できたし、 とにかく予習バッチリだったのでAzure・プロビジョニングまわりはノートラブルだったのがよかった。

libpcre3を使ったGolangのregexp実装について

結論から言うと martinolsen/go-pcre: PCRE bindings for go で実装できました。と思います。

時間内では以下のエラーが出て解決できなかったんですが、事後に解決しました。

regular expression is too largegoroutine 8 [running]:

largegoroutine って出てきたのでこれでぐぐってたんですが、これ実は regular expression is too largegoroutine がくっついただけだったんですね。なんだもよー、という感じ。

んで、このエラーメッセージからもわかるとおり、単に適用するだけじゃダメです。 --with-link-size=3 というconfigureオプションをつけてlibpcre3をリビルドする必要があります。

手順は以下の通り。 なお sudo コマンドで libpcre.so.3 が必要なので、最後の rmln あたりはrootになっておかないと詰みます。

sudo apt-get install devscripts
sudo apt-get build-dep libpcre3

sudo apt-get source libpcre3
cd pcre3-8.38/
sudo vim debian/rules # configureオプションに --with-link-size=3 を追加
sudo dpkg-buildpackage -r -uc -b
sudo cp -a .libs/libpcre.so.3.13.2 /lib/x86_64-linux-gnu/libpcre.so.3.13.2a
sudo su -
rm /lib/x86_64-linux-gnu/libpcre.so.3
ln -s /lib/x86_64-linux-gnu/libpcre.so.3.13.2a /lib/x86_64-linux-gnu/libpcre.so.3

でも肝心の ReplaceAllStringFunc はあんまり速くならなかったみたいで、このあたりはまだ検証が必要そう。

まとめ

運営ありがとうございました。お疲れさまでした。 来年もがんばりたい。

Event 

See also