読者です 読者をやめる 読者になる 読者になる

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