ISUCON4 予選でアプリケーションを変更せずに予選通過ラインを突破するの術 - Hateburo: kazeburo hatenablog が公開されたので、golang でも4万点超えできるかやってみた記録。

同じ設定で 
33,500。届かず。
ただし、golang だと unix domain socket を使おうとするとアプリにそれなりの改変を加えないといけないので、local port で通信するように nginx.conf を変更しているという事情がある。


 GOMAXPROCS=4 を env.sh に書いて 36,279 にアップ。まだ届かず。




kazeburo さんと metane さんに助言をもらって設定変更して 4万点超え!!

最終的な設定は以下

init.sh に以下を追加

$ cat init.sh 
cat <<'EOF' | mysql -h ${myhost} -P ${myport} -u ${myuser} ${mydb}
alter table login_log add index ip (ip), add index user_id (user_id);
EOF

/etc/sysctl.conf に以下を追加。

$ cat /etc/sysctl.conf
net.ipv4.tcp_max_tw_buckets = 2000000
net.ipv4.ip_local_port_range = 10000 65000
net.core.somaxconn = 32768
net.core.netdev_max_backlog = 8192
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 10
sudo /sbin/sysctl -p

env.sh に以下を追加

GOMAXPROCS=4
MARTINI_ENV=production

nginx.conf を以下のように変更.

$ cat /etc/nginx/nginx.conf
worker_processes  1;

events {
  worker_connections  10000;
}

http {
  include     mime.types;
  access_log  off;
  sendfile    on;
  tcp_nopush  on;
  tcp_nodelay on;
  etag        off;
  upstream app {
    server 127.0.0.1:8080;
    keepalive 16;
  }

  server {
    location / {
      proxy_http_version 1.1;
      proxy_set_header Connection "";
      proxy_pass http://app;
    }
    location ~ ^/(stylesheets|images)/ {
      open_file_cache max=100;
      root /home/isucon/webapp/public;
    }
  }
}

/etc/my.conf の設定

$ cat /etc/my.cnf
innodb_buffer_pool_size = 1G
innodb_flush_log_at_trx_commit = 0
innodb_flush_method=O_DIRECT

再起動して適用

$ sudo service mysqld restart
$ sudo /usr/bin/supervisorctl reload
$ sudo service nginx restart
なお、ruby の場合、27,327 だった。erb が遅すぎるので sprintf に置き換えればもっと伸びると思うが、それ普通にアプリを改変している。あとは sinatra を生 rack にするとか。後記: sprintf におきかえてみたが 5,000しか伸びなかった。後記: RACK_ENV=production でアプリ改変なしで4万超えた!

cf. チーム「椅子子」でISUCON4予選で2日目5位でした  / の erb を置き換えて1万伸びている?うーん
cf. sprintf_vs_gsub_vs_erb_vs_erubis.rb. sprintf に変えると7倍速くなる可能性。
cf. sinatra_vs_rack  生 rack にすると 1.7 倍速くなる可能性。