まさなみブログ

主にweb系開発の記事を適当に書いてます。

 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とかでローカルに持ってくる
ローカルにdumpを入れる(Windows

事前作業としてテーブルを作成しておく 配置先はC:\tmp配下

mysql isubata -u root --default-character-set=utf8 -p < C:\tmp\isubata_init.dump
※ローカルの初期rootパスワードはmypasswordだけど、たぶん自分で設定していると思うから自分のやつ打ってね

サービスを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回り改善

slow.log確認
pt-query-digest /var/lib/mysql/mysql-slow.log
インデックス確認、作成
#テーブル名、カラム名などは適宜置き換えてください。
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