ISUCONカンニングペーパー
【10/23追記】
残念ながら本選に出場することはできませんでした。
インデックス貼ったりN+1を直したりはできたのでせめて最後にスコアを残したかったと後悔しています。
とはいえ8時間があっという間に感じるくらい楽しかったです。 夜中の2時のサイクリングも最高にエキサイティングでした。
準備不足につきます。 来年こそは本選出場できるように頑張ります。
サーバーの状態確認コマンド群
pstree
ps auxwf
top
htop
dstat -ta
glances
ユーザーの追加
adduser username
usermod -aG sudo username
git
git init git add . git commit -m "first commit"
ファイルの転送
remote → local
# file scp your_username@remotehost.edu:foobar.txt /some/local/directory # directory scp -r your_username@remotehost.edu:/some/remote/directory/foo bar
local → remote
# file scp foobar.txt your_username@remotehost.edu:/some/remote/directory # directory scp -r foo your_username@remotehost.edu:/some/remote/directory
ディレクトリのときは
local$ tar -czvf local.tar directory/ local$ scp local.tar user@remote:/directory ssh user@remote remote$ tar -xzvf local.tar
がよい。
言語の切り替え
systemdに登録されたサービスは /etc/systemd/system/
以下。
sudo -s systemctl stop XXX systemctl start YYY journalctl -f
netdata の設定
bash <(curl -Ss https://my-netdata.io/kickstart-static64.sh)
して <host>:19999
にアクセス。
alp の設定
1.Releases · tkuchiki/alp · GitHub で最新版を確認する
2.インストール
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
3.access.log の設定 /etc/nginx/nginx.conf を以下のように修正
... http { log_format ltsv "time:$time_local" "\thost:$remote_addr" "\tforwardedfor:$http_x_forwarded_for" "\treq:$request" "\tstatus:$status" "\tmethod:$request_method" "\turi:$request_uri" "\tsize:$body_bytes_sent" "\treferer:$http_referer" "\tua:$http_user_agent" "\treqtime:$request_time" "\tcache:$upstream_http_x_cache" "\truntime:$upstream_http_x_runtime" "\tapptime:$upstream_response_time" "\tvhost:$host"; access_log /var/log/nginx/access.log ltsv; } ...
4.再起動
rm /var/log/nginx/access.log && systemctl reload nginx
5.実行
alp --sum -r -f /var/log/nginx/access.log --aggregates='/keyword/.*'
slow query
1.my.conf の設定
以下を追記
[mysqld] ... slow_query_log = 1 slow_query_log_file = /var/log/mysql/slow.log long_query_time = 0
2.mysql、アプリの再起動
systemctl restart mysql systemctl restart XXX
3.percona-toolkit のインストール (Debian8: jessie)
wget https://www.percona.com/downloads/percona-toolkit/3.0.3/binary/debian/jessie/x86_64/percona-toolkit_3.0.3-1.jessie_amd64.deb
apt install libdbd-mysql-perl libdbi-perl libio-socket-ssl-perl libnet-ssleay-perl libterm-readkey-perl
dpkg -i percona-toolkit_3.0.3-1.jessie_amd64.deb
4.解析
pt-query-digest --limit 10 /var/log/mysql/slow.log
再起動用のスクリプト
#!/bin/sh set -e now=`date +%Y%m%d-%H%M%S` mv /var/log/nginx/access.log /var/log/nginx/access.log.$now systemctl reload nginx mv /var/log/mysql/slow.log /var/log/mysql/slow.log.$now mysqladmin -uisucon -pisucon flush-logs systemctl restart XXX journalctl -f
静的データのnginxでの配信
location / {}
の前に、
location ^/(img|css|js|favicon.ico) { root /path/to/static/files; }
my.cnf
innodb_buffer_pool_size = 1G innodb_flush_log_at_trx_commit = 0 innodb_flush_method=O_DIRECT
nginx.conf
とりあえず、
# Worker connections events { worker_connections XXX; use epoll; multi_accept on; } http { ... sendfile on; tcp_nopush on; tcp_nodelay on; etag off; ... }
worker_connections = ulimit -n
あとは How to Configure nginx for Optimized Performance
autostart (with sysetmd)
check
systemctl is-enabled <SERVICE_NAME>
enable
systemctl enable <SERVICE_NAME>
参照
- ISUCON 夏期講習 2017 を開催しました(当日の資料あり) : ISUCON公式Blog
- ISUCON4 予選でアプリケーションを変更せずに予選通過ラインを突破するの術 - Hateburo: kazeburo hatenablog
- How to Configure nginx for Optimized Performance
- How To Create a Sudo User on Ubuntu [Quickstart] | DigitalOcean
雑記
systemctl restart
とsystemctl reload
の違い
reload: Unitに対して設定ファイルの再読み込みを促す。(対象のUnitがreload動作に対応している必要がある)
restart: 起動中のUnitを停止後、起動(stop -> start)する。対象のUnitが停止中である場合、起動操作のみ実施する。