Gマイナー志向

とくに意味はありません

ISUCON6本選で名誉運営としてお手伝いしてきました

この話を頂いた時は正直「名誉運営とは」と思ったのですが、本選に進むつもりで予定も開けてたしと二つ返事で引き受けることにしました。
本選運営のお手伝いとしてやったことは以下のとおり。

  • Azure関連
  • CIの構築
  • Python実装
  • 自分の知見に基づくアドバイスなど

Azure関連

Azureの特性を踏まえた上での構成検討やワンクリックデプロイのためのテンプレート作成などを行いました。

予選ではデプロイの仕組みにcustomData使われていましたが、customDataは実行スクリプトbase64に変換する必要があり、変更のたびに手間がかかるので、カスタムスクリプト拡張機能を用いてデプロイすることにしました。
customDataはUbuntuなど一部のLinuxでしか動作しないため、カスタムスクリプト拡張を利用するのがオススメです。

また、せっかくだからAzureのサービスを有効活用しようとの流れから、AzureのLog Analyticsを用いて競技者の各サーバにメトリックス情報を収集する拡張機能もインストールするようにしました。

そうそれそれ。でも実は私のミスでOMS側がうまく動かなかったんですけどね…。

CIの構築

本選の準備はGitHubのプライベートリポジトリで進めていたのですが、Azureのワンクリックデプロイを実現するためには公開領域にテンプレートを置く必要があることと、デプロイ用のファイル一式を固めたファイルを生成する必要があったため、CI環境を作成しました。
CIサービスはプライベートリポジトリでも無料で使えるWerckerを採用しました。

また、今回の本選はDocker環境だったのですが、Dockerのビルドおよび動作テストを行うために別途Jenkinsサーバも用意しました。DockerのテストにWerckerを使用しなかったのは、現状Dockerのビルド環境としてWerckerは使えないためです*1

Python実装

本選のPython実装は私が担当させていただきました。
私が本職プログラマーだった頃は主にPerl/PHPを生業としており、インフラエンジニアな今はちょっとしたツール作成にPythonを書くことが多いもののPythonでWebアプリケーションを実装した経験はほぼゼロ。とても不安でしたがなんとか実装することができました。
当初はTwistedベースの実装を依頼されたのですが、着手してみたところ自分の力量では無理だと判断し、Flaskで実装しなおしています。
また、Python3+Gunicorn(sync)だとServer Side Eventsの実装でyield周りがうまく動かず、ギリギリになって急遽Python2+Gunicornに置き換えたりしました。
残念ながらPythonで予選を通過したチームはいなかったようなので誰からも試されていない可能性があります。もし良かったらPython実装で問題を解いてみてくださいね。

自分の知見に基づくアドバイス

その他、自分の知見に基づいたアドバイスをいくつかさせていただきました。
途中からの運営参加で色々と口を挟むと快く思わない人もいるかもしれないと思い、あまり出しゃばらないように心がけてました。
でも結果として出しゃばってましたね。ごめんなさいごめんなさい。

いやぁ運営ってこんなに大変だったんですね


私はただのお手伝い要員でしたが、それでも結構大変でした。ISUCON運営ってこんなに大変だったんですね。
ただのお手伝いでこれだけ大変なのに、メインの運営の皆様がどれだけ大変かは想像もつきません。
皆さん運営の方々に感謝しましょう。ありがとうありがとう。🙏

*1:できなくはない。QiitaにWerckerでDockerビルドをやる記事あります

ISUCON6予選で敗退しましたがAzureに詳しくなれました

AppArmor Goとして @netmarkjp, @ishikawa84g, @matsuu で参戦しましたが残念ながら去年に続き予選敗退(推定)となりました。最終スコアは24000ぐらいです。

序盤

  • デプロイが終わって何も変更していない状態(デフォルトのperl実装)でベンチマーク回す
    • →スコア0
  • Go言語に切り替えてベンチマーク回す
    • →スコア0
  • MySQLに適切なインデックス追加、htmlifyの正規表現生成を切り出してentryの追加/削除があるまで正規表現をキャッシュして使いまわす
    • →スコア0

えーこれでもダメかーと思いつつ昼食で気分転換。

中盤

昼食で思いつきました。

  • 初期状態でentryごとにマッチするキーワードを予め抽出してキャッシュし、entryの追加/削除があるごとにentryごとのキーワードキャッシュをいい感じに調整することで正規表現生成のコストを下げようとする
    • →キーワード一覧を生成したものの、Goでregexp.Regexpの生成があまりに遅く事前キャッシュが全然終わらない
  • Goのregexp.Regexpの利用を諦めてPCRE実装を試みようとする
    • →実現可能性を疑ってしまいあまり手が進まない
  • このあたりから右往左往

ヤバイヤバイとこのあたりで少し焦り始める。

終盤

この時点で16:30、未だスコア0のまま。

  • Goを一旦諦めPerlに切り替え、htmlifyの正規表現生成をキャッシュするところまで実装
    • →スコア10000ちょいを記録。まじかよF***。Goつらい。
  • ようやくスタートラインだ、Perlボトルネックを調べて潰していこう
    • 久々のPerlですっかりDevel::NYTProfの使い方を忘れてしまっており、ボトルネックをきちんと把握できないままの悪戦苦闘

最後にスコア24000ぐらいを記録してフィニッシュでした。つらい。

反省会

Goで正規表現のCompileが遅いのは事前に把握していたのですが、それをどうにかする方法が思いつかず惨敗でした。またGoを諦める判断も遅かったしGo以外も勉強しておけばよかった。複数の言語に対応できるようにしておくことは大事ですね。

あとで聞いた話によるとgolangであればstrings.Replacer が使えるらしいです。なるほどー。しかし自分の知識とググラビリティではその情報にたどり着くことはできなかったでしょう。南無。

まとめ

予習のおかげでAzureに随分詳しくなれました。今後の仕事に大いに役立ちそうな気がします。
ISUCONでは負けましたが、大きな戦果を得ることができました。ありがとう運営さんありがとうISUCON!

ISUCON6予選の過去問Vagrantも作り始めてます。乞うご期待。

ISUCONの練習に使える環境を各種ご用意しております

前回の記事もISUCONネタだったmatsuuです。ISUCONのことしか書いてないがな。

ISUCONで良いスコアを叩き出すためには過去問を解くことが大事と1年前にも書かせて頂きましたが、今回も様々な環境で過去問にチャレンジできるようにしました。どうぞご査収ください。

Microsoft Azure

今回のISUCON6はMicrosoft Azure上で行われるということで、Azure用テンプレートを用意しました。クリックするだけでAzure環境にデプロイが可能です。
https://github.com/matsuu/azure-isucon-templates
ISUCON5予選とPixivさんの社内ISUCONをデプロイするテンプレートを用意しております。
内部的には真っさらなOS上でAnsibleによるプロビジョニングを行っているため構築に1時間弱かかりますのでご了承下さい。

今回初めてテンプレートを作ったので抜け漏れがあるかもしれません。問題があれば随時ご指摘ください。

Vagrant

前回のVagrant環境も更新しました。
https://github.com/matsuu/vagrant-isucon
https://github.com/matsuu/vagrant-pixiv-isucon2016
vagrant upを実行すればAnsibleによるプロビジョニングが始まります。boxの配布までは行っておりません。ごめんなさい。

Ansible

同様にAnsible環境も更新しています。
https://github.com/matsuu/ansible-isucon
Pixivさんの社内ISUCONは公式リポジトリのAnsibleをご利用ください。

Terraform

過去問の本家AMIなどを起動するためのTerraformも用意しています。
https://github.com/matsuu/terraform-isucon
https://github.com/matsuu/terraform-pixiv-isucon2016
移植版も含まれてます。移植版はプロビジョニングにAnsibleが使われるので構築に時間がかかります。ご注意ください。

Docker

今回テスト的にDocker環境も用意してみました。
https://github.com/matsuu/docker-isucon
とりあえず作りやすそうなISUCON4予選で作ってみましたが、AnsibleからDockerfileへの書き換えでかなり疲弊したためもう作りたくありません。
Docker HubでAUTOBUILDを回しているのでdockerコマンドでダウンロード可能です。各言語ごとのdocker-compose.ymlも用意しています。

まとめ

環境構築ばかりやっていて過去問を解く時間がないです。何やってんだ。
みなさんのお役に立てば幸いです。

ISUCON5で予選敗退しましたがアクセスログ解析ツールkataribeは充実しました

「チームSELinuxはEnforcing」としてishikawa84g、matsuu、netmarkjpの3人でISUCON5に参加したものの、スコアが伸びず予選敗退となりました。

最終スコアは3886。構成はVarnish+Python+MySQLでした。
ちなみにUbuntuだったためSELinuxはインストールしておらずEnforcingにしてません。すみません。でもAppArmorは有効にしたままだよ!
当初はGo言語で実装する予定だったものの、運営からGo言語の実装にはバグがあるとの事前通知があったため、バグ解消に時間をとられるのを嫌ってPythonを選択しました。しかしPythonの知見が乏しくツラい感じでした。選択ミスった…。

やったことはMySQLのチューニング、nginx→Varnishの差し替え、SQLのチューニングなどです。
VarnishにしたのはESIで部分キャッシュを実装するためでしたが、結局部分キャッシュを実装するところまで至りませんでした。
そのあたりもあって焦りが先に来てしまいなかなかスコアを伸ばせず撃沈となりました。

アクセスログ解析ツールkataribeについて

ISUCON5の事前準備として、前回のISUCON4参加時で作ったアクセスログ解析ツールkataribeを充実させました。
元々はgoのソースコードを直接書き換えて都度go buildする仕様でしたが、TOML形式の設定ファイルでカスタマイズできるようにしました。いくつかのチームは実際にISUCON5予選で使って頂いたようで、私として嬉しい限りです。俺の屍を越えてゆけ的な。

kataribeの特徴は、正規表現で複数のリクエストを束ねられることです。
例えばISUCON5予選では、以下のように設定しました。

(一部省略)
[bundles]
  [bundles.get_profile]
  name = "GET /profile/*"
  regexp = '^GET /profile/.*'
  [bundles.post_profile]
  name = "POST /profile/*"
  regexp = '^POST /profile/.*'
  [bundles.diary_entries]
  name = "GET /diary/entries/*"
  regexp = '^GET /diary/entries/.*'
  [bundles.diary_entry]
  name = "GET /diary/entry/*"
  regexp = '^GET /diary/entry/.*'
  [bundles.post_diary_comment]
  name = "POST /diary/comment/*"
  regexp = '^POST /diary/comment/.*'
  [bundles.post_friends]
  name = "POST /friends/*"
  regexp = '^POST /friends/.*'
  [bundles.css]
  name = "GET /css/*"
  regexp = '^GET /css/.*'
  [bundles.fonts]
  name = "GET /fonts/*"
  regexp = '^GET /fonts/.*'
  [bundles.js]
  name = "GET /js/*"
  regexp = '^GET /js/.*'

すると以下のような出力が得られます。

便利!

まだまだ至らない部分もあるツールですが、今後も徐々に改善していこうと思います。まる。

ISUCON過去問で予選通過のスコアを再現できるようにした

今年のISUCONは「チームSELinuxはEnforcing」で参加するmatsuuです。

前回のエントリーでISUCON過去問を再現できるようにしましたが、予選時と異なるスペックでどこまでスコアを上げればいいのかわからないという問題がありました。

そこで、ほぼ予選通過のスコアを再現できるVagrantとAnsibleを用意しました。

現在はISUCON4予選のみ用意してます。ISUCON3予選は…まぁそのうち。

使い方

vagrant-isucon-passからVagrantfileをダウンロードしてvagrant upでokです。

既にvagrant-isucon(ansible-isucon)で構築したサーバがある場合は、サーバ内で以下の手順を踏むことでも構築できます。

git clone https://github.com/matsuu/ansible-isucon-pass.git
cd ansible-isucon-pass/isucon4-qualifier
ansible-playbook -i local playbook.yml

ベンチマーク

これを使って手元の環境でスコアを測ってみました。

環境 初期スコア チューニング後 備考
AWS m3.xlarge(vCPU 4個、メモリー15GB) 1247 38862 予選時のスペック
Macbook12inch+VirtualBox(メモリー2GB) 632 14850

ちなみにISUCON4の予選通過スコアは37808、私のチームのスコアは45742でした。当日のスコア一覧はこちら

まとめ

CPUスペックやメモリ容量が異なり、ボトルネックになる箇所が本来と異なる可能性があるため*1、このスコアもあくまで参考程度にしかなりませんが、ひとつの目安として使えるのではないかと思います。
何をチューニングしてるかはansible-isucon-passを覗けばわかりますが、まずは中身を見ずに自力でこのスコアを目指してみるのがいいと思います。Let's enjoy!

*1:一応できるだけメモリを節約しながらスコアを上げてみました

ISUCON予選突破の鍵は過去問を解くことなので無料で試せるようにした(Vagrant+Ansible)

タイトルでいいきった。

ISUCON5参加者へのアドバイス

まもなくISUCON5が開催されますね。

毎年参加して予選突破を果たしている私からのアドバイスは、過去問を解いてチューニング力を高めることが重要です。これホント大事。

過去問やってる?

ですが、ISUCONの過去問はAWS用AMIとソースコード一式が用意して提供されているものの結構難しいんですよね。

  • AWSの利用は課金がつらい(特に学生)
  • AWSの利用はクレジットカードが必要でつらい*1
  • ソースコードから構築する方法がわからない(AMIの中身を見ないとわからないこと多数)

無料で過去問やろう

そこで無料かつ簡単に手元で構築できるよう、VagrantfileとAnsible用Playbookを用意しました。

https://github.com/matsuu/vagrant-isucon/
https://github.com/matsuu/ansible-isucon/

Vagrant+VirtualBoxの実行環境を用意すればお手軽に環境構築できます。
またVagrantが用意できなくても、CentOS6さえ用意すれば試せるようになっています*2

Pull Request歓迎

取り急ぎISUCON3ISUCON4の予選問題を用意しました。決勝問題やISUCON1, ISUCON2のpull requestお待ちしております。

過去問以外にやるべきこと

事前に予選で使われるプラットフォームに慣れておきましょう。操作がわからず時間を取られるのはもったいないです。
特に今回の予選はGoogle Cloud Platformが使われるため過去に参加された方も改めて操作方法を確認しておきましょう。

*1:AWSでは一部のプリペイド型クレジットカードが使えます

*2:CentOS内でansibleを実行するのでansibleを別途用意する必要もない

WoSign Free SSL Certificateが3年無料でマルチドメイン対応かつStartSSLがクロスルートと最強な件

TL;DR 申し込みはこちらから

はじめに

Let's Encryptが2015年9月14日の週から利用可能になる予定だったり、さくらインターネットRapidSSL証明書1年分無料キャンペーンを展開するなど最近盛り上がりをみせるSSL証明書業界ですが、今ここに新たな救世主がやってきました。

それが中国系SSL認証局沃通(WoSign)が提供するWoSign Free SSL Certificateです。
http://www.wosign.com/pic/Logo_new.jpg

WoSign Free SSL Certificateの仕様

WoSign Free SSL Certificateは3年間無料、しかも1つのSSL証明書でマルチドメインに対応しています(100ドメインまで)。ま、マジで!

通常こういったマイナーな認証局が発行するSSL証明書はサポートするブラウザが極端に少なかったりするのですが、クロスルート方式でStartSSLをルート証明書にもつこともあり最近のブラウザであればそこそこカバーできているんじゃないかと思われます[要出典]

申し込み方法

申し込みはこちらからどうぞ。
詳しい説明はきっと誰かが書いてくれるんじゃないでしょうか。

導入例 matsuu.net

2015年現在matsuu.netのSSL証明書はWoSignを使っています。動作確認用にどうぞ。
SSL Labsの診断結果もこちらに貼り付けておきますね。証明書パスは脅威の3つ。

OCSP Staplingに関して

OCSP Staplingも設定可能です。WoSign用Trusted Certificate Chainはこちらに用意しました
matsuu.netはこれを使ってOCSP Staplingを設定済です。

過去の経緯

私がWoSignを知ったのは2015年2月に読んだWoSignを紹介する英語のブログがきっかけなのですが、当時のWoSignは申し込みページが中国語のみでクロスルートもSHA1しかなく、Google Chromeで見るとエラーが表示されてしまうなど残念仕様でした。

現在は英語ページも用意されクロスルートにもSHA2が用意されており、問題はひと通り解消したと思われます。

利用規約

利用規約は各自きちんとご確認ください。自己責任です。