Ecto/Agent/ETSの速度差比較のベンチへの突っ込み

せっかく頂いた知見が埋もれるのがもったいないので、まとめさせて頂きました。あと、Twitter の返信仕様がよくわからず、スレッドを台無しにしちゃってるのがツラいので。
0
hykw @hykw1234

計測してみた。etsがほんのり速い? agentで扱いにくいデータ量、種類だとまた違うんだろうな。 hykw/phoenix-bench-caching: Ecto/Agent/ETSの速度差比較 github.com/hykw/phoenix-b…

2016-07-28 17:50:41
V @voluntas

@hykw1234 おそらくですが ets と ecto の差がなさ過ぎるので、ベンチマークとしてはあまり意味がないものになってしまっていると思います。timer:tc/1 とかを使ってマイクロベンチマークをやられてみたほうが良いかもしれません。

2016-07-31 13:54:42
V @voluntas

@hykw1234 timer:tc/1 で ets:lookup/1 を触って頂くとわかるのですが 7-8 マイクロ秒で値が返ってきます。MySQL が 5 ミリ秒で返したとしても DB 的な差はかなり大きいはずです。

2016-07-31 13:56:12
V @voluntas

@hykw1234 MySQL が UnixDomain なのか TCP なのかでも 20% 程度は違うと思います。データベース以外の何かがボトルネックになっている可能性が大変高いと思います。プロファイルを取られた方が良いかもしれません。

2016-07-31 13:57:01
V @voluntas

@hykw1234 実際測定を行ってないいないため、推測での物言いで大変申し訳ありません。ご参考になれば幸いです。失礼しました。

2016-07-31 13:57:46
V @voluntas

@hykw1234 もしかして、ets や ecto を使おうが Phoenix 経由であれば他がボトルネックになるので余り変わらないという検証をされていたのでしたら、申し訳ありません … 。

2016-07-31 14:09:46
hykw @hykw1234

@voluntas (Twitter 使って日が浅いのでこれで返信になってるのか不安ですが)HTTP(Phoenix)ベースでやったのは、DBアクセスをAgent(=GenServer)かetsでキャッシングしようと思ったのがきっかけだからですね。

2016-07-31 14:16:14
hykw @hykw1234

@voluntas 「(実行する処理にもよりますが)1プロセスにアクセスを集中させると、そのプロセスがボトルネックになる」と「etsは多数のプロセスからアクセスしても(そう)性能が落ちないようにチューニングされている」というような記述を、どこかで読んだような記憶があったので、

2016-07-31 14:16:34
V @voluntas

@hykw1234 それ書いてるのは僕ですね。同一プロセスに対して秒間 20 万リクエストぐらい送ってみてください、ets も gen_server も queue が詰まって死にます。

2016-07-31 14:18:38
hykw @hykw1234

@voluntas 実際の所はどうだろうかとベンチしてみたのが件のデータです(むしろプロセスが詰まることを可視化したかった)。ただデータを返す/lookup する程度だと、(そのあたりの処理では)気にするほどの差異が出なかったので、キャッシングする程度ならまぁ気にしなくても

2016-07-31 14:16:53
V @voluntas

@hykw1234 その程度ではまったく問題にならないと思います。というか Web アプリレベルであれば特に問題なることはあまりないと思いますね。余程負荷が高くなければ大丈夫だと思います。

2016-07-31 14:21:56
hykw @hykw1234

@voluntas いいだろうと、そこでちょっと安心しちゃいました。Elixir/Erlang の経験がまだ浅いので、ツイートもgistもいつも参考にさせて頂いてます。ウゼーどころか、大変光栄です :-)

2016-07-31 14:17:02
V @voluntas

@hykw1234 グラフまで出していて大変素敵でしたので、ちょっと気になって口出ししてしまいました。

2016-07-31 14:21:20
V @voluntas

@hykw1234 ets は便利なのですが expire がないので、キャッシングする場合は memcached がお勧めです。マルチコアでスケールしますし。Elixir/Phoenix がわからないので申し訳ないですが … 。

2016-07-31 14:19:36
V @voluntas

@hykw1234 ets は Expire もなければ、LRU も無いので、メモリーリークになりがちです。なのでその辺は専用の memcached に任せちゃうのがイイと思いますね。memcached はマルチコアでスケールするのも魅力ですし。

2016-07-31 14:20:40
hykw @hykw1234

@voluntas (変な返信仕方をしてしまって、スレッド無茶苦茶で恐縮ですが)もろもろ、ちょっと安心しました。20万リクエストも無いですし、今回はexpireは不要なので知見を貯める意味でも、etsでやってみようかと思います。安心・勉強になりました。ありがとうございます。

2016-07-31 14:28:48
V @voluntas

@hykw1234 返信、お気になさらず。expire いらないなら ets 本当にお勧めですよ。public, set, named_table でやるのが良いですよ:-)

2016-07-31 14:44:26