ISUCONへの道~プロファイリングツール編~

こんばんは。
早速ISUCONに向けてプロファイリングツールを試して行きたいと思います。

# alpの導入
github.com

alp is Access Log Profile

alpとはAccess Log Profileの略なんですね。
とりあえず導入していきます。

// alpをダウンロード
$ wget https://github.com/tkuchiki/alp/releases/download/v0.0.4/alp_linux_amd64.zip
// zipを解凍するためにunzipをインストール
$ sudo apt install unzip
$ unzip alp_linux_amd64.zip
$ sudo mv alp /usr/local/bin/alp
$ sudo chown root:root /usr/local/bin/alp

これでalpの準備は万端です。

次にnginxの設定を修正指定いきます。

/etc/nginx/conf.d/log_format.confを新規に作り、下記を入力します。
下記では、access.logをalpが読み込めるフォーマットに整える設定です。

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;

次に、これを読み込むためにnginx.confを修正します。
httpタグの中にincludeすることにより、log_format.confを展開してくれます。

http {
    ...
    include       /etc/nginx/conf.d/*.conf;
    ...
}

nginxを再起動します。

$ sudo nginx -s reload

これでnginxの設定も完了しました。

alpを実行してみます。

$ sudo alp -f /var/log/nginx/access.log

こんな感じで出力されます。
f:id:kazuki229_dev:20170928225053p:plain

# alpの使い方
これでalpを使ったログの解析ができましたが、これらのデータをどうみていけば良いか考えて行きましょう。
alpではアクセスされたエントリポイントごとに集計を行います。
したがって、列で表されているデータはエントリポイントごとの値となります。

名前 概要 備考
max 最長レスポンスの時間
min 最短レスポンスの時間
avg 全レスポンス時間の平均
sum 全レスポンス時間の合計
cnt アクセス数
uri URI
method メソッド
max-body 最大のボディサイズ
min-body 最少のボディサイズ
avg-body 平均のボディサイズ
sum-body 合計ボディサイズ
p1 1パーセンタイルのレスポンス時間 小さい方から1%目の時間
p50 50パーセンタイルのレスポンス時間 中央値
p99 99パーセンタイルのレスポンス時間 小さい方から99%目の時間
stddev レスポンス時間の標準偏差

となっています。

例として、max,sum,cntあたりを見てチューニングの当たりをつけてみましょう。

max
f:id:kazuki229_dev:20170929001114p:plain
sum
f:id:kazuki229_dev:20170929001210p:plain
count
f:id:kazuki229_dev:20170929001142p:plain

maxを見るに、/が最大7秒の時間がかかっており、/keyword/xxxといったアクセスに関しても4秒程度の時間がかかっていることがわかる。

sumを見ても、/が700秒と断トツにアクセスが来ているため、/を最適化すると効きそうな気がします。
ついで、POSTのエントリポイントである/login,/keyword,/starsが上位に並んでおり、これらも改善の余地があると思われます。

最後にcntを見ると、/starsが940回も来ているのがわかります。ただ、1アクセスあたりの時間がそこまでかかっていないので、改善してもあまり効果がないかもしれません。

これらを見る限り、とりあえずは/を最適化し、ついで/login, /keyword, /starsのPOST, /keyword/xxxのGETを最適化すれば良いかと思われます。


大会の時には、何回もベンチマークを回すため、ベンチマークを回す前にログをローテート、解析結果をslackに連携などできると良さそうです。


# 参考
papix.hatenablog.com

ISUCONへの道~アプリケーション実行編~

とりあえずvagrantでの環境構築はできたので、実際にアプリケーションを動かして行きたいと思います。

今回はphpで実装を行いたいので、phpで動かすまでをまとめられればと思います。

まずつまづいたのがisuconユーザのパスワード。

わからなかったので、たどり着いたのが、下のページ。
muttan1203.hatenablog.com

一旦ubuntuユーザでログインして、isuconのパスワードを変えてあげれば良い。

$ vagrant ssh image
$ whoami
ubuntu

$ sudo passwd isucon
Enter new UNIX password:<パスワード>
Retype new UNIX password:<パスワード>
passwd: password updated successfully

これでパスワード変更完了。

次に、nginx.confを置き換えます。

// バックアップを取り
$ sudo  cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak
// php用のconfに置き換えます
$ sudo  cp /etc/nginx/nginx.php.conf /etc/nginx/nginx.conf

// systemctlのリストを確認すると、どうやらperlのアプリケーションが動いているらしい
$ systemctl list-units --type=service | grep isucon
  isucon6-bench-worker.service       loaded active running isucon6 bench worker
  isuda.perl.service                 loaded active running isucon6 qualifier main application in perl
  isupam.service                     loaded active running isupam is an isucon6 qualifier sub application
  isutar.perl.service                loaded active running isucon6 qualifier sub application in perl
// perlを停止
$ systemctl stop isutar.perl.service
$ systemctl stop isuda.perl.service
// phpを起動
$ systemctl start isutar.php.service
$ systemctl start isuda.php.service

// nginx再起動
$ systemctl restart nginx.service

// ベンチ実行
$ ./isucon6q-bench -target http://127.0.0.1
2017/09/28 00:30:53 start pre-checking
2017/09/28 00:30:58 pre-check finished and start main benchmarking
2017/09/28 00:31:53 benchmarking finished
{"pass":true,"score":2575,"success":1758,"fail":8,"messages":["リクエストがタイムアウトしました (POST /keyword)","リクエストがタイムアウトしました (POST /login)","リクエストがタイムアウトしました (POST /stars)"]}

一旦ベンチマークが動くところまで行きました。

ちなみにアプリケーションが動作しているIPの確認はifconfigで行いました。

$ ifconfig
enp0s3    Link encap:Ethernet  HWaddr 02:a4:a0:f1:db:6e
          inet addr:10.0.2.15  Bcast:10.0.2.255  Mask:255.255.255.0
          inet6 addr: fe80::a4:a0ff:fef1:db6e/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:412335 errors:0 dropped:0 overruns:0 frame:0
          TX packets:123613 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:570656970 (570.6 MB)  TX bytes:8374510 (8.3 MB)

enp0s8    Link encap:Ethernet  HWaddr 08:00:27:a5:5a:54
          inet addr:172.28.128.4  Bcast:172.28.128.255  Mask:255.255.255.0
          inet6 addr: fe80::a00:27ff:fea5:5a54/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:87 errors:0 dropped:0 overruns:0 frame:0
          TX packets:54 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:33304 (33.3 KB)  TX bytes:10458 (10.4 KB)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:3480485 errors:0 dropped:0 overruns:0 frame:0
          TX packets:3480485 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1
          RX bytes:58428255407 (58.4 GB)  TX bytes:58428255407 (58.4 GB)

これの172.28.128.4にアクセスすると、下記のようなページが確認できました。
f:id:kazuki229_dev:20170928004756p:plain
wiki的なやつっぽい。

次回はプロファイリングツールの導入を行なってみたいと思います。

ISUCONへの道~環境構築編~

isucon.net
ISUCON7に参加することになりました。

ISUCONっぽいものには出たことあるのですが、競技時間は1週間ぐらいあり、勉強しながらチューニングしていました。
しかし、ISUCONは競技時間が8時間ほどしかないということで、事前準備が大事!

ということで、過去問に挑戦するための環境構築をまず行なっていきたいと思います。

# 動作環境

# ISUCON問題アプリケーション構築
ありがたいことに、神様みたいな人がISUCONの過去問の環境を構築するVagrantfileを用意してくださっています。
今回はこれをありがたく使用させていただきたいと思います。
github.com

まずは去年の過去問の環境を作ってみたいと思います。

$ git clone https://github.com/matsuu/vagrant-isucon.git
$ cd vagrant-isucon/isucon6-qualifier
$ vagrant up #←一時間ぐらいかかりました
|<

Rust入門

Rustの環境構築を行ってみたいと思います。

macOS Sierra 10.12.6

$ curl -sSf https://static.rust-lang.org/rustup.sh | sh

main.rsを作成してみる。

fn main() {
    println!("Hello, world!");
}

コンパイルして実行。

$ rustc main.rs
$ ./main
Hello, world!

print!()の"!"はマクロの呼び出しを表しているらしい。

^M bad interpreter

Macシェルスクリプト実行時にエラーが出ました。

/bin/bash^M: bad interpreter: No such file or directory

調べたところ、改行コードがWindows環境と異なるため、実行できないらしい。

vimの場合は-eオプションをつけると、^Mがvimでも表示されます。
単純にその^Mを消しても良いですが、vim

:%s/^M//g

を打つと全ての改行が削除されるので、これで実行可能になります。

ちなみに上の"^M"は制御文字なので、ctrl-V + Mで入力することができます。

iMovieでYoutuberっぽいテロップをつける

と言うわけで、久々に書く記事が技術じゃないと言うところは置いといて、今回はiMovieを使ってYoutuberっぽくテロップをつける方法をまとめてみたいと思います。

動作環境

macOS Sierra 10.12.5
iMovie 10.1.4
Pixelmator3.6

iMovieでのテロップ

iMovieでは"タイトル"をつける機能があります。
f:id:kazuki229_dev:20170917014551p:plain

こんな感じで動画に文字を入れられるのですが、テロップとして使うには多少問題があります。

  • アニメーションが決められていること
  • テキストの位置が決められていること

これらは、Youtuberっぽくテロップをつけると言う要望に添いません。
なぜなら、Youtuberのテロップはアニメーションなしでパッと出てパッと消えます。
そして、テロップの位置もバラバラです。

そんななか色々調べた結果、テロップ画像を自分で作成し、動画に貼り付けることが一番よいと結論づけました。
その方法をまとめます。

テロップ作成

テロップの作成には、Pixelmatorを使います。
このアプリは2017/09/16現在で3600円で購入することができます。
Youtuberっぽいテロップを作成するためにはお金も必要です。

そして、Youtuberっぽいフォントも必要です。
これを使えばYoutuberっぽくなります。
www.fontna.com

フォントをダウンロードしてREADME通りにインストールを行います。

そして、そのフォントを使ってYoutuberっぽく縁取りされた文字を作成します。

まずPixelmatorでファイルの新規作成をします。
その際に、自分の撮った動画と同じ大きさでファイルを作成すると、文字の入力時にイメージしやすいと思います。
f:id:kazuki229_dev:20170917015809p:plain

そして、ツールバーの中にあるTを選択すると、テキスト入力モードになります。
テキストを入力した後に、レイヤーパネルの一番下の歯車ボタンを押し、ピクセルに変換をします。
f:id:kazuki229_dev:20170917020041p:plain

その後、編集の"線"を押します。
f:id:kazuki229_dev:20170917020202p:plain

そうすると文字の縁が追加されるので、線の位置を外側にします。
f:id:kazuki229_dev:20170917020314p:plain
これでテロップ完成!
f:id:kazuki229_dev:20170917020337p:plain
保存する際はpngで保存すると、文字以外は透明になるので、動画に貼り付ける時に便利です!

iMovieでテロップをつける

テロップ画像は出来上がったので、あとは動画にテロップをつけていきます。

まずは、テロップをドラッグアンドドロップiMovieのプロジェクトに追加します。
プロジェクトに追加した画像をまたドラッグアンドドロップで、下の作業画面に追加します。

追加した画像を選択し、ピクチャインピクチャを設定し、ディゾルブを0秒にします。
f:id:kazuki229_dev:20170917020843p:plain
そして最後にスタイルをフィットにします。
f:id:kazuki229_dev:20170917020935p:plain

あとは画像の位置を好きな位置に持っていけば完成です!

これでYoutuberみたいなテロップを作ることができました😇

久しぶりですが

ブログ全然更新できていませんでしたが、明日から毎日更新したいと思います。