ISUCONカンニングペーパー

【10/23追記】 f:id:KK462:20171024034517p:plain

残念ながら本選に出場することはできませんでした。

インデックス貼ったり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>

参照


雑記

  • systemctl restartsystemctl reload の違い

reload: Unitに対して設定ファイルの再読み込みを促す。(対象のUnitがreload動作に対応している必要がある)

restart: 起動中のUnitを停止後、起動(stop -> start)する。対象のUnitが停止中である場合、起動操作のみ実施する。

「Systemd」を理解する ーシステム管理編ー | ギークを目指して