Roppongi.rb#1( http://roppongirb.connpass.com/event/33502/ ) での発表スライドです。 - 本発表内容をまとめたブログ記事はこちら: http://blog.toshimaru.net/roppongirb-speeding-up-rails/

本記事は英語版ブログで公開された記事の翻訳版です。 パフォーマンスはどんなアプリケーション開発者にとっても大きな懸念です。問題なのは、人は往々にして、実際にパフォーマンスが下がりはじめ懸念すべき事態になるまで問題を放置しがちだという点です。パフォーマンス対策は前もって講じておくべきもので、ほころびが出はじめてから取りかかるのでは遅すぎます。たまのレビューで済ませるのではなく、プロセスの一環に組み込むことが必要です。この記事では、パフォーマンス向上のために開発者が自分でできるいくつかの対策について見ていきます。まずはデータベースです。 データベースのパフォーマンス Railsを使う場合、ActiveRecordやDataMapperといったORMを使えばアプリケーションからのデータ取得を楽にできますが、それだけにデータベースとのやりとりを改善する最適化やリファクタリングの重要性をおろそかにし
最近クックパッドでは、アプリケーションサーバの大半が Rails 2.3 から Rails 3 に置き換わったのですが*1、リリース前のベンチマークの時点ではあまりパフォーマンスが出ず四苦八苦していました。具体的には Rails 2.3 の時と比べ MRI 1.8.7 だとレスポンスタムが200%ぐらい遅い結果でした。Rails 3 になって実装が Merb core を取り入れ疎結合で綺麗になった反面、より多くのオブジェクトと・メモリを利用する様になった影響かと思います。 そこで Ruby インタプリタの変更*2を行い検証をしたところ MRI 1.8.7 (Rails 2.3と比べ) 約200%遅い MRI 1.8.7 -> Ruby Enterprise Edition 1.8.7 2011.03 (tcmalloc 無効) 約180%低速 MRI 1.8.7 -> Ruby Ente
ある事情で、サーバ上で多数のRailsアプリケーションを動かす必要性にせまられたので、1Railsアプリあたりの使用メモリ量を少しコンパクト化するべく、「Ruby Enterprise Edition」(REE)を試してみたところ、確かにメモリ使用量が削減された結果(当方例で約43.5%減)になったので、そのメモをエントリに残しておきます。 Ruby Enterprise Edition (REE) とは マイコミジャーナルから引用させていただくと、、、 REEはCRubyをベースにして開発されている実行環境。オフィシャルのCRubyと比較して平均で33%ほどRailsアプリケーションが使用するメモリ量を削減できるという特徴があるほか、実行パフォーマンスも改善される。 REEにおける性能向上の仕組みはガベージコレクタに対してCopy-on-Write拡張を導入することと、メモリアロケータ
query-reviewerはRails用のプラグインで、データベースにMySQLを使っている場合に、不適切な検索が行われていないかどうかを非常に簡単に調べることができる。(MySQL以外ではたぶん動かない。)使い方は非常に簡単で、 git clone git://github.com/dsboulder/query_reviewer.git vendor/plugins/query_reviewer するだけ。設定等はまったくいらない。インストールすると、Railsアプリの左上に「SQL DISABLED」というボタンっぽいのが出てくるので、そこをクリックしてENABLEDに変えてからページにアクセスすると、SQLの実行結果を教えてくれる。 スクリーンショットは開発者のブログで見られる。 大体、以下のような情報が得られる。 SQL EXPLAINの結果 SQLの実行時間 どれだけのSQ
社内システムにはRailsを使ってるシステムがあったりするんですが、バージョンアップのタイミングで大幅にアクセス数が増えたらパフォーマンスが出なくなったので、同じサーバーの違うポートでmongrelを複数動かすようにして、Apacheのリバースプロキシで負荷分散させつつ、アプリ側の負荷を少しでも下げる為にmod_deflateとmod_expireを使って少しYSlow対策を施してみました。 設定はこんな感じ。 <VirtualHost *:80> ServerName proxy.example.net # バランサーの設定(個々のアプリをバランサーのメンバーとして定義) <Proxy balancer://apps/> BalancerMember http://app.example.net:9001 loadfactor=10 keepalive=On BalancerMember
Rails Web アプリケーションをもっと速く こんなストーリーを考えてみます。 あなたは、Railsを学び、アプリケーションを作成し、サービスをインターネットに公開しました。しばらくすると、最初のユーザができます。あなたはとてもハッピーです。そうするうちにユーザが二人増え、十人になり、百人になりました。あなたはハッピーです、ユーザーもみんなハッピーです。 でも、ユーザが千人になり、一万人になり…。といった場合、何が起こるでしょうか? そこで起こるのはアプリケーションへの同時接続数増加によるサービス提供速度の低下です。ユーザ数が一万人を越えてしまうWebサーバに特有の問題は、C10K問題として知られています。 それでなくとも、残念ながらRailsは同様他種フレームワークと比べて、単位時間あたりの処理量が低いことで知られています。その理由は、RailsではRubyが遅くて、NativeTh
Railsは度々遅いということが話題に上がる。Ruby自体の性能もあるだろうが、データベースを富豪的に使っているのにも原因がある。便利であるためについついデータベースを多用していたり、データの取り出しを複雑(都度集計など)にしていないだろうか。 メイン画面 個人的な経験から言えばボトルネックになりがちなのはレンダリングとデータベースだ。このデータベースの問題点を洗い出すのに便利なのが、またしてもRailsアプリケーションだ。 今回紹介するフリーウェアはPalmist、RailsのMySQL実行履歴を見るソフトウェアだ。ソースはGithubで公開されているがライセンスは明記されていなかったので注意していただきたい。 Palmistは他のRailsアプリケーションのログファイルを読み取って、それを解析して表示してくれる。コントローラ、アクション、DBへのCRUDごとにリストアップしてくれる。実
Garbage Collection is Why Ruby on Rails is Slow: Patches to Improve Performance 5x; Memory Profiling The News: Ruby on Rails performance is dominated by garbage collection. We present a set of patches to greatly improve Rails performance and show how to profile memory usage to get further performance gains. What's at Stake: Rails is slow for many uses and did not lend itself well to optimization.
という記事があった、色々と面白かったので訳してみる。良いとこも悪いとこもあると思うけど参考までにメモとして 元記事:Top 10 Ruby on Rails performance tips Rubyの基本的なコードを見直してみる自分で作ったクラスよりもできるだけ組み込みのクラスライブラリを使うできるだけ正規表現を使用する、文字列処理にコストの高いループは避けるREXMLは遅いのでLibxmlライブラリを使用する (Cで書かれたXMLパーサらしい、環境に依存するのは嫌かもしれない)if文の多用は避ける、例えば||=を使う ( z||="none" で unless(z){ z = "none" })Hashはコストが高いので他のデータ構造を検討してみる (でも使いたいときあるよね?)キャッシュを有効活用する acts_as_cached でModelをキャッシュ化してみる(PDF資料
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く