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万点超え!!
最終的な設定は以下
cf. チーム「椅子子」でISUCON4予選で2日目5位でした / の erb を置き換えて1万伸びている?うーん
cf. sprintf_vs_gsub_vs_erb_vs_erubis.rb. sprintf に変えると7倍速くなる可能性。
cf. sinatra_vs_rack 生 rack にすると 1.7 倍速くなる可能性。
同じ設定で 33,500。届かず。
ただし、golang だと unix domain socket を使おうとするとアプリにそれなりの改変を加えないといけないので、local port で通信するように nginx.conf を変更しているという事情がある。
そのっつ (SEO Naotoshi)@sonots同じ設定で golang だと 33500 だった。 / “ISUCON4 予選でアプリケーションを変更せずに予選通過ラインを突破するの術 - Hateburo: kazeburo hatenablog” http://t.co/UXvFF5H9x0
2014/10/15 02:28:59
GOMAXPROCS=4 を env.sh に書いて 36,279 にアップ。まだ届かず。
そのっつ (SEO Naotoshi)@sonots同じ設定で golang だと GOMAXPROCS=4 で 36279 だった。 / “ISUCON4 予選でアプリケーションを変更せずに予選通過ラインを突破するの術 - Hateburo: kazeburo hatenablog” http://t.co/UXvFF5H9x0
2014/10/15 02:36:48
そのっつ (SEO Naotoshi)@sonots@kazeburo あとで試してみます
2014/10/15 10:26:53
そのっつ (SEO Naotoshi)@sonots@methane あー、忘れてました。あとでやってみます。
2014/10/15 10:19:58
kazeburo さんと metane さんに助言をもらって設定変更して 4万点超え!!
そのっつ (SEO Naotoshi)@sonotsgolang でもアプリ改変なしで nginx upstream keepalive に変えて GOMAXPROCS=4 MARTINI_ENV=production で 41024 イケた。 / “ISUCON4 予選でアプリケ…” http://t.co/UXvFF5H9x0
2014/10/15 11:07:10
最終的な設定は以下
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 倍速くなる可能性。