イケイケエンジニアへの道

私的な記録を公開してみる

ISUCON8予選、イイカンジになりませんでした@沖縄

f:id:kousy:20180918172734j:plain

CODE BASEさん、会場提供ありがとうございました

saboyutaka.hatenablog.com

matsuda-juri.hatenablog.com

www.masalog.site

yuki-f-oki.hatenablog.com

経緯など

さぼさんid:saboyutakaを始めとする昨年のISUCON沖縄勢の方々に続く形で始まった今年のISUCON(就活)プロジェクトが終わりを迎えました。
僕らのチームSushiSobaRamenは5月から毎週木曜日に3時間ほどの勉強会を開いてきました。
全くの初心者からWebの仕組みを理解して、過去問演習のための環境構築をして、初歩的なチューニングをできるようになるまではとても長い道のりでした。
初めは何をしていいのか本当に全く分からなかったです。
さぼさんが作ってくれていた「ISUCON初動やることリスト」や「ISUCONパフォーマンス・チューニング」に沿って、約半年学んできました。
卒業研究が忙しくて、勉強会に参加する気が起きなかったこともありましたが予選に絶対に出ると強めに決めていたので何とかやってこれました。
チームを組んでくれた2人ありがとう。

ISUCONの感想

当日やったこと

アプリ担当だったので、構成を確認したあとはブラウザから今回のお題アプリTorb(チケット予約システム)を触りつつRuby実装のコードを読んでいました。
ミドルウェアは想定していたnginxではなくh2oで、データ・ベースもMySQL5系ではなくMariaDB5.5という過去問や模擬との違いに戸惑いつつもセオリー通りに計測してボトルネックを解消していこうとしていました。
しかし、実際に僕が出来たことはほんの僅かなことだけでした。
/geteventや/geteventsや/adminが重いのは分かっていましたが。
ローカル環境の構築に手間取ってしまい、結局色々諦めました。そのせいで、rack-lineprofilerで計測していく作戦も失敗。
DBにインデックスを貼ってもベンチマーカーを走らせるたびに削除されてしまったり、pumaの設定ファイルを書いてみたもののあまり効果がなかったりという感じでした。
id:isoflabonがインフラ担当として、3台構成を色々と試行錯誤してくれていました。torb1だけで動いていてmtorb2とtorb3は初めは何もしていないサーバーです。
これを、

・torb1: デフォルトの状態(Webapp+DB, h2o)
・torb2:
・torb3:

↓↓↓↓↓↓↓↓↓↓↓

・torb1: デフォルトの状態(Webapp+DB, h2o)
・torb2: Webapp+nginx
・torb3: DB

このようにしようとしていたようです。

ログやブラウザから確認した限りでは、問題なく動いていたのですがURLが変わってしまっていてベンチマーカーから怒られるのを解決できなかったみたいです。
練習というか勉強会では一度も複数台構成をやったことがなかったのに、本番で何とかこなしていたid:isoflabonはさすがでした。

後日わかったこと

あとでなんかかく

次の初心者チャレンジャーへのアドバイス

頑張って少しでもデキる人にチームに入ってもらいましょう

当たり前ですが、環境構築や勉強の過程でいくつもの困難に出会います。プログラミング、Web初心者だけではかなり厳しいです。

コードリーディングを優先しましょう

僕らはコードリーディングは各自でやっていて、Web全体の仕組みやパフォーマンスチューニングやインフラ関係のことに割と時間を使っていました。
正直これは失敗でした。
本番で3人のうち2人がアプリ担当をするのは定石なので、一旦過去問でローカルの環境(dockerとかVagrantfile使えば簡単です)と本番環境を作れたら、ガンガンコードを読んで、プログラミングでチューニングする方法を試していくべきです。

公開されているブログやリポジトリから勉強しましょう

こんな感じで、リポジトリを公開している強いチームのコードも読んで勉強に役立てましょう。
www.wantedly.com

「ISHOCON2大会@ギークハウス沖縄」に参加した!!【Ruby】

f:id:kousy:20180901224408j:plain

感想

geekhouse-okinawa.connpass.com
師匠であるid:saboyutaka氏がギークハウス沖縄でISHOCON2をやる会を開催してくれたので参加してきました。
とても楽しかったです。ありがとうございました。
また、ISHOCONの創始者であるid:showwin氏にも大感謝です。AMIが公開されていたので環境構築がとてもラクでした。
github.com
このマニュアルに沿ってやれば、簡単にイメージ、ベンチ共にインスタンスを立てて用意された言語の実装でスコアを出せます。
今までISUCONの過去問等をやった中で、もっともスムーズに競技を始められた気がします!

やったこと

MySQLのチューニングなど

Ruby実装で挑みました。初期スコアは2316でした。

いつも通りツールのインストールを済ませてから、レギュレーションを読んで、マシンスペックやサーバーの構成を確認していきました。

htopで確認したところ、MySQLのメモリ使用率が高かったので、クエリの改善を試みました。

DBのdumpファイルを作成し、ローカル環境に持ってきたものはもちろん、リモートののサーバーで動くDBにもSequel Proからスムーズに繋いでGUIで操作することが出来ました。

最近はチームでは一応アプリ担当だったので、久しぶりにやることが多かった気がします。

しかし、最近DB周りのエラーが多かったのですが、今回は逆でした。

この辺でスコアは10000点でした。

MySQLのチューニング次第でもっとスコアは伸びていたと思います。

Nginxやredisのチューニング,,,のはずだった

完全に技術不足でした。nginx.confの設定やUnicornのワーカー数をいじった程度でした。Ruby実装はここからが本番だったみたいです。

Go実装に切り替えたら20000点出た

Go実装は初期スコアは7000くらいだというのを聞いていたので、もうこの際1人だし全然知らないけどGoやってみるかーと思ってGo実装にした。

Goは並列処理に強いというのも聞いたことがあった(常識?)ので、Go実装にしてベンチマーカーのWorkload数を130くらいに設定してベンチを回したところ20162点出ました。

まとめ

本番直前だけど、redisを使えるようになってオンメモリ戦略取れるようにしたい。

nginxのチューニングはインフラ担当に任せたい。

オンメモリ戦略: RDB上のデータを正としてプロセスメモリ上のデータをキャッシュとしてのみ利用するのではなく、プロセスメモリ上のデータを正として、RDBは永続化のためだけに使う(もしくはRDBを捨てて別の永続化手段を取る)

(ISUCON7本選問題の解説と攻略 : ISUCON公式Blogより)

ISUCON3&ISUCON7をやってみた、、、

模擬ISUCONしたよ

しかしタイトルに、、、とついているのは微妙な結末になったからなのでした。

この日は本番どおりに10時~18時で時間を取っていたものの、メンバー全員が遅れる連絡をしてからのスタートになりました。笑

f:id:kousy:20180729110658p:plain

ISUCON3はt1.microでは厳しい

isucon.net

本番はm3.xlargeなのですが、今回僕らはAWS無料枠のt1.microにしたのでした。

ここでお金をケチったせいで、開始したもののいざ1回目のベンチマーカーを回す段階になって、メモリ不足に陥っていて計測できくなっていることが発覚。

この日、僕はアプリケーション担当だったので詳細は分かりませんが、id:isoflabonによると、Ruby実装を動かすのに少し手間取ったようです。

 ・mysqlがエラーを起こしていたこと
・nginxが初期では起動していなかったこと(Apatchが動いていた)
・nginxの設定がされていなかったこと
・言語の切り替えがsupervisorという不慣れな切り替え方法だったこと
(・centosが6だったこと)

要因としてはこんな感じだったみたいです。 

この時点で開始から2時間は経過していたので、今日のところは今後の課題を洗い出して作戦会議をしようということになりました。

 ISUCON7をローカルで動かす

以前やりかけていたISUCON7も多少触りました。

アプリケーションコードの変更を加えたとき、ローカルで動作確認できると便利だよねということになりDockerで環境構築をしました。

KitematicというGUIツールをポチポチしていけば簡単なのですね。 

この辺もid:isoflabonがよしなにやってくれて色々と勉強になりました。

install.shを作る

ISUCONに必要なシェルスクリプトとして、install.sh, deploy.sh, benchmark.shなどがあると思いますが、事前に準備しておいてそのまま使えるのはinstall.shだけですよね。

デプロイやベンチは本番に適宜書き換える必要が出てくるかと思います。

そこでinstall.shだけ作りました。

install.sh

 

ちなみにこの日emacsがきちんとインストールされていて動くのかを確認するために、初めてemacsを触りましたw

ISUCON予選突破への道のり遠すぎ

計測ツールの使い方や、ミドルウェアの設定、アプリケーションコードの改善の仕方 などなど課題は山積みです。

しかし最近楽しさを感じているので、なんとか本番までにもう少し賢くなりたいです。

ISUCON8予選へ向けての雑な活動記録的なもの

はじめにやりました。
github.com
模試をやりました。
ConoHaに登録すればカンタンに立ち上げることができるのですが、学生でも有料です。
最も安い630円のプランにしてAmazonPayで支払えばそれ以上のお金の心配はいらないと思います。
github.com


地味な知見

チューニングのことはすごい人が色々詳しく解説してると思うので、書きません。

  • 変更を加えたときはもちろん、ブラウザから触ってアプリの仕様を把握することは大事。このとき、パフォーマンスはあんまり気にしない。画像の表示が遅いかな?くらいしか、いつも僕には分からないです。仕様の把握が大事。
  • 変更を加えたら必ずベンチマーカーを回して、作業ログを残していく。
  • メンバーでドロップボックスペーパーに作業ログを書き込んでいくと便利。付箋がなければTrelloも便利。
  • 必ずバックアップは取ること。nginx.confやmy.cnfの設定ファイルは同一ディレクトリにコピペしてnginx_backup.confのようにして残しておくとラク。
  • ISUCON7予選問題においてベンチマーカーを回すと、DBの初期化が行われる(?)ので、それ以前に作ったユーザーのIDとPWは使えなくなった。

第1回模擬ISUCONの感想


主に出来たことは環境構築をして、アプリケーションのSQL文を書き直した、DBへのクエリを効率化した、DBにインデックスを貼った、Unicornのワーカー数を増やしたぐらいのものでした。
出来なかったことは山程ありますが、解決できなかったボトルネックとしてはNginxに画像ファイルをキャッシュすることでした。

3人で話しながら1つの問題に取り組むことは楽しかったですが、僕も含めてまだまだパフォーマンス・チューニングの勉強不足でした。

個人的な課題としては、僕だけSequel ProでDBに接続することができなかったので原因を究明が挙げられます。

ISUCONってボトルネックを解決していかないとスコアが上がらないので、同じ言語実装の参加者はほぼ同じようなチューニングの手順を踏んでいくことになるんですかね。

そう考えると数学の問題みたいに、論理的にこれの次はこれをやるっていうのが決まっていくなぁなんて思っていました。

NginxとDBの勉強をやっていきたいです。それでは。

f:id:kousy:20180605074306j:plain

追記:
その後Nginxのエラーを解決し1万点を超えました。

Pokemon Terminal使えなかった問題が解決した

bash_profileに何回も書き込んでしまっていたPATHの設定を消して

PATH=/Users/k3/.Pokemon-Terminal:/Library/Frameworks/Python.framework/Versions/3.6/bin:

だけにしたら出来た.

複数書き込まれているとうまく動かないらしい.
kousy.hatenablog.com

ISUCONプロジェクト@沖縄の近況

f:id:kousy:20180502005831j:plain

前回突然YouTubeの記事を書いて以来,更新していませでしたkousy(こーしー)です.

先日ISUCONチームを無事に結成することができました!チーム"SushiSobaRamen(仮)"です.
3人共違う学部(1人は情報系)ですが,なんとかやっていけそうです.

ところで,ISUCONに向けてのキックオフミーティングを先週Okinawa.rbでやりました.
記事をまとめようと思っていたら,先に素晴らしい記事が上がっていました.

ISUCON流れ

全体流れ

sshの設定で公開鍵はgithubにあげとく作戦
config設定(セッションが切れないようにするなど)
アプリケーションのコードをgithubにアップする
githubにあげたコードをローカルに持ってくる
ローカルでサーバーと同じような状態にする
ローカルでコードを修正できるようにする
ベンチマーク実行する
ブラウザから操作してみる
ボトルネックを探す
ローカルでコード改修する
環境にデプロイ
ベンチマーク実行する
ローカルでアプリを動かせるようにする状態にするのがなんとなく難しそうだった。

shimabukuromegの日記より引用です.

こんな感じでした.
相変わらずmegさんのまとめ力がすごいです.
僕が書こうとしていたことが,全て綺麗にまとまっています.
アプリケーションコードを触るところまでは,なんとかいけました.

そして今日はチームの3人で集まって,この流れをおさらいしました.

来週には模擬ISUCONが予定されていますが,まだ計測ツールの使い方についても演習不足という感じです.
チーム全員が計測ツール,

  • htop
  • alp
  • myprofiler
  • tig

あたりを使いこなせるようになることがまず課題ですね.

個人的には,予選突破したチームのコードを読んでいこうと思っています.

最近は遊びとして,A Tour of Goをやったり, Swiftを触ってみたりと楽しいエンジニアライフを送っています.

内定先のサポートによりRailsチュートリアルの解説動画も,無料で見られそうなのでそこでも勉強していこうと思います.

以上,5月になったので更新してみたの巻でした!