uzullaがブログ

uzullaがブログです。

今回ISUCONではじめてAzureつかいましたの件

Azureってどこぞの統計ではAWSに次いでいるらしいし、日本リージョンもちゃんとあるし、色々ある。 しかし、なんだかんだ周囲の人はさわってないクラウドだったと思います。

ISUCON6でついに触るきっかけを得て、なんだかんだIaaSとして1ヶ月試した(試用期間がちょうど切れた)ので、その感想などを書いてみたいとおもいます。

ただ、Azure識者いわく、「ISUCONは競技の性質上しかたないが、いまさらIaaSを苦労するよりAppServiceなどをつかうべき」というのにはまあ一理あるなとおもったし、これをもってAzureがどうこうではないと思う。しかしまーLinux Boxがあればええんじゃというのは引き続きある需要なので…。

良い所

  • そこそこシンプル
    • たんなるVPSとして使うなら、競合よりわかりやすい。
    • いわゆるSecurity Groupとかもシンプルだしすぐ反映される
    • (私は)AWSで喰らった謎の消えないCPU IDLEなどが発生せず、性能は安定して出ていた
  • Web UI
    • まあ、ほぼ説明なしで使える程度にはシンプル
    • デプロイボタン(を、使う分には)便利!
  • Azure cliコマンドラインからのAzure操作)
    • azure cliはnpmで入るので楽
    • シュッっとVMをたてたり、立ち上がっているVMのIPを一覧できたりするのは便利
    • (gcloudなみに便利)
  • サブスクリプションやリソースグループについて
    • 理解するまでちょっと時間はかかったけど、理解したら把握しやすくて便利
    • サブスクリプション(資金バジェット、お財布、クレカ)の概念は良いと思う、案件がいりくんでもアカウントが乱立しづらそう(どうだろう?)
    • リソースグループにカンタンに人を追加できるので、ISUCONみたいな急造のチームでつかいやすいし、切り離ししやすい
  • VHDについて
    • サーバーにアタッチされたHDDであるVHDが結構便利、取り扱いもしやすい
    • これ、ローカルにおとしてうごかすこともできるんじゃろ?(俺はWSもってないけど)
    • VHDのコピーが爆速で最高(一瞬でクローンできた)
    • VHDを別のVMで立てたりとかできるのは便利
  • 課金について
    • どのクラウドよりもコンパネで課金状況が直感的に見やすいし、詳細も見れる、安心できる。
    • 試用サブスクリプションをそのまま課金サブスクリプションに切り替えできる(らしい)
    • 最初にお金をつっこんでおく(先払い)ができる、バーンレートグラフがみれてリアル(?)

悪い所

  • Web UI
    • Web UIが独特かつ挙動不審(ちょっと重い、たまに崩れる、表示が変、遅い、ブラウザリロードしないと反映がされない事も、ログインセッションがおかしくなる事も)。兎に角Web UIはもうすこしがんばってほしい(もしかしてEdgeならばっちり動くのか…?)
    • 使い勝手が惜しい、リソースまとめて削除とかしたいし、VM立てるとき毎回コピペ面倒なのでSSHキーを登録させておいてくれ頼む
    • リソースグループ内に複数のVMを立てると、依存がわかりづらくて処分ががちょっと面倒
    • 実はWebUIではできないこと、azure cliでしかできないことがかなりある
  • ストレージ、ストレージアカウントについて
    • ストレージアカウント概念に親しみがない、アクセス権限の設定が微妙にわかりづらい。使っていれば慣れるかもしれないが。
    • オブジェクトストレージも、Diskも、DBも、Queueも一箇所でこれはいいのか悪いのか…(わかりづらい)
    • もっとシンプルになるとめでたい(ある意味、今もシンプルさをめざしているのだろうが、慣れ親しんだ概念でない)
    • 中を操作するだけなら http://storageexplorer.com/ こういうツールもある
  • ドキュメントについて
    • ドキュメントは豊富にみえて、自分のユースケースにマッチしたものが少ない(WindowsLinuxで違いがあるし、azure cliPowerShell版でも違いがあるので…)
    • まあ、他はもっとなくて、仕方なく個人ブログみて解決してるような事なので、Azureは充実している方だ、ともいえるが。
  • VMのコピー、スナップショットがとりづらい

    • VHDのスナップショット(というかコピー)はサーバーがオンラインではできないのが惜しい
    • もう一度同じVMを立てる時とかにつかうテンプレートのJSONは取り扱いにめげる
    • 現在のリソースのJSONをみて、ゴネゴネするツールはある ( https://resources.azure.com/
    • JSONを視覚化してくれるやつもある(つかったことはない)( http://armviz.io/designer
  • 価格

    • 高くもないけど、どうせならもう一段階安いVMが欲しい
  • ところどころの古さ
    • CLIでシュッとたてられるUbuntuのデフォルトは16であってほしい(勿論16はあるんだけど、cliからだと短くLinuxboxをシュッとたてる手法があるのだが、それが14)

まとめると

azure cliをつかっていけば大分解決する事が多い。と、ここまでかいていて昔のAWSもそんな感じだったな…と思い出しますね。

課金周りがシッカリしているのが大変に印象がよい、さすがMSである。最近のクラウド系サービスは国内外問わず、本当に課金、利用履歴周りが自分勝手というか、ユーザーの事情を軽視している気がしていて、最悪のケースだと知らないうちに金が(検閲削除)。お金を払うところだけはシッカリしないとお客さんに勧めるどころか、次回使う気がしないので、Azureはそこについては安心感を感じられた。勿論ちゃんとアラートもある(Cost Management + Billing の概要 - Azure Cost Management + Billing | Microsoft Docs)し。なんと(事前払いではあるし、最低金額が結構なものだが)請求書での決済に儀式も(あまり)不要(12 か月の前払いプラン | Microsoft Azure)(っぽい)!

続々と新機能も増えているらしいし、PHPerとしてはApp Service(PaaS)の動向は気になっているので、そこはつかってみて改めてレポートしたい。 (PaaSについてはAWSはアレだし、GoogleやHerokuなどはお客さんがピンとこない。あと、「MSはどこの競合企業でもない」ことが多いので(闇)通し安いのではないかな!!)

どうやって学ぶべきか

これはオンプレおじさんの文脈なんで、いまどきのクラウドネイティブな人は違うかもですが…。

まずはアカウントをとって、一通りVMを立てたり壊したりしてみましょう。そして「全てのリソース」や「リソースグループ」をみて、どういった要素で組み立てられているのか確認するといいとおもいます(たとえば、NICとかStorageとかあるわけで)。この時に画面を英語にしておくと、後で直訳単語の対応で迷わないという説もあります(私は大丈夫だったけど)

その上で、azure cliをいれて、同様の事をやってみると大体わかるのでは。

個人的にシッカリ見ておいた方が良いだろうなと思うのはストレージ周りですね、なんかここだけやたらややこしい。AWSでいうところのS3みたいなのに、「およそデータといわれるもの全部が」はいっているのですが…これはわかれば便利だが、ストレージアカウントアクセスキーがどこにあるんだとか色々最初迷うとおもいます。

たとえばVHDをコピーして、コマンド叩いてVMたてられたりするくらいになれば、「あっなるほどね」という感じになると思います。 個人的にはVPSとかみたいにつかうと、このVHDの概念を中心に据えて理解していけば、他のクラウドよりも便利に感じるんじゃないかなあとおもったりしますが…どうだろう?(AMIみたいな段階が一個飛ばせるし)(ただ、これは「そんな作業するの?」って人に何度もいわれたので、オンプレおじさん的な発想なんだろうなあ…)

このあたりはazure cliの話になるので、その内また別エントリで書きたい。

で、俺は使うのか?

ウーン、一番安いインスタンスでも月1700円なんですよね。まあ安いけど、個人の実験とかだとまだVultrをまだつかってしまうかなー(https://www.vultr.com/pricing/

お仕事においては、AWSが宗教上の理由でダメなお客様ってたまにいるので検討できる。VHD周りの知見がふえて、実はスゲエ取り回ししやすいんだぜ!って事になればワンチャン。次は提案してみようとおもいました。

印象は良い方なので、次回がまたAzureでも喜んで使いますよ!

ISUCONでベンチをするたびに、Slackに集計を張り付ける件

みなさんのISUCONの参戦エントリを楽しく読みつつ、心にはダメージを負っているuzullaです、こんにちは。もう一週間くらい後に読もうかな。

さて、一昨日のISUCONでは繰り返しnginxのクエリやDBのクエリ解析結果をみていました。そこらへんを毎回手で叩くと大変だし、ファイルのシェアも面倒なので、解析したらそのままSlackにはりつけていました。その作業は半分くらい自動化されており、そのメモです。

使ったツール(一部)

  • alp
  • pt-query-digest
  • slackcat

github.com

alpについては皆さんご存じかもですが、LTSV形式のログをよしなに集計してくれるツールです。このツールで強いのは、/keyword/hoge/keyword/ugoといった最近のバラけるURLを正規表現でまとめる事ができる事ですね。主にアクセス回数やアクセス平均時間などを確認するためにつかいました。

pt-query-digest

pt-query-digestはもはや説明不要というか、ググったほうがよいでしょうが、MysqlのSlow query logを集計してくれる君です。これは回数や、合計でかかった時間を特に重視していました。(ところでmysqldumpslowがここ最近バグってて集計がおかしいんですが直って欲しいですね)

github.com

slackcatは、指定したチャンネルにファイルをULしてくれる君です。とても便利。こういうツールは結構あるけどslackcatはシンプルでよかった。

これらを組み合わせることで、「計測開始」「ベンチ回す」「集計」「Slackにポスト」ができます。

なお、slackcatはデプロイ通知とかにも使えますので、その用途にもおすすめです。

どうやるか

素直にシェルスクリプトでいいんじゃないですかね。

#!/bin/bash
set -ex

# ログのリセット
:> /tmp/access.log
:> /tmp/mysql-slow.log

# slow query logの有効化
# my.cnfに書くと外すのを忘れるので、動的にONにしている
echo "set global slow_query_log_file = '/tmp/mysql-slow.log';set global long_query_time=0;set global slow_query_log = ON;" | mysql -u isucon -pisucon

# アプリの再起動
# slow_query_logを変更したらDB再接続が必要なので
sudo systemctl restart isuda.perl
sudo systemctl restart isutar.perl

ここでベンチをまわし、じっと待つ

終わったら以下を実行

#!/bin/bash
set -ex

# slow query をオフに
echo "set global slow_query_log = OFF;" | mysql -u isucon -pisucon

# アプリを再起動
sudo systemctl restart isuda.perl
sudo systemctl restart isutar.perl

# クエリ集計
export PT_DIGEST_FILENAME=/tmp/ptd-`date +%H%M%S`.txt

# ここでteeしてるのは、一応うごいたか目でみてたかったので
pt-query-digest --limit=100 --filter '$event->{bytes} <= 100000' /tmp/mysql-slow.log | tee $PT_DIGEST_FILENAME

cat $PT_DIGEST_FILENAME | /usr/local/bin/slackcat --channel 80percent --filename pt-digest.txt

# アクセスログ集計

export ALP_FILENAME=/tmp/alp-`date +%H%M%S`.txt
cat /tmp/access.log | /usr/local/bin/alp --aggregates="/keyword/.*","/stars.*","/\?.*" > $ALP_FILENAME
cat $ALP_FILENAME | /usr/local/bin/slackcat --channel 80percent --filename alp-result.txt

# 必要に応じて、他の集計もやったりする

後で集計をみかえしたくなるかもしれないので、一応毎回ファイル名は日時を振った。

まあこのように非常に原始的な手法なのだけれど、原始的がゆえにその場で修正しやすく、たとえばalpのaggregatesをへらしたパターンもつくったりできる。(今回だと、keywordのかたよりをみるために、一部のマッチを削ったりした)

pt-query-digestのフィルタはなかなか色々な機能があって、バカでかいクエリは(初期化とかでよくある)捨てるとか、マッチしたものだけをひっぱる、とかもできるのがよい(というかやらないとつらい)。limitは指定しないと集計除外されるクエリがでてくるので、全部出すように指定している。

(ところで、現実世界でmysqlコマンドの引数でパスワード指定とか正気ではないが、まあISUCONだからね!!!)

なお、UbuntuはAppArmorがあるので、デフォだとMysqlのスロークエリログを/tmp/に出力できない。別にここに出力される意味はないのだが、/tmpを使いたいならDisableしましょう。なお、Apparmorをaptで消すとmysqlごと消えるらしい、まじか。

# うろおぼえだが、こうやります。
$ sudo ln -s /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable/
$ sudo apparmor_parser -R /etc/apparmor.d/usr.sbin.mysqld
# 適当にググると大抵古い情報か嘘がみつかりますので、まあ公式ドキュメントをみましょう。
# https://help.ubuntu.com/lts/serverguide/apparmor.html
# aa-statusで本当にオフになってるか確認をわすれないように

今後の改善点

消し忘れ怖いので、nginxのログも再起動したらオフになる仕組みがほしいとおもった。環境変数つかえばできるかな(すくなくともApacheではできるのだが、nginxだとあんまりしらべてない、次回までにはやるかな)

Slackにポストされたでっかいテキストファイルは割と見づらい。なにせ集計結果は横幅がでかくなりがち。とはいえ外部のPasteBinに貼れば解決するかってそんな感じでもない(結局、ブラウザを開くので)。

「あるベンチ結果の集計結果をタブでみれるPastebin」みたいなのがあればいいかな〜っておもったけど、割と良い感じではない。

過去のベンチとの比較とかも考えられるけど、それは実際使わんやろ…と思って作らず。

昨今のISUCONではベンチマーカーがウェブで、スコアもブラウザにでるので終了検知が面倒(今回は手作業だった)。ローカルベンチだとなにもかんがえなくていいのだが。

alpの出力そのままだと、keywordの後につづく日本語の文字がパーセントエンコーディングになってて見づらい。ここはもう一段フィルタをいれて人がよめるようにすべき。(終わった今なら、それが重要だったと気付く)

SlackにはりつけるとどんどんSlackが荒れるので、Chをわけるか、GHのISSUEに専用のスレをたてるべきか、とおもっている。まあ…趣味かな。

プレインテキストは目が滑るので、出力された集計結果の注目すべき所の文字を赤くしたいなとおもった。

まとめ

まあ石器時代みたいな手法ですが、普段やっていること以外をやると事故るので…。

こういったタレは当日につくるのは無駄なので、是非とも事前の練習の時につくるべきですね。

しかしまぁ、私が言っても説得力ないよな!すまん!!!