isucon手順まとめ
isucon9に出場し予選落ちしました。
isucon7の問題を多少練習したので(isucon8もちょっと)、チーム内のwikiが消えても大丈夫なようその時の手順をメモします。
自分用なので雑。
初期設定
alp 導入
#ダウンロード wget https://github.com/tkuchiki/alp/releases/download/v0.3.1/alp_linux_amd64.zip unzip alp_linux_amd64.zip #インストール sudo install ./alp /usr/local/bin #nginxの設定ファイルを修正 sudo vim /etc/nginx/nginx.conf #設定ファイルのhttp {の部分に以下の内容を追加します。 http { log_format ltsv "time:$time_local" "\thost:$remote_addr" "\tforwardedfor:$http_x_forwarded_for" "\treq:$request" "\tmethod:$request_method" "\turi:$request_uri" "\tstatus:$status" "\tsize:$body_bytes_sent" "\treferer:$http_referer" "\tua:$http_user_agent" "\treqtime:$request_time" "\truntime:$upstream_http_x_runtime" "\tapptime:$upstream_response_time" "\tcache:$upstream_http_x_cache" "\tvhost:$host"; access_log /var/log/nginx/access.log ltsv; } #元のアクセスログを削除し、リロード sudo rm /var/log/nginx/access.log && sudo systemctl reload nginx #ベンチ実行 /home/isucon/torb/bench/bin/bench -data=/home/isucon/torb/bench/data -remotes=localhost -output=result.json #alp確認 alp -f /var/log/nginx/access.log alp --sum -f /var/log/nginx/access.log
netdata インストール (使わんかったけど一応)
#ワンライナーで起動までしてくれる。 bash <(curl -Ss https://my-netdata.io/kickstart.sh) all --dont-wait #firewall ポート穴あけ firewall-cmd --zone=public --add-port=19999/tcp --permanent systemctl reload firewalld.service #ブラウザで確認 http://127.0.0.1:19999/ #停止 systemctl stop netdata #起動 systemctl start netdata
slow-log出力
MYSQL系の設定ファイルである/etc/my.cnfに以下のように設定を追加する
[mysqld] # 以下の3行を追加する slow_query_log slow_query_log_file = mysql-slow.log long_query_time = 0.5 このように設定すると、/var/lib/mysql配下にmysql-slow.logが出力されるようになるはず サービスの再起動を忘れずにね systemctl restart mariadb
pt-query-digestのインストール
以下のコマンドでインストールできる! #cent0s yum install http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm yum install percona-toolkit #ubuntu wget https://www.percona.com/downloads/percona-toolkit/3.0.10/binary/debian/xenial/x86_64/percona-toolkit_3.0.10-1.xenial_amd64.deb sudo apt-get install gdebi sudo gdebi percona-toolkit_3.0.10-1.xenial_amd64.deb あとは上記で出力したスロークエリログを解析する pt-query-digest /var/lib/mysql/mysql-slow.log
mysql ダンプ
サーバ内の初期データをdumpにする
以下のコマンドでisubataテーブルだけを対象にdumpを作成する mysqldump --single-transaction -u isucon -p isubata > /tmp/isubata_init.dump 出力したdumpを適当にWinSCPとかでローカルに持ってくる
サービスをPythonに変更する
# サービスを停止する systemctl stop torb.perl.service # サーバ起動時に起動するサービスから除外する systemctl disable torb.perl.service # サービスを開始する # sudo systemctl start torb.go.service sudo systemctl start torb.python.service systemctl enable torb.python.service
DB回り改善
インデックス確認、作成
#テーブル名、カラム名などは適宜置き換えてください。 mysql>explain SELECT COUNT(*) as cnt FROM message WHERE channel_id = 10 #type が ALL/indexだと遅い。 #インデックス追加 ※カラムの順番重要 mysql>ALTER TABLE message ADD INDEX index_name(channel_id, id); #インデックス削除※間違った時用 mysql>ALTER TABLE message DROP INDEX index_name; https://qiita.com/katsukii/items/3409e3c3c96580d37c2b http://tech.aainc.co.jp/archives/4634
外部mySQLへの接続
#mysqlのデフォルトポート3306の通信を許可する sudo ufw allow 3306 ※firewallが無効になっていたら無視。 mysqld.cnfの編集 sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf #bind-addressをコメントアウトする。 bind-address = 127.0.0.1 #rootユーザはどのIPからもアクセス可能に mysql> grant all privileges on [データベース名].* to root@"%" identified by 'パスワード' with grant option #外部mySQLへの接続が確認できたら、app側のsqlへの接続設定も変更する。
nginx周り改善
#ヘッダーへCache-Control追加 #/etc/nginx/sites-available/default server{ add_header Cache-Control public; } https://qiita.com/syou007/items/3e2d410bbe65a364b603 #ロードバランサ振り分け処理 #/etc/nginx/nginx.conf 追記 http { upstream degumainux.com { #ip_hash; #least_conn; server [ip]:[port]; server [ip]:[port]; } server { location / { proxy_set_header Host $http_host; proxy_pass http://degumainux.com; } } }
カーネル回り
#somaxconn数変更 #確認 sysctl net.core.somaxconn #somaxconn書き換え(一時的) sysctl -w net.core.somaxconn=1024 #somaxconn書き換え(永続化) #/etc/sysctl.confに追加 net.core.somaxconn = 1024 #リロード sysctl -p http://tetsuyai.hatenablog.com/entry/20111220/1324466655