ISUCON4 予選でスコア30万点以上を出す方法 #isucon
山形組提出コード
https://github.com/nihen/isucon4_yosen_yamagatagumi/tree/master
- 1プロセス
- オンメモリ
- nginx embeded perl
./benchmarkerv2 bench --workload 8 type:score success:290030 fail:0 score:62651 GOGC=off ./benchmarkerv2 bench --workload 8 type:score success:452310 fail:0 score:97702
提出後のチューニング
https://github.com/nihen/isucon4_yosen_yamagatagumi/tree/more_optimize
- indexの完全静的出力
./benchmarkerv2 bench --workload 8 type:score success:299330 fail:0 score:64659 GOGC=off ./benchmarkerv2 bench --workload 8 type:score success:455210 fail:0 score:98329
静的ファイルのJS出力
https://github.com/nihen/isucon4_yosen_yamagatagumi/tree/css_remove
- 静的ファイルのJS出力
./benchmarkerv2 bench --workload 16 type:score success:235064 fail:4 score:235064 GOGC=off ./benchmarkerv2 bench --workload 16 type:score success:308936 fail:0 score:308936
一応これで自分の中では予選問題を成仏させることができました。
追記(2014/10/02 01:00)
もう少し供養を続けてみました。
HTML-minify
https://github.com/nihen/isucon4_yosen_yamagatagumi/tree/html_minify
- HTML-minify
GOGC=off ./benchmarkerv2 bench --workload 32 type:score success:339802 fail:0 score:339802
Shift_JIS化
https://github.com/nihen/isucon4_yosen_yamagatagumi/tree/shiftjis
GOGC=off ./benchmarkerv2 bench --workload 32 type:score success:194522 fail:0 score:194522
Shift_JISにすることによってすこし容量が減るので(index.htmlで2055bytes->1832bytes)若干アップするかとおもったら大幅ダウンするという学び。ベンチマーク側の問題な気はするけど。
追記(2014/10/02 01:40)
workload 128
https://github.com/nihen/isucon4_yosen_yamagatagumi/tree/html_minify
ここまでくるとさらにworkloadはあげられるようで
GOGC=off ./benchmarkerv2 bench --workload 128 type:score success:346578 fail:0 score:346578
永続化の/reportまでの遅延
https://github.com/nihen/isucon4_yosen_yamagatagumi/tree/delay_write
レギュレーション微妙ではあるけどfujiwara組さんもやられてた技ですね。
[2014/10/02 13:28 追記]fujiwara組さんが実施されていたのは、/reportの出力のためのデータの作成の遅延であって、ここで自分がやっているような永続化自体の遅延ではありませんでした。訂正いたします。
参考
#isucon 2014にfujiwara組で出場して予選2日目暫定1位を取りました - beatsync.net
#isucon 4にfujiwara組として参加しました - handlename's blog
#isucon 4に参加して予選2日目暫定1位になりました - 酒日記 はてな支店
[/追記ここまで]
GOGC=off ./benchmarkerv2 bench --workload 128 type:score success:358384 fail:0 score:358384
ちなみにGOGC=offということもあり、ここまでくるとbenchmarkerは終了時には7G超のメモリを確保することになってます。
追記(2014/10/02 02:20)
合掌
TCP Fast Open
https://github.com/nihen/isucon4_yosen_yamagatagumi/tree/delay_write
sudo sh -c "echo 3 > /proc/sys/net/ipv4/tcp_fastopen" GOGC=off ./benchmarkerv2 bench --workload 256 type:score success:352112 fail:0 score:352112 sudo sh -c "echo 0x707 > /proc/sys/net/ipv4/tcp_fastopen" GOGC=off ./benchmarkerv2 bench --workload 256 type:score success:363856 fail:0 score:363856
追記(2014/10/07 01:24)
これが限界だと思ったときが限界なんだと悟りました。
HTML全体をjsで組み立て
HTML全体をjsに逃がしてしまえばベンチマーカーが取得するhtmlの容量を大幅に縮めつつ、jsを解釈するブラウザの見た目は維持できてしまう。ただし一部の項目はベンチマーカーがjs解釈をしないままにセレクタでチェックを行うため、非常にいびつながらも一部エレメントは埋め込んでおく必要がある。このあたりのチェックの仕様からいってもレギュレーションにおける変えてはいけないDOMというのはjs実行前と解釈するのがやはり自然だとは思いますね。
https://github.com/nihen/isucon4_yosen_yamagatagumi/tree/script_html
GOGC=off ./benchmarkerv2 bench --workload 256 type:score success:496764 fail:0 score:496764
うーん、惜しい。さらに50万超えるためのアイデアを思いつくかなぁ。
追記(2014/10/07 01:36)
おっとと、上記はTCP Fast Openを有効にして実行してなかった。0x707で有効にすると50万をギリギリ超えました。もう少しでフリーザ様の戦闘力に追いつける。
sudo sh -c "echo 0x707 > /proc/sys/net/ipv4/tcp_fastopen" GOGC=off ./benchmarkerv2 bench --workload 256 type:score success:500070 fail:0 score:500070