uzullaがブログ

uzullaがブログです。

ISUCON7にチーム「common.php」で出場しました。

isucon.net

f:id:uzulla:20171022231526p:plain

どうみても予選敗退です本当にありがとうございました。

ISUCON本戦出場で、人権と職を獲得する目論見はかないませんでした。

結果として最高時スコアは14〜15万あたり、これでは出場の芽がみえないと色々いじってスコアが下がり最終は11〜13万くらいでした。

グラフをみていても夕方頃まではなんとか下をウロウロしておりましたが、相変わらずの伸び悩みです、最後の1時間、思わぬロスタイム*1で気分が代わり、勢い良く大鉈をふるったらスコアがのびたので、夕方に躊躇したのが悪かったと思いますね。

今回3年ぶりにコード書く*2役割だったので、PHPをチョイスし、「ついにフレームワークが最新Slimになった!!!!!」と喜びながらの開発となりました。PHPさいこう!!!!!さすがKlabさん!!!!

感想

今回はすごく素直な課題で、みたことがあるような問題を見たことがあるような感じで解決していきました。

ベンチマーカーもキューがガンガン来てくれるし、エラーメッセージも親切、すぐにFailがわかる!これは最高!本当によかったです。

構成

common.phpという普遍的なチーム名にしたので、ミドルウェアは吊るしのnginx+phpのままです(?)redisとかそういうPHPerが普段使わないであろう(?)ものは使わない事にしました。

HHVM差し替え&組み込みhttpdの投入はすこし悩みましたが、hhvmがPHPからはなれつつある今、矜持は本家!ということで変な差し替えも無し。7.2RC4にするかは迷ったけど(自分はもう普段から使っているし、実際多少速くなるので)、人手が足りないのでパス。

ただ、3台構成を生かすところまでいけなかった、結局2台でゴールです。結果Web+DB構成でウェブのCPU100%、DBのCPUがピーク70%くらいで時間切れになったのが心残りです。*3

変なところをいじっても性能があがらないのがよい

今回もヘンテコな(本番ではつかわないような)パラメーターブッコミチューニングはあんまり効果がなくて、粛々とリクエストやクエリを減らすとスコアが伸びる、というのがよかったですね、実に競技性がある。

コードをつらつらとよんでいてsleepによるトリックにはウケた、チャットで昔みたことあるテク(?)だ。他の言語ではこのsleepでもいいんでしょうね…。(これを伸ばすなど工夫するとスコアが伸びる…らしいけれど、Preforkのphpでは普通にきびしいので無理。現実で必要ならevent駆動に書き換えるか、クライアントのJs側でwaitをいれなければいけない)

効果があった施策

  • インデックスを張る
  • sleep()をそっとはずす(js触ってもスコアに関係ないのでDoS状態になるのは放置)
  • initなどで画像を書き出す。memory limit調整やtimeoutしないように調整(以下へつづく)
  • 画像配信はnginxにやらせてphp経由を減らす、ExpireとCache-Control付与(道半ば)
  • N+1をJOINに
  • fetchが重いのでクエリを調整し、一部的にキャッシュ(しかしこれではたりなかったので次へ)
  • indexが効いてるカラムだけでカウントしても、クエリを一つにまとめて全chのメッセージ件数COUNT(GROUP BY)でも重い。ので、ch毎のメッセージ数をキャッシュするテーブルを作成(次の行へ)
  • アクセスパターンをみたら既読無し(=そのユーザー固有ではなくてよい既読数)のchが多いので無駄なループが多い、既読があるchだけcountし、全ch毎の件数テーブルとマージすることにした。
  • メモリもCPUを使い切れていないのでコア数無視してワーカー数盛り

まあ、大体DB直してたよね。

効果あったかわからん施策

期待もしてはいなかった。

(最終的に)効果がなかった施策

  • mysqlの各種パラメタ調整
  • nginxのワーカー数調整
  • gzipをオフに…したけど帯域が厳しい気がしたのでオンにもどした
  • でかい画像ファイルプリ圧縮…は案の定圧縮できなかったんでやめ

こういうの、すっぱりと諦めてコードかいてたほうがスコア上がる気はしている(でもどうしてもやってしまう、やりたいからw)

間に合わなかった施策

  • 良いワーカー数の選定
  • 3台構成(雑に3台にしたらスコアがおちたのはヘッダーだとわかってはいたが…)

残念です。

使ったツール

  • Jet profiler(クエリの頻度などの確認に)
  • ログ解析はツール使わず、log formatをuriとStatus codeと処理秒数だけの出力にして、あとはcat grep lessと心眼で
  • microtime()とerror_log()による温かみプロファイル()
  • Chrome(のリクエストをcurlにするやつ)+curl+jq
  • コード修正はサーバー上でvim
  • CPU利用率はhtopとvmstat

こうやって書くとホント素手以外のなにものでもない気がしてきた。 Jet Profilerは「大量に発行されている(つまり重要な)クエリがなにか」を見やすいのが良いですね、有料だけど。あと、qpsが見れるのでリアルタイム負荷メーターとしてもお役立ち。

しなかったこ

  • 秘伝のタレの準備(最後にためしに昔のタレいれたけど、あまり変わらず)
  • デプロイツール類の整備(コード書くのが一人なら、なんだかんだ素手のほうが速い。PHPStormにターミナル経由でコピペして整形したくらい)
  • ログ解析ツール類の整備(個人的には、過去そんなにやくだたなかった)
  • xhprofなど(ISUCONの規模なら、読めばわかるしmicrotimeとerror_log関数で十分)
  • phpやnginxの最新版への挿し替え(7.1だったので十分)
  • E_NOTICE警察(まあISUCONだしね、しかたないよねw)
  • 素振り(本当はやりたかったけど、諸般の事情です)

これらは参考にすべきだとは言わない、何回か参加した個人的な感想です。 良いツールを揃えるのは楽しいし、それはいいと思うんだけど、毎日毎日触っているツールでないといきなりハマると思う。

ハマったところ

  • 最初mysqlへrootアカウントでTCP接続できなかったので「grant…grant…」とググる
  • netstat -s|grep recovered
  • phpのログがどこに出ているかちゃんと確認せずにすすめて、エラーに気づかず手戻り
  • explain叩いたらmysqlから反応がなくなってマジで焦ったが、家のインターネットがおちていた。
  • 「(タイマーが振動し)ああおわる!全部閉じる!閉じた!おわった!!!!…あれ?みんな盛り上がってないな…?」からの1時間ロスタイムスタート
  • 「あとでやろう、とりあえずここはダミーで」→「うごいてないやんけ!!!(自業自得)」
  • なんか調子が悪い→systemctl restart isubata.php →直る

まあ兎も角

とてもおもしろかったですね!他にPHPで参加した人と話したい!!

最近はphp以外のコードを見ているので、久々にPHPのコードでチューニングできましたし、根回しの必要無しにガンガンチューニングできるのはたのしいですね!!!

もしまた開催されるようでしたらば是非参加したいと思います!

運営チームのみなさま、本当にありがとうございました!!

わたしの方面の関係者へのご連絡

今回は事前の素振りはせず、当日の12時から23時まで(このエントリ含む)の参加でしたので、ちゃんとやっています、大丈夫です。やっています、本当です。

*1:自分が終了時刻の設定を間違えていただけです

*2:コード&サーバー担当でした

*3:ヘッダー固定でごまかすのはよくないだろうと後回しにしてたらわすれてました…

PHPカンファレンス2017の懇親会で「即php」というLTしました

突然ホワイトボードがあらわれたので、がんばってLT資料を2時間くらいでかきあげまして、

以下がそのスライドです。

speakerdeck.com

解説

  • PHPerはPHPを即使いたいはず
  • ビルドやrepo追加なんてやってられるか!!!!!!!!!!!!!
  • PHPってビルドするとたくさんファイルできるって思われがち
  • ライブラリはいってないとコピーしただけではうごかない環境もあるよね
  • こんな風にビルドすると、1個のファイルを転送するだけでPHPプログラムうごかせるよ!
  • 怒られるので真似ないでください

そんなことより

PHPカンファレンスたのしかった!さいこう!

さらに個人的に重要なこと

電撃発表された来年のPHPカンファレンス福岡に期待しかないな!!!!

このエントリは

15分でかかれましたので大丈夫です。

私がとても愛用しているblock.fmというアプリ

block.fm

block.fm

  • block.fm
  • ミュージック
  • 無料

block.fmというエレクトロ、ダンス系の音楽(ラジオ番組)をストリーミング再生できるアプリがあり、私はこのアプリを愛用しています。電車移動やドライブのときに大変にお世話になっています。

最近の普通のストリーミング音楽アプリと違い、ちゃんとした(?)DJやアーティストがラジオDJをしているので選曲が良く、私がファンだったり昔クラブで顔見知りになったアーティストも何人かチャンネルを置いていたり、とても好きなんですよね。ジャンルもきっちりわかれているのもよい。

block.fmはウェブサイトもあります(今は、アプリとほぼおなじUIになったな)

※いきなり音が出ます!

block.fm

で、最近リニューアルしたんですよね。

jp.techcrunch.com

アプデしたんですが、非常に残念な感じで辛い気分になっています。アプリ評価も残念ながらガンガン下がった。

いや、UIはかっこよくなったし、前の円形プログレスバーよりは操作しやすくはなりました…だが…しかし…。

最初に文句を書くと何なので、ちょっとしたTipsを書いておきます。

起動直後のカバーアートをスワイプしての選曲を使わず、キーワード検索を使え

キーワード検索は未来のスケジュール一覧なので、過去のアーカイブを探したい私には何なのですが、とにかく一覧でch名が羅列されます。

一覧から好きなchをタップすれば、とりあえず一つ過去の放送も聞く事ができます。もうこれがみつからなかったら僕は使うのを諦めるべきだったかもしれない。(あ、好きなchをキーワード検索できるのは便利でそれなりにうれしいですね!)

これさえ覚えておけば、とりあえず「好きなchを聞く」という最低限の行動は(そこまで)ストレスなく使うことができますのでおすすめです。

スケジュールでなく、Archiveがここから検索できるなら、ほぼ前と同じ気軽さで選べるんだよな〜。これくらいならなんとかなりませんかね。

さて、後は全部文句に近い。

自動再生がウザい

block.fmはアプリ(やサイト)を起動したらかならず自動再生されますが、さすがにこれはオフにできてほしい、記事を読みたいだけのことだってあるんだ。

後述もしますが、内部ではch切り替えた後にストリーミングをちゃんと切ってないような気がしていて、ワークアラウンド的な発想ではありますがどうでもいいch(デフォルトのchは私にとってはどうでもいいchな事が多い)の再生を抑制したい…。

あと、一時停止している時でもスワイプしてchを変更するととにかく自動再生する、これもひどい。アナログTV時代のように切り替えがスムーズならいいが、今は地デジTVなみなんだから勘弁してくれ。

スワイプによる選択が重い、バグる

これは、Android版だとなおってきていて、たぶんiOS版もなおってくるとおもうんだけど、そうはいっても過去のUITableViewっぽいリストよりも探すのが重いのにかわりない。改善しつつあるとしても、まだまだどうにももっさりしていて、UI的にサッサッと切り替えられるかっこいいUIのはずなのにこれはなんなんだ。

連続してスワイプする場合はちょっとくらい切り替えを見逃して、数秒ホールドされるまでは曲切り替え処理をしないとかの工夫してほしい!バカ正直に毎回ストリームを切り替えていればそれは重い。重いと面倒でアプリ起動直後のchを聞くしかないみたいな気分になってしまう、体験が非常に悪い。それでもがんばって選択すると最悪アプリが落ちる

クロスプラットフォームのために、ネイティブでない手法で書いている気がする

たぶんですが、iOSAndroid、Webと共通にするために、HTML5で書かれている*1。そのために色々挙動があやしい所があるんだろうか。

(どうでもいいけど、そういう視点でみると「すごい!よくできてる!!」って思うことは思う)

ここらへんがんばってほしい…んだけど、リリースしたアプリがこういう根本的な所を直してくれるケースって少ないよね…。数年後の次のリニューアル待ちか、あるいは最新iPhoneXを買うとかしかないのか…。

track機能がつかいものにならなくなった

以前のblock.fmの非常に良い機能としてtrack機能があったんですよ。番組中に再生される曲のリストがあり、そこには現在再生されている曲が表示され、それをクリップしたり、iTunesで買ったりする機能があった。これが全滅である。

blockfmの良い所ってストリーミングでいい曲!!っておもったら、すぐにメモって後で購入できることじゃないの?今は曲名を選んでシェアできるだけである、意味がない。 せめてググればいいとおもっても、前はNow playingがあったけど*2今ないんですよ、本当につらい。

ストアに飛ぶ機能がなくなるのはクロスプラットフォームのしがらみかもしれないが、せめて再生中の曲がわかるようにしてほしいし、メモ機能も復活してほしい。 (一回外部サイトでホップさせてもいいから頼む)

さらにいえば、過去にクリップした情報ももう見れないっぽくてつらい。購入してなかった曲がいくつかある…。

あ、そういえばこれはなんらかの思想があるのかもしれないけど(ライブ放送だと上に生やしたほうがみやすいから?)、Archiveの場合はTrack一覧を上下逆にしてほしいなあ…。

上下にタブ(?)があってわかりづらい

まあ下部のタブはいいんですよ、問題は上部のタブ。こういうジャンル分けいるのか?と思っていまうと同時につかいづらい。もうちょっとタッチ範囲ひろげてほしい、chのスワイプと誤爆する。

と、文句を色々書いたんですけど

まあパケ死とTrack機能がもどって、細かいバグが取れてくれば多少重くてもよい。UIは前よりたしかにかっこいいと思う。

別に広告を消せとかは言わないですし、ながくつづけるためにもMCによる謎のネイティブアド()もどんどんやっていただきたい(「これはひどいwww」ってウケるし)。

ただ、そういう所とは関係のないような、クオリティ部分を頑張って直してほしいですね。*3

・謎のパケ死(死語)を回避してほしい(Spotifyみたいにパケ死後の転送速度制限状態でも再生できるように、低ビットレートでも配信してほしい) ・Trackの機能を復活させてほしい ・自動再生オフにさせてくれ頼む

まあこんなの勿論運営(というか、エンジニア)の人はわかりきってるでしょうし、届くはずもないような気もしますが、愛用してるアプリが微妙だと非常につらいのでストレス発散で書いてしまった。

応援しております。

*1:なお、jquery

*2:再生時刻はかいてあるけど比較するの面倒すぎる、データがあるんだからその内できるかな

*3:これ、愛用してる人ならすぐ気づくやろという感じで、開発マターでないところでリリースジャッジされたんちゃうんかと思わざるをえないんですが。