Gマイナー志向

とくに意味はありません

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が用意されており、問題はひと通り解消したと思われます。

利用規約

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

ApacheのAddHandlerはセキュリティ上の懸念から使用すべきではない

元ネタはこちら。

どういうことか

次のような指定は危険である。

AddHandler php5-script .php

この時に指定される.phpはファイル名の末尾である必要はない。例えば、

aaa.php.html
bbb.php.png

などもphp5-scriptとして解釈されてしまうのだ。これは.XXX.YYYと複数の拡張子が書かれた場合、.XXXと.YYYもAddHandlerの対象となることが原因。

ちなみに次のような場合にはphp5-scriptとして解釈されない。

ccc.php_foo (.php_fooとして解釈されるため)
ddd.php_bar.html (.php_barと.htmlとして解釈されるため)

実はこのことはApacheのドキュメントにも明記されている

Apache モジュール mod_mime 複数の拡張子のあるファイル

ファイル名のドット区切りでの最後の部分を使って、 特定の部分のメタデータマッピングしたい場合は、 Add* ディレクティブは使わないでください。 たとえば foo.html.cgiCGI スクリプトとして処理したいけれども、 bar.cgi.html は CGI スクリプトとしては処理したくない場合、 AddHandler cgi-script .cgi とする代わりに 次のようにしてください
Configure handler based on final extension only

<FilesMatch \.cgi$>
SetHandler cgi-script
</FilesMatch>

つまり仕様です。

あなたのサイト、大丈夫?

RHELCentOSでmod_phpが用意する/etc/httpd/conf.d/php.confは以下のように記載されていた。

AddHandler php5-script .php
AddType text/html .php

ビンゴです。
基本的に第三者がアップロードしたファイル名をそのまま使っていたりしなければ大丈夫だろうけど、うっかりミスでやってしまう可能性もあるし怖いですね。

対策

元ブログでや上記Apache公式ドキュメントでもFilesMatchとSetHandlerを組み合わせて使えと書かれていた。

  <FilesMatch "\.(php|php5|phtml)$">
    SetHandler application/x-httpd-php
  </FilesMatch>

  <FilesMatch "\.phps$">
    SetHandler application/x-httpd-php-source
  </FilesMatch>

上記RHEL/CentOSphp.confも、とりあえずFilesMatchで囲んでやれば対策になりそう。

<FilesMatch "\.php$">
  AddHandler php5-script .php
  AddType text/html .php
</FilesMatch>

FilesMatchの中であればAddHandlerでもいいんじゃないかと思う。冗長だけどね。

残念ながら世の中にはAddHandlerを設定する方法を紹介するサイトで溢れかえっているし、Apache公式ドキュメントですら一部にAddHandlerを使っている。これは啓蒙活動が必要だね、というのが元ブログの主張でした。

Mt.Gox第2回債権者集会 質疑応答メモ

有給休暇を使ってMt.Goxの第2回債権者集会に参加してきました。ちなみに第1回も参加していました。
債権者集会での配布資料は既に公開されていますが、その場にいないとわからない質疑応答について以下に走り書きのメモを残しておきます。

内容については正確ではない可能性があります。ちなみにマイクやカメラによる記録は禁止でした。

5万ビットコインが紛失している件の進捗について

ビットコインの消失の有無、経緯については引き続き調査中。

Paywardに協力を仰ぐとのことだが、どのように組織されて調査されているのか

トーマツを中心に調査している段階。
データに不完全性がみられるため調査が難航している。
ただ、Payward、Krakenさんにご協力頂いて調査しようとしているところ。
何時頃にどういう結論がでるかについては、今の段階ではわからない。
調査の進行次第。ただ、私どもとして調査を真剣に真摯に進めていく。

ビットコインアドレスの公開について

調査に支障がないようであれば開示しようと考えている段階であったが、
調査に支障があるかがポイント。警視庁から要請があったため開示していない。

開示できるのか?いつなのか?についてははっきりしたことはわからない。
トーマツとPaywardと相談の上、可能であれば開示したい。

Paywardとの契約内容についてWebサイトで開示されるのか

ご意見として承るが、開示することに支障があるのかは確認が必要。総合的に考えて開示できるかどうかを検討したい。

Mt.Goxの事業自体はどうなるのか。Paywardが譲り受けるわけではないようだが、Paywardとしては3000万円でライバルを潰した形にみえる

継続している・保有している事業とはなにかが焦点になる。取引所は閉鎖しており、再開は予定していない。システムの譲渡については、バグがあって脆弱性があるためソフトウェアを必要としている者がいないと考える。そのため事業譲渡が難しい。そもそも譲渡対象となる事業自体が存在するかが怪しい。
個人情報については第三者に譲渡するつもりはない。個人情報を勝手に譲渡するなという意見を債権者から頂いているため、第三者に提供する予定はない。

Paywardからの支援について

色々な協力に無償でお願いした。どのくらいの範囲までを無償で協力すればいいのかを決めて欲しいとの要望から、500時間を上限と設定した。様々な作業が500時間で終わらない場合はそのタイミングで調整する予定。

カルプレス氏の弁済について、すでに時間が経っているが返済の目処は

通知等を行っているが、資力がないため返せずにいるのだと思われる。返済されないようであれば(資料のとおり)必要な法的措置を取る予定。どのような、いつ行うのかについては未定。

カルプレス氏自身の口から説明して欲しい

現段階では回答を差し控えさせていただく

ビットコインの消失経緯調査結果報告時期は未定とのことだが、債権届出の期間への影響はあるのか

ない

債権届出以後、配当までのスケジュールは

現時点では未定。
平成27年9月9日に債権届出の認識の結果を報告する。そのタイミングで不正な行為があったかの調査、正当な調査結果を踏まえて債権者の債権額を判断する。その後のスケジュールについては現時点では申し上げられない。

保有するビットコインの数が202149.22738490003 BTCとあるが、本当に10桁あるのか。本来のビットコインでは小数点以下8桁までのはずだが

ご指摘感謝。確認する。

Mt.GoxからTIBANNEへ毎月コンサル料として支払われているのではないかとインターネット上で噂になっているが

Mt.GoxからTIBANNEへの支払いはあるが、コンサルではない。Mt.Goxは社員はいないが、TIBANNEがサーバや事務所、従業員を用意して、Mt.Goxがそれ借りている扱いになっていた。
事務所はTIBANNE所有だったので、Mt.Goxは賃料としてTIBANNEに支払っていた。サーバ代も。
現在はMt.GoxはTIBANNEとは異なる事務所に移した。そちらはMt.Goxで借りているのでTIBANNEへの支払いは発生しなくなった。
インターネット接続もTIBANNE経由で払っていたが、現在は直接払っている。
不必要なサーバはやめたりして支払っている。徐々に金額が減っているのはそのため。

ビットコインを現金化して債権者に配当として配る場合、20万ビットコインを捌ける市場が現状ない。また売り出すと事前に宣言すると、それを機にビットコインの価値が暴落する可能性がある。債権者としては歯がゆいので慎重に対応していただきたい

同様のアドバイスを他の方からも頂いている。対応については現在検討中。

預金残高、帳簿残高の調査についてはどうなっているのか。

不正なビットコイン等消失の調査には預金残高、帳簿残高などの調査も含まれている。合わせて調査を実施している。

システムの保全になぜTIBANNEを利用するのか。信用できないではないか

実際にデータの保全・保存を行っているのは富士通、TIBANNEがデータ保全・保存をしているわけではない。
しかし、システムの詳細についてはTIBANNEが把握しているため、TIBANNEに協力してもらう必要がある。

Mt.Goxは社員もサーバも事務所もない、実態がなければ詐欺じゃないのか

裁判所としてはそうは考えていない

過去のMt.Goxの決算書の提出は可能か

検討する

配当のスケジュールは?ざっくりとしたスケジュールも出せないか

5/29までに債権届出、認定が9/9だが、予測するのは難しい。現時点では回答できない。

財産目録、その他に12億円と記載があるが、その他で12億というのはないんじゃないか。

プロバイダ、資金配布する業者、もうひとつは米国で差し押さえがされている5億円が含まれている。

債権届出はビットコインでの届け出になるのか

ビットコインで配当するかどうかも含めて現在検討中だが、ビットコインで配当するとしても、それが債権届出の際の金銭の代わりにはならないと考えている。

カルプレス氏、現在何をしているのか教えて欲しい

現段階では管財人との調整で忙しい

カルプレス氏はフランスに帰るつもりはあるのか

フランスに帰る予定はない

まとめ

第1回のようなカオスな質疑応答にはなりませんでした。
次回は平成27年4月22日(水) 午後1時半からだそうです。

第4回ISUCON本戦でやったこと考えたこと

いい感じにパフォーマンスチューニングするコンテスト第4回ISUCONの本戦に「ご注文はPHPですか?」として参加しました。最終スコアは26位の6598です。途中の最高スコア(remote)は8000強ぐらい。

↑ピンクの線です。

メンバー
アイコン https://pbs.twimg.com/profile_images/1536770974/square1024_2_normal.jpg https://pbs.twimg.com/profile_images/497897656308350976/wKvhLHq8_normal.jpeg https://pbs.twimg.com/profile_images/2704710656/b3e622404badbefd22b2e516bed625d2_normal.png
Twitter @do_aki @matsuu @netmarkjp
職業 インフラエンジニア インフラエンジニア インフラエンジニア
得意言語 PHP Perl Python
当日の役割 右腕 左腕 ファシリテータ
予選のblog こちら こちら こちら
本戦のblog こちら こちら こちら

予選はGo言語で実装しましたが、本戦もGo言語で臨みました。

事前準備(プロファイラ編)

アクセスログを解析するプログラムをnetmarkjpせんせいがPythonで実装したものをGo言語で再実装しました。名前はあとづけですがkataribe(語り部)です。中二病っぽい!

また、ISUCON4予選で辛かったGo環境のプロファイラ周りですが、wall timeベースのお手製プロファイラをnetmarkjpせんせいに作成していただきました。こちらも名前はあとづけですがkagenui(影縫い)です。中二病っぽい!

事前準備(Redis編)

予選から本戦までの間で、ニコニコカドカワ祭りの期間中に購入したRedis入門を片手にRedisのお勉強。

Redis入門 インメモリKVSによる高速データ管理 (アスキー書籍)

Redis入門 インメモリKVSによる高速データ管理 (アスキー書籍)

いやぁこの本、入門どころじゃないですね。すごい。Redisも凄いがこの本も凄い。Redisの可能性を感じました。
この本をざっと読んだあとにISUCON3本戦の問題をRedisで再実装してました。
ISUCON4本戦がRedis実装だったのでキタッ!って思ってたんですが、Redisライブラリとしてredigoで練習していたものの、ISUCON4本戦ではgo-redisが使われてて「お、おう」ってなった件。

GoでRedisを扱うならやっぱりgo-redisなんでしょうか。

やったこと&考えたこと

ざっと列挙するとこんな感じ

プロファイラで動画のレスポンスに時間がかかっていることを確認

Redisから取り出すコストを減らすためにnginxでキャッシュして返そう→実装した。

レポート生成に必要なログがファイルに吐かれている

スケールアウトするためにnginxのアクセスログで同じ内容を出力してsyslogでかき集めればいいんじゃね?
よく調べたらアクセスログだけでは生成が難しい。ログはRedisに流し込もう→実装した

動画はRedisに突っ込みつつ、ファイルを生成するようにするか

突っ込まれたものを非同期にファイル生成を考えたが、自分たちで時間内に実装できる自信がなかった→未実装
素直にファイル出力するようにすればよかったね。

Chunkedで返すような実装があった(が使われてないように見える)

無理矢理にでもChunkedで返せばスコアがあがるのでは?→未実装

MD5でレスポンスが正しいか確認している模様

MD5コリジョンなもっと短いレスポンスを返せばいいんじゃね?→未実装

まとめ

最後のMD5コリジョンを狙うのは我ながら名案だと思ったので、あとで復習しようと思います。