ansible-galaxyにelixirのroleを登録してみた

Ansible Galaxyに上がっているElixirをインストールするRoleなんですが、

  • Elixir 0.15 のみ対応
  • インストール方法がElixir公式サイトのアーカイブをダウンロードして解凍するだけ
  • erlangのバージョンがapt経由なので更新が遅い

等の問題があって使えなかったので作成しました。なお、以下の方針で作成しています。

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製)

という事で他の選択を検討しました。
選択しとして

  • Erlang ( + cowboy )
  • Elixir ( + cowboy )
  • Scala ( + akka )
  • Go

があがったので、RailsとElixirでAPIサーバーのプロトタイプを作ってベンチマーク比較をしてみました。

※ ElixirはErlangと同水準のBeamを吐くのでErlangは除外しています(ベンチを実際に計った結果、同程度の性能でした、こちらは別途結果を公開しようと思います)
またGo/Scalaについては僕自身そこまで熟知しているわけではないので今回は対象から外しています。

以下、プロトタイプのAPIサーバーの仕様です

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 <同時接続数>
  • 同時接続を投げてエラーにならない最大同時接続数
  • 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という選択肢があったので採用したのです。はい。

2015年目標

  • blogをもうちょっと書く

毎日とは言わないが週1位は維持したい、まだまだアウトプット量が断然少ない。

  • 英語勉強する

技術書なら洋書でも平気だけど、海外カンファレンスの動画とかだとさっぱり。
話せなくてもいいけど、せめて聞ける様にしたい。

  • ダイエット

2014年は-20kg、2015年は-10kgにして、標準体重にする。

  • サービス/ライブラリもっと書く

2014年のgithubのコミット履歴見る限りまだまだ少ない。

Rubyだけだと今の仕事がカバーできなくなりつつある。

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 RubyRuby を良くするための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/