ISUCON公式Blog

WINNER'S PRIZE \1,000,000



   

櫛井です。
「オンライン予選の利用言語比率を見たい」というご要望をいただいたので、アンケート結果よりまとめてみました。

オンライン予選 利用言語比率

利用率の全体ランキングは以下の通りです。利用言語は複数選択可となっています。

21.13% Perl
18.31% Ruby
12.68% PHP
7.04% Python
4.23% Node.js
4.23% Go
43.66% 未回答


本選出場の25チームに絞ると以下のようになります。
40.00% Perl
32.00% Ruby
8.00% Python
8.00% Go
4.00% PHP
4.00% Node.js
12.00% 未回答

オンライン予選 順位別利用言語

「順位別の利用言語も知りたい」という声もありましたので発表いたします。TOP10はすでに発表済みですのでチーム名も併記しています。
(当初発表時、1位チームの使用言語を間違えておりました。失礼しました。)

1 Python (勝浦タンタンメン)
2 Python,Go (ぜかまし)
3 Perl (山形組)
4 Perl (進撃の超大型パティスリー兄弟)
5 Ruby (オシャレ怪盗スワロウテイル)
6 Ruby (The Revenge of Mr. Frank & Co.)
7 未回答 (くらげとみかんと江戸幕府)
8 Perl (LINE選抜「チーム生ハム原木」)
9 PHP (チームたこやき)
10 Perl (チームぽわわ2)
11 Ruby
12 Perl
13 Perl
14 Perl
15 Ruby, Go
16 Perl
17 Perl
18 Ruby
19 Node.js
20 Perl
21 未回答
22 Ruby
23 Perl
24 未回答
25 Node.js
26 Ruby
27 Ruby
28 未回答
29 未回答
30 Ruby
31 Ruby
32 未回答
33 未回答
34 未回答
35 Ruby
36 Perl
37 Perl
38 Python
39 Go
40 未回答
41 未回答
42 Python
43 未回答
44 未回答
45 未回答
46 未回答
47 PHP
48 Perl
49 PHP
50 未回答
51 PHP
52 未回答
53 未回答
54 未回答
55 未回答
56 未回答
57 未回答
58 PHP
59 未回答
60 未回答
61 未回答
62 未回答
63 Node.js
64 Ruby
65 未回答
66 Perl, Ruby, Python, PHP
67 PHP
68 PHP
69 PHP
70 未回答
71 未回答
72 未回答
73 未回答
74 未回答


以上です。

ご参加いただいた皆さんの感想などはこちらにまとめています。
ISUCONオンライン予選 関連エントリまとめ : ISUCON公式Blog
Read more...

最終更新 2013/10/18 7:31 参加者エントリ64件

--
LINE株式会社の櫛井です。

オンライン予選にご参加いただいた皆さん、ありがとうございました。
こちらでは感想エントリや何をしたかに言及されたエントリをまとめていきます。見つけた順です。もしここに載っていないものがある場合は @941 まで教えていただけると助かります。

予選のTweetはこちらでまとめています
#isucon オンライン予選 Tweet まとめ - Togetter


運営
オンライン予選 一日目の結果発表 : ISUCON公式Blog
オンライン予選 二日目の結果 & 暫定版の本選出場チーム発表 : ISUCON公式Blog
#isucon 2013年予選問題の解説など : ISUCON公式Blog
ISUCON3 予選を開催しました - 酒日記 はてな支店
#isucon の予選問題の出題に参加しました - beatsync.net

参加者
DSAS開発者の部屋:ISUCON 3 予選参戦記
ISUCON3 予選の記録 - Webtech Walker
#ISUCON 2013に参加しました - handlename's blog
isucon3 の予選に参加しました #isucon - @soh335 memo
ISUCON予選にPHP実装で参加して3位になりましたーやったことなどまとめ
#isucon 3 予選まとめ - diary.sorah
#isucon 2013予選に参加した - すぎゃーんメモ
ISUCON3予選に参加してきました。 #isucon - from scratch
isucon3 予選に参加して惨敗してきた話 - do_akiの徒然想記
isucon #3 予選に参加してきた - I sort my thought...
おいぬま日報: #isucon の予選に出場して惨敗してきた( ー`дー´)キリッ
YappoLogs: ISUCON3 で暫定で本戦進出らしいです #isucon
ISUCON3予選でチーム└('-'└)として参加した&やったこと - Dマイナー志向
#isucon 予選でとりあえず10位だった - ぱいぱいにっき
#isucon 予選で息も絶え絶えです - wtatsuru's blog
#isucon 2013に参加してきた>< - 僕の車輪の再発明
#isucon の予選に参加してきた。 - パルカワ2
#isucon 3 予選総合3位でした | へぼい日記
isucon 2013 予選(一日目)参加記 - nise_nabeの日記
#isucon 2013 予選をトップ通過してきた(はず)。 - 双六工場日誌
Life with open mind: ISUCON3 に参加して予選敗退したので反省してみる
好きな子のことかslow query logのことばかり考えてほかのことがおろそかになる性格なおしたい #isucon - かみぽわーる
ISUCON3予選の記録 - ni-blog
isuconに初参加してきました - tanihiro.log
#isucon 2013 予選1日目に参加しました - さよならインターネット
isucon3予選参戦の記録 - tagomorisのメモ置き場
ISUCON3の予選を通過した(はず) - @ijin
ISUCON3 予選に参加しました | metropolis
ISUCON3 予選に参加してきました。無念ばかり残る - Hateburo: kazeburo hatenablog
ISUCON予選に出た #isucon - tknzk's tech log
日々の覚書: Isucon #3に出場してチームをお通夜にしてしまった話
ISUCON3予選に学生枠で参加してみた #isucon - 404 Engineer Logs
ほげほげ: ISUCONで予選敗退してきました
isucon 2013にて戦死 | Ore no homepage
100万円が欲しくてisucon2013予選に参加したけど惨敗した話 #isucon - damelog
ISUCON 2013 にチーム「 50ms or die. 」として参加してきました - 0.01mmの向こうへ
ISUCON3 予選に参加してきた - kanblr
魔王軍としてisucon3予選学生領を制圧してきた - あざらし備忘録。
#isucon 予選、暫定で生き残れたよう。 - kfly8の日記
魔王軍としてisucon3予選学生領を制圧してきた - あざらし備忘録。
#ISUCON で見事名誉返上、汚名挽回しました! - iをgに変えるとorangeになることに気づいたoranieの日記
#isucon 2013 に参加しました。あるいは最低スコア 900 を叩きだした僕達の足跡 - ALBERT Engineering (仮)
ISUCON3 予選参加報告 - myfinderのはてなブログ
ISUCON3 に参加しました - Islands in the byte stream
ISUCON3の予選に参加してきた - Shogo's Blog
sonots:blog : #isucon 2013なんとか予選突破しました(はず)。そして Miami へ ...
isucon予選に 「くらげとみかんと江戸幕府」チームで参加してきました - bokko bokkoにしてやんよ
ISUCON#3の予選に参加してきた - 酒飲みの備忘録
ISUCON3のオンライン予選にFulabで参加してきました | Fusic Developers' Weblog
ISUCON3 予選 2 日目に参加した(暫定 5 位) #isucon - 詩と創作・思索のひろば (poetry, writing & deep thoughts)
ISUCON3予選で何も出来なかった話 #isucon - ikosin's diary
isucon3 予選で敗退しました(うさぎ工房) | シーズクリエイターズブログ
#isucon 3予選を運良く通過したはなし - かるぱねるらすたいる
ISUCON 3 予選回顧録 - その手の平は尻もつかめるさ
ISUCON 2013 予選に参加してきました。 - あおみかんのブログ
ISUCON 3 予選に参加してきた | 暇人じゃない
#isucon参加記録 またはへっぽこ学生エンジニアは如何にしてRedisを愛するようになったか。そしてエモい話。 - cnosuke's blog (′ʘ⌄ʘ‵)
#isucon3予選で惨敗してきた - @Inject
第三回ISUCONの予選に出たけどダメだった | 明日から本気出す
#isucon 2013 予選通過 - @kyanny's blog
ISUCON#3予選に参加しました | κeenのHappy Hacκing Blog
isuconオンライン予選にチームMiamiで参戦しました! - CubicLouve
isucon3-qual-go/gocon.md at master · methane/isucon3-qual-go
#isucon 予選でdstatを叩くだけの簡単なお仕事をしてきました - masasuzu 技術メモ
Read more...

みなさんISUCON予選おつかれさまでした。@fujiwaraとともに今回の予選の運営をしている@acidlemonです。予選問題はまず最初に@fujiwaraがPerlの初期実装を作って私が解き、おもったよりもサクサクだったので凶悪なクエリを追加して大体完成したところで、@fujiwaraがRuby, Python, Goの移植、私がNode.js、PHPの移植を行いました。

Node.js実装についてはsupervisordではなくstandaloneで動かすとtmpfile()が $HOME/tmp にテンポラリファイル作ろうとするため、コンソールから直接npm start等で起動した場合はそのようなフォルダがなくエラーとなる問題が1日目のAMIにありました。この点でハマってしまった方、申し訳ありません。

さて、講評につきましては明日以降みなさまより提出いただいたAMIを私と@fujiwaraでチェックし、順位が確定したタイミングで@fujiwaraから出る予定となっております。それに先立ち、まず私からはどのような問題だったのかの解説をしたいと思います。

予選問題の解説


今回のWebアプリは一言でいうとgithubのgistのようなWebアプリでした。大体以下の要件のWebアプリとなっています。

  • ログイン機能がある。CSRF対策がなされている
  • メモ(Markdown形式)を投稿する機能がある。投稿するときにメモを非公開にするかどうか選ぶことができる
  • トップページに最新の公開投稿100件を表示する
  • 公開投稿をページングして辿っていく機能があり、各ページ100ページずつ表示する
  • マイページに自分が投稿したメモを公開/非公開に関係なくすべてリスト表示する
  • メモの表示はMarkdownをHTMLに変換して行う。メモページからは次/前の公開メモを辿ることができる

  • また、競技を行うマシンはAWSのEC2に以下のようなAMIを準備しました。

  • OSは最新のAmazon Linux(x86-64)
  • TCP/80ポートをApache 2.4で待ち受け、すべてのアクセスをTCP/5000ポートへリバースプロキシする
  • TCP/5000は初期設定ではperl実装が起動している。起動する実装はphp以外supervisordで切り替え可能
  • PHPを使用する場合はサンプル提供しているApache用のconfファイルを有効にしてTCP/5000でPHPを動かす
  • ストレージは最新のMySQLとAmazon Linux標準のmemcachedをインストール
  • アプリの設定はPerl, Ruby, PythonのPrefork型アプリケーションサーバは10worker、Goはコントローラ部分が10並列、Nodeはclusterを使い2プロセス、PHPはApacheのデフォルト設定
  • アプリはセッションストアとしてmemcachedのようなものを使用

    各言語の初期スコアですが、大体 Go 2500 > Ruby 2000 > Python = Perl > Node.js = PHP といった感じになっています。初期のボトルネックはほぼDBとなっていましたのでアプリで処理を行う部分のスコアはほとんど同じ感じでしたが、Goが飛び抜けているのは静的ファイルを返す速度ですこし飛び抜けた感じになっています。最終スコアからすると誤差の範囲ですね。

    具体的に高速化していく解答方法については明日以降に別途エントリの場所を #isucon タグでお知らせしますが、まずは「あれは罠なの?」などと質問が飛びそうな点などについて以下で解説していきます。

    出題内容について


    Q. セッションストアにmemcachedのようなものを使っているのは罠ですか?
    A. まずどのぐらいの方が気付いたかわかりませんが、memcachedのデフォルトポートである11211ポートで起動していたのは純正のmemcachedではなくMySQL 5.6.14のInnoDB Memcached Pluginです。純正のmemcachedは11212ポートで起動していますので、セッションストアの接続先を11212ポートに変更するとMySQLの負荷が少しだけ下がったのではないかと思います。ただし、アプリが出すクエリのほうがよっぽど重かったと思います。

    また、memcachedではなくファイルに保存するという変更も可能かとおもいます。今回は1台のEC2の上にすべて乗っていますので、memcachedとファイルで差異はあまりでなかったのではないかと思います。

    Q. HTMLにCSSで / を指定したものがありましたが罠ですか?
    A. あれは多分罠ですね。@fujiwaraが「あるあるネタ」として仕込んでいました

    Q. 静的ファイルを返す部分にディレイを入れたらスコアが下がりましたが罠ですか?
    A. チェッカーも静的ファイルを取りにいきますのでディレイを入れたらチェッカーが遅くなるのでスコアが下がるでしょうね。

    Q. gzipをONにするとスコアが下がりましたが罠ですか?
    A. ベンチマークツールとアプリが同じマシンにありますので、ベンチマークツールでgzipを展開してmd5を確認しますのでそのぶんベンチマークツールのスループットは下がるのではないかと思います。

    Q. サインインしたときにDBのlast_accessカラムを更新していましたが、使っているところが見当たりません
    A. HTMLに書き出しているところはありませんので、気付いた人は削除してスコアアップできるサービスポイントです。

    Q. PHPで初期でFAILが出ます
    A. PHPは初期状態で負荷が高すぎてFAILがでてしまいます。これはセッションストアのmemcachedに接続する際に高負荷でタイムアウトとなっていることから発生しているのですが、現在のMemcachedモジュールにはセッションストアに接続する際のタイムアウトを設定できないため、やむをえずこのようになっています。なお、Memcachedモジュールのgithubにはタイムアウトを指定できるものが上がっているのですが、まだ正式リリースされてないため採用できませんでした。

    Q. Perlで謎の空 < h1> がありましたが罠ですか?
    A. Kossyにはもともと$greetingとか$site_nameという変数に文字列を入れる機能が入っていたのですが、それを潰したときに< h1>タグを削除するのを忘れていたようです。罠ではありません。

    ベンチマークツールについて


    Q.なんの言語で作ったんですか? 中身を解析しようとおもったけどバイナリでした
    A. @fujiwaraがGoで実装してネイティブバイナリにコンパイルしています。

    Q. --workloadオプションにより上がる並列数はどのぐらいですか?
    A. (N+1) * (N+1) * 2で並列数を設定していますので、1で8並列、2で18並列、3で32並列、4で50並列、5で72並列、6で98並列…と上がっていきます。あまり並列数を上げても限界がありますので、私の感覚だとworkload=2か3でちょうどいいくらい、環境によっては4でいいスコアがでるかもしれないというところでした。

    基本的にコンテンツを返すのにかかる時間が短くなればなるほど低めのworkloadのほうがよりよくベンチマークが回るといった印象です。

    Q. もしかして○○を○○するチートができませんか?
    A. いくつかチェックが甘い点が見つかっております! それにつきましては解答編でおしらせする予定です…


    その他にもなにかご質問などありましたらTwitterに #isucon タグを付けてつぶやいていただけると解答できるかもしれません。

    参加いただいたみなさん、ありがとうございました! 正式な最終結果は木曜日に発表予定となっておりますので、もうしばらくお待ちください。
    Read more...

    ↑このページのトップヘ