引っ越しました
新しいblogはこちらとなります http://blog.ohr486.net/
ansible-galaxyにelixirのroleを登録してみた
Ansible Galaxyに上がっているElixirをインストールするRoleなんですが、
等の問題があって使えなかったので作成しました。なお、以下の方針で作成しています。
- Erlangのインストールをkerlで行う
- Elixirはgithubのリポジトリから取得しインストールする
- AmazonLinux/CentOS/Fedoraをサポート、debian/ubuntuは後々対応させる
https://github.com/ohr486/ansible-elixir
https://galaxy.ansible.com/list#/roles/2930
role取得手順
$ ansible-galaxy install ohr486.elixir $ ansible-galaxy list - ohr486.elixir, v0.1
elixirインストールplaybook
- hosts: xxxxx sudo: yes roles: - { role: ansible-elixir, erlang_version: 17.4, elixir_version: v1.0.3 }
elixirインストール
$ ansible-playbook install_elixir_playbook.yml
お手軽ですね
ElixirとRailsのベンチマーク比較をした話
業務でAPIサーバーを作る事になり、何で実装しようか検討したという話です。
候補としてRails(定番)が上がっていたものの、
という事で他の選択を検討しました。
選択しとして
があがったので、RailsとElixirでAPIサーバーのプロトタイプを作ってベンチマーク比較をしてみました。
※ ElixirはErlangと同水準のBeamを吐くのでErlangは除外しています(ベンチを実際に計った結果、同程度の性能でした、こちらは別途結果を公開しようと思います)
またGo/Scalaについては僕自身そこまで熟知しているわけではないので今回は対象から外しています。
以下、プロトタイプのAPIサーバーの仕様です
- pingリクエストでpongを返す
- http://bench-server/ping -> pong
- mysqlからデータをJSONで取得、ただし複雑なクエリは投げない
- http://bench-server/users -> {user's json list}
https://github.com/ohr486/server_bench
使用したサーバーはAWS/EC2の、t2microインスタンス、OSは64bit CentOS7です。
以上の環境でabを使い、以下の様に計測しました。
- Rails: Rails4.2 + Ruby2.2 + nginx1.6.2 + unicorn4.8.2
- Elixir: Erlang17.4 + Elixir1.0.2 + Cowboy2.0
- DBアクセスをしないpingに対してリクエストをかける
- 各同時接続数毎に5回測定を行い、その平均を結果とする
- ab -n <同時接続数> -c <同時接続数>
- ab -n <同時接続数> -c <同時接続数>
- 同時接続を投げてエラーにならない最大同時接続数
- ElixirとRailsの最大接同時続数で接続数xNのアクセスを投げた場合の
- Request/Sec
- Time/Req
結果は以下となります。
https://docs.google.com/spreadsheets/d/1J8Rk9EwImbRifUPkqYdJuH9qzx8-szuLmNootQO6Z6U/edit#gid=0
(Failedが出ないギリギリの)最大同時接続数は
Rails: 130 / Elixir: 4900
最大同時接続時のRequest/Secは
Rails: 689 / Elixir: 4175
最大同時接続時のTime/Req(1リクエストあたり)は
Rails: 1.47msec / Elixir: 0.37msec
でした。
結論として、(webだけの性能を見れば)Elixirの方が良い結果が出ました。
もちろんRailsにもチューニングの余地がかなりあり、まだまだベンチ結果を上げる事は可能と思います。
ただどう頑張っても(僕のスキルでは)Elixirでの結果並みにRailsをチューニングで性能改善ができるイメージはわきませんでした。
(またRailsではなくSinatra等の軽量F/Wを使えばもっと良いベンチマーク結果がでると思います)
また今回のベンチマークではDBアクセスがありません(単純なping)が、DBアクセスのあるAPIのベンチマークを取れば、ElixirはDBがボトルネックになりここまでの性能は出ないと思います。(事実DBがボトルネックで他のAPIでは性能劣化しました)
以上をふまえて、僕の携わってるプロジェクトにてElixirの採用を決定しました。
おわり。
(注意)
このエントリは、Railsオセーという事を主張するものではありません。
APIサーバーにビジネスロジックをごりごり組み込むのであれば、Elixir/CowboyよりRailsを採用していたと思います。
事実、管理システムサイドはRailsを採用しております、要は適材適所という話で、たまたまElixir/Cowboyという選択肢があったので採用したのです。はい。
rubykaigi2014 3日目メモ
気になったキーワード等のメモ
1.Ohay〓 Rails (おはよう Rails)
ariel,fabrication,padrino,spree,whenever,activejob(rails4),bullet,ActionController::Metal
gem管理どうするか
pixiv 広告関連計測周りでfluentdを使用
未使用のgemを検出するgemが欲しいね
2.Speeding up Rails 4.2
the_metal(rack2.0のtest prj)
benchimark/ips
allcation_tracer
3.Practical meta-programming in Application
moro's slide @ speakers doc
4.Everything is Broken: A Story of Hope
TLS,OCSP
5.Fluentd Hacking Guide (Fluentd ソースコード完全解説)
6.The role of ruby in the single page app.
DeployVerifier @ cap
zendesk
7. Walking around ruby forest more deeply
ruby under a microscope
README.EXT : RubySourceFileMap
8.tending the ruby ecosystem
sinatra-contribute
裏のMake your own synchronization mechanism.を要チェック
9.Three Ruby usages - High-level interface, Glue and Embedding - Inside Droonga
Droonga
10.Ruby 2.1 in Production
github:ruby1.8.7 rails2.3 nginx
strace -c / posix-spawn gem
ree-2012.02
rblineprof
(in 2.1)
rb_profole_frames
rb_tracepoint_new
rb_tracepoint_new
GC.stat
GC::INTERNaL_CONSTANTS
ObjectSpace.dump
ObjectSpace.dump_all
ObjectSpace.trace_object_allocations
stackprof
stackprof:flamegraphs
#9934
peek
rubykaigi2014 2日目メモ
気になったキーワード等のメモ
1.Coming soon...
Concurrency,JIT,static typing
2.Extreme Makeover: Rubygems Edition
裏のA Just in Time compiler for CRuby (CRuby言語処理系向けJITコンパイラ) が素晴らしかったらしい、後でチェックする
3.Archeology of Ruby: Removed Features (Ruby 考古学 機能編)
4.<%= link_to "bundle", "update" %> - Make "bundle update" more fun to review
tachikoma.io便利そう
5.MRuby as Development Platform for Payments
6.The Twelve-factor Ruby 「Ruby を良くするための12のポイント」
7.Scalable deployments - How we deploy Rails app to 100+ hosts in a minute
serf
8.Resource Control Architecture scripting with mruby for a Web Server Separating Computer Resources Virtually at Each HTTP Request
mod_mruby
mod_cgroup
9.ServerEngine: a framework for multiprocess servers in Ruby
presto
starling
apache deltacloud
serverengine gem
github.com/ruby/ruby/pull/428
sigdump gem
Sneakers
https://github.com/fluent/serverengine
10.Kids, Ruby, Fun!: Introduction of the Smalruby and the Ruby Programming Shounendan
blockly
dxruby,dxruby_sdl,ruby/sdl
https://github.com/smalruby/smalruby-editor/
LT.
factory_girl : trait
ofruby
switch_point
norikura
trunspec
etc.
synvert
rubykaigi2014 1日目メモ
rubykaigiで気になったキーワード等のメモ。
1.CRuby Committers Who's Who in 2014
http://d.hatena.ne.jp/nagachika/
ruby-trunk-changesが素晴らしい、要チェック。
2.Building the Ruby interpreter -- What is easy and what is difficult?
ruby under a microscope の日本語訳版がもうすぐ出るらしい。
3.Symbol GC
immortal/motal symbol GC
4.Eliminating Giant VM Lock in Ruby through Hardware Transactional Memory
GVL,HTM
5.What's wrong with your app?
6.Introduce Oracle enhanced adapter for ActiveRecord, another choice for your Rails database.
7.Hypermedia: the Missing Element to Building Adaptable Web APIs in Rails
fizzbuzzaas
hypermicrodata gem
8."Gem of this Week" - building culture and making gem
9.Ruby committers vs the World
etc.
http://tachikoma.io/