2016-10-27

ISUCON6 本戦敗退しました #isucon

22日土曜は第6回の ISUCON に参加しました。当日は無事起床は成功したのですが、完全に打ちのめされました。チーム名は円山町です。参加メンバーは会社の同期 @k_enoki, @ymz_kotaro です。今後のため当日やったことをメモしておきます。

10時~12時
4コア * 5台の構成が Azure のデフォルトのコア数制限にひっかかってデプロイ失敗、運営で2コア * 5台に変更していただき、この構成で競技することになる。
デプロイ後なぜかログインできないと思ったらユーザー名が自分の名前で入ろうとしていた。isucon@ としてログインに成功する。
バックエンド側アプリを Go 実装に変更後、何もいじらずにベンチ流してみるが、フロント側アプリの Node.js でアクセスログが出ていないのでアクセス状況は良く分からず。

12時~14時
Go のアプリのプロファイルを取得するためにアプリを改造する。Node.js 部分は @ymz_kotaro に依頼する。
@k_enoki が Node.js の前に nginx を立ててアクセスログを解析する。
isu05 に MySQL と Redis を立ててもらうのを @k_enoki に依頼する。
本番環境では別ノードの MySQL を使いたいが、ちゃんとした設定が良く分からないのでひとまずホストネットワーク設定とする。
docker-compose の扱い方でローカル環境構築に手こずったが、Docker for Mac ではホストネットワークが使えない問題があることが分かったので本番でのみ使うこととする。

14時~16時
docker-compose build していなくてイメージがリビルドされずコードの変更が反映されない問題を解決する。
Go のプロファイル上最も時間を費やしていた、あるルームの全情報を取得する API を Redis でキャッシュする機能を作成する。
ポーリングで沢山無駄にクエリを発行している、SSE で部屋の更新情報を通知してくれる API を Redis の Pub Sub を使って改造することを計画する。

16時~18時
Redis のキャッシュ機構はバグ修正を git pull してようやく機能するようになる。
更新情報通知用の Pub Sub 機構は作ってみるがいつまでも FAIL が解決できない。
nginx で TLS 終端した後、Node.js へも TLS で接続しているのはもったいないので、Node.js 側のTLSを外す改造を @ymz_kotaro にやってもらう。

全体の感想
懇親会でも聞いた通り、予選では簡単だったアプリのデプロイも、本戦ではちゃんと考えないとあっさり失敗するということを身をもって体感しました。
初めて本戦会場に来て、ただ素晴らしいネームカードを受け取っただけで、すでにいい気分になっていて、実際に勝つことをイメージして行動出来ていなかったと思います。
問題を理解して、やるべき事を速く確実にこなす、トラブルシュートを的確に行う、ということがそもそも出来ていなくて、力を発揮できる状況まで持って行けず負けたという感じでした。
自分がてんやわんやな状況になっている間も、問題を着実に解いている上位チームの圧倒的な力を感じます。
素晴らしいイベントを開催いただいた運営の皆様、ならびに問題作成者の皆様にとても感謝しています。

2016-09-19

[isucon] ISUCON6 予選通過しました

今回はついに予選通過しました。チーム名は円山町です。17日土曜日の予選当日にやったことをメモしておきます。

予選当日のタイムライン
10時
出社 (会社のオフィスから参加させてもらいました。大変感謝)
前の日の晩に作った無料試用アカウントでデプロイ
Go 実装に変更、動作確認
記事を削除したら /initialize しても復活しなくて、初期データを壊してしまったので復旧方法を調査
/var/log/cloud-init-output.log を見て展開イメージの tar.gz を発見したので、中に入っている SQL ダンプでデータを復元

11時
Go 実装に切り替えたところ、スターが付かない不具合があったので、コードを検査、ngrep で調査して原因を特定
ローカルでコードいじるためにホームディレクトリで git init、必要そうなものを add/commit して push
ローカルの MySQL にデータを入れて似たような環境を構築、バグ修正、動作確認
正常に動作するが、キーワードの置換処理があるページが遅くてベンチどころじゃないので、アプリに net/http/pprof を仕込んで、キーワード個別ページを叩いた時の CPU プロファイルを取得
htmlify の正規表現コンパイルと正規表現マッチングが遅いことが分かったので、何とかする方法を検討

12時
昼食、修正方針の検討

13時
htmlify で行っているキーワードの発見部分は、元上司の okzk さんが活用しているのを見たり、他プロジェクトのコードで見たことがあったトライ木で何とかするのが良さそうと判断、触ったことのあった github.com/armon/go-radix を使わせていただいて試作してみたところ、特に問題なく動き、動作はだいぶ速くなった。
ベンチを流しながらプロファイルを取ったところ、トライ木の構築に時間がかかっていたので構築済みのトライ木をキャッシュする (キーワードリストが変わったら破棄) ように修正

14時
isutar のスター追加処理でキーワードの存在チェックにキーワード個別ページを叩いていて迷惑なので MySQL から存在情報を取るように修正
isuda のスター取得部分で HTTP API を使う必要はないと思ったので直接 MySQL を参照して取るように修正

15時
SPAM フィルタの部分が明らかに何か怪しいので、isupam を10個に増やして nginx の upstream に入れてもらったりしてテスト
とくに改善しないので全て元に戻す
キーワードと内容をくっつけて isupam に投げても問題なかったので、これでリクエストは減らせたので良しとする

16時
キーワード本文のキャッシュを追加 (htmlify の先頭で同じ内容のリンク済み内容が分かってればそれを返す、キーワードリストの変更があったら破棄する)
トライ木の Insert, Delete で差分更新を行えば、完全な再構築を回避できることが分かったので修正、これで画期的にスコアが上がる
再起動テストを実施、起動直後の初期化で MySQL につながっていなくてアプリがクラッシュする問題を発見したので修正

17時
ユーザー名をキャッシュするように修正
記事全件数をキャッシュするように修正

終わってから気づいた点
/ のスター取得部分のスター取得クエリが記事の件数と同じ回数流れちゃってるのは良くない
htmlify で []string 作って Join したが十分な長さの ByteBuffer でやった方が良かったのでは
isutar を廃止して、スターをオンメモリ化できたのでは

参加された方のレポート見て出来ていなかった点
キーワード本文キャッシュ破棄を全破棄ではなく上手くやる方法


関連リンク
[isucon] ISUCON5 予選敗退しました
ISUCON4 に挑戦して予選敗退しました

2016-01-26

[windows] BitLocker の暗号化モードを新しい XTS-AES に変更してみました

Windows 10 バージョン 1511 の新機能で、BitLocker の暗号化方式が追加されたので、早速変更してみました。

変更方法は、いったん暗号化を解除した後、再度暗号化をする際に、以下の画面の選択肢の中で「新しい暗号化モード」を選べばよいです。

ディスクがリムーバブルではなく内蔵のときはデフォルトで新しい暗号化モードが選択されていました。



GUI 上は暗号化方法を確認出来る画面が見つからなかったのですが、BitLocker のコマンドラインツール manage-bde を使うと以下のように XTS-AES が使われていることを確認できました。

C:\WINDOWS\system32>manage-bde -status
BitLocker ドライブ暗号化: 構成ツール Version 10.0.10011
Copyright (C) 2013 Microsoft Corporation. All rights reserved.

BitLocker ドライブ暗号化で保護可能な
ディスク ボリューム:
ボリューム C: [Windows]
[OS ボリューム]

    サイズ:                 475.98 GB
    BitLocker のバージョン: 2.0
    変換状態:               完全に暗号化されています
    暗号化された割合:       100.0%
    暗号化の方法:           XTS-AES 128
    保護状態:               保護はオンです
    ロック状態:             ロック解除
    識別子フィールド:       不明
    キーの保護機能:
        TPM
        数字パスワード

BitLocker の新機能 (Windows) - 公式のリリースノートのようなものがあります。
セキュアVMを支える暗号技術 - 筑波大学 セキュアVM開発室 面 和成 - XTS-AES についての丁寧な説明が載っています。

2016-01-17

[windows] 復元ポイントに保存されたレジストリを閲覧する (Windows Vista 以降用)

管理者コマンドプロンプトにて、vssadmin list shadows、とすると復元ポイントごとの保存先アドレスが、項目「シャドウ コピー ボリューム」に表示されます。通常の復元機能では見えるコメント欄がないので、通常の復元機能の方で日時の当たりを付けておくと良いと思います。

出力例
Microsoft Windows [Version 10.0.10586]
(c) 2015 Microsoft Corporation. All rights reserved.

C:\WINDOWS\system32>vssadmin list shadows
シャドウ コピー セット ID: {0000000-1111-2222-3333-444444444444} の内容
   1 個のシャドウ コピー、作成時刻: 2015/12/26 8:39:27
         シャドウ コピー ボリューム: \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1
         元のコンピューター: PC123
         サービス コンピューター: PC123
         プロバイダー: 'Microsoft Software Shadow Copy provider 1.0'
         種類: ClientAccessibleWriters
         属性: 恒久, クライアント アクセス可能, 自動リリースなし, 差分, 自動回復

しかしとてもアクセスしにくいので mklink でシンボリックリンクを作成すると便利です。mklink /d SRC DEST で、DEST 末尾の \ を追加で付ける必要があるので注意してください。

C:\WINDOWS\system32>mklink /d c:\shadowcopy1 \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\
c:\shadowcopy1 <<===>> \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\ のシンボリック リンクが作成されました

この後は c:\shadowcopy1 に対して、エクスプローラーで閲覧したり、ファイルをコピーしたりすることが出来るようになります。

レジストリを閲覧するには、レジストリエディタ regedit で、HKEY_LOCAL_MACHINE を選択後レジストリハイブの読み込み機能で、例えば C:\shadowcopy1\Windows\system32\config\SYSTEM を適当な名前 system_shadowcopy1 で読み込み、中を閲覧することができます。不要になりましたらこのキーをアンロードすれば元に戻ります。

リンク
A simple way to access Shadow Copies in Vista - Antimail - Site Home - MSDN Blogs
レジストリにハイブを読み込む
[windows] 復元ポイントに保存されたレジストリを閲覧する (Windows XP用) - Windows Vista 以降では復元ポイントごとにレジストリがコピーされるわけではなく、ボリュームシャドウコピーの中に丸ごと保存されているようなので、以前の記事を更新しています。

2015-11-06

[Lawson] おさいふ Ponta に移行してみました

2015/11/3
おさいふ Ponta をローソンでゲットしたので、会員登録を行おうとしました。最初のステップで届くメールが Gmail の迷惑メールフォルダに分類されましたが登録自体は問題なく完了しました。旧カードからの移行は障害中だったのであきらめました。

2015/11/4
次の日の晩、復旧のニュースを見たので早速移行申請し、2015/11/5 の昼頃見てみたら移行完了していました。

感想
Ponta 部分は特に変更なく、発行の敷居の低さに反して JCB デビット自体の機能は十分と思います。

おさいふ Ponta マイページから暗証番号の登録と J/Secure (JCB の本人認証サービス) の有効化が行えるので設定すると良いと思います。

ローソン店頭でおさいふ Ponta 決済をするときは、カードを出した時点でおさいふ Ponta で決済したい旨を伝えなかった場合は、Ponta カードのスキャンだけして返してくれました。

個別の移行手順
ローソンモバイル Ponta
Android 端末内蔵の FeliCa に登録するローソンモバイル Ponta の変更はローソンアプリからログアウトして、かざすフォルダのおさいふポンタを削除、ローソンアプリで新 Ponta ログイン、ログイン時にモバイル Ponta 登録オプションを有効にして更新できました。
参考: 5. 機種変更する場合はどうなりますか?

リクルートID
リクルートIDとの連携は旧 Ponta 側をコネクト解除して、新 Ponta 側とコネクトしました。これは即座に完了しました。
参考: Pontaコネクトを解除するにはどうすればよいですか。

JMB×Ponta会員
JMB×Ponta会員は旧 Ponta 側でログインし連係解除を行った後、3日目にようやく新カードでの連携に成功しました。ここの連携は日次バッチ?のようなので気長に待つ必要があるようです。
参考: Pontaカードを2枚持っているが、JMBとの登録カードを変更したい場合はどうすればよいですか?