Skip to content

Instantly share code, notes, and snippets.

@asflash8
Last active October 18, 2023 06:35
Show Gist options
  • Star 12 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save asflash8/0cbb743fd23385f32b412c908959a032 to your computer and use it in GitHub Desktop.
Save asflash8/0cbb743fd23385f32b412c908959a032 to your computer and use it in GitHub Desktop.
ISUCON秘伝のタレ

bash

# change login shell
chsh
# => Login Shell [/bin/sh]: /bin/bash

# bash completion
sudo apt-get install bash-completion

pt-query-digest

wget percona.com/get/percona-toolkit.deb
sudo apt-get install libio-socket-ssl-perl libnet-ssleay-perl libterm-readkey-perl
sudo dpkg -i percona-toolkit.deb
dpkg -s percona-toolkit

kataribe

# wgetの場合
wget https://github.com/matsuu/kataribe/releases/download/v0.3.0/linux_386.zip
# curlの場合
curl -O https://github.com/matsuu/kataribe/releases/download/v0.3.0/linux_386.zip
# unzipが無いかも
unzip linux_386.zip

dstat

sudo apt-get install dstat

rack-lineprof

Gemfile

gem 'rack-lineprof'
# bundle install

application

require 'rack-lineprof'

class MyApp < Sinatra::Base
  use Rack::Lineprof, profile: 'app.rb' # 測定したいアプリケーションファイル名を指定
end

MySQL

各テーブル情報

use [database name];
SELECT table_name, engine, table_rows, avg_row_length, floor((data_length+index_length)/1024/1024) as allMB, floor((data_length)/1024/1024) as dMB, floor((index_length)/1024/1024) as iMB FROM information_schema.tables WHERE table_schema=database() ORDER BY (data_length+index_length) DESC;

サーバーの情報収集

# ログインユーザー
w

# cpu数
grep processor /proc/cpuinfo

# メモリ
free -m

# プロセス一覧
ps auxf

# ネットワーク
ip a

# ファイルシステム
df -Th

# ポート番号
lsof -p <pid>

my.cnf

innodb_flush_method = O_DIRECT
innodb_flush_log_at_trx_commit = 0 # or 2
slow_query_log                 = 1
slow_query_log_file            = /var/lib/mysql/mysqld-slow.log
long_query_time                = 0
log-queries-not-using-indexes  = 1
innodb_buffer_pool_size        = 1G # スペックに合わせて調整 

nginx

upstream app {
  server 127.0.0.1:8080;
  keepalive 64;
}

server {
  listen 80;

  client_max_body_size 10m;
  root /home/isucon/private_isu/webapp/public/;

  location / {
    try_files $uri @app;
  }
  location ~* \.(?:ico|css|js|gif|jpe?g|png)$ {
    try_files $uri @app;
    expires max;
    add_header Pragma public;
    add_header Cache-Control "public, must-revalidate, proxy-revalidate";
    etag off;
  }
  location @app {
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://app;
  }
}

app-server

# unicorn
worker_processes 2 # ワーカープロセス数

# puma
workers 2 # ワーカープロセス数

deploy

#!/bin/bash
set -ex
IPADDR=$1
USERNAME=$USER
ssh isucon@$IPADDR "echo 'deploying...' && cd /home/isucon/deploy && bundle install && git pull && sudo systemctl restart mysql && sudo systemctl restart isuxi.ruby && sudo systemctl restart nginx && sudo sysctl -p && echo 'deploy done'"

pre-benchmark

#!/bin/bash
set -ex

if [ -f /var/lib/mysql/mysqld-slow.log ]; then
    sudo mv /var/lib/mysql/mysqld-slow.log /var/lib/mysql/mysqld-slow.log.$(date "+%Y%m%d_%H%M%S")
fi
if [ -f /var/log/nginx/access_log ]; then
    sudo mv /var/log/nginx/access.log /var/log/nginx/access.log.$(date "+%Y%m%d_%H%M%S")
fi
sudo systemctl restart mysql
# sudo service memcached restart
# bundle install
sudo systemctl restart isuxi.ruby
sudo systemctl restart nginx

benchmarking

top

dstat -tlnr --top-cpu --top-mem --top-io --top-bio # 全般
dstat -tplmsra  # 全般
dstat -tplmsraf # 全般2
dstat -taf --top-cpu # CPU
dstat -tdng --file --lock --top-io --top-bio # io
dstat -t -gs --mem --vm --ipc --top-mem # memory

post-benchmark

cat /var/log/nginx/access.log | /tmp/kataribe/kataribe > /tmp/kataribe.log.$(date "+%Y%m%d_%H%M%S")
pt-query-digest /var/lib/mysql/mysqld-slow.log > /tmp/mysql-slow.log.$(date "+%Y%m%d_%H%M%S")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment