Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

本番環境でRubyのパフォーマンスの問題をデバッグする方法

あなたはパフォーマンスが特徴であることを知っています。また、開発中に多くのパフォーマンスの問題を見つけて修正することができます。

しかし、本番環境でのみ表示される速度低下についてはどうでしょうか? コードのすべての行にログメッセージを追加する必要がありますか?それは物事をさらに遅くするでしょう!それとも、何がうまくいくかを確認するために、「おそらくこれで修正される」という小さなコミットメントを大量に出荷しますか?

分析するためにコードを台無しにする必要はありません。代わりに、rbtraceを試してください -ing。

実行中のRubyアプリをトレースします

rbtraceを使用すると、パフォーマンスの問題を検出し、別のRubyプロセス内でコードを実行し、コードを追加せずにメソッド呼び出しをログに記録できます。 gem "rbtrace"を追加するだけです Gemfileに 。

rbtraceについては、Rubyでのメモリリークのデバッグに関するSam Saffronのすばらしい投稿から学びました(まだチェックしていない場合は、実際にチェックする必要があります)。

その投稿で、Samはrbtraceを使用して、プロセスが使用したすべてのオブジェクトを確認しました。

bundle exec rbtrace -p $SIDEKIQ_PID -e 'Thread.new{GC.start;require "objspace";io=File.open("/tmp/ruby-heap.dump", "w"); ObjectSpace.dump_all(output: io); io.close}'

これは素晴らしいです。 しかし、できることはもっとたくさんあります。

rbtraceで何ができますか?

本番環境で実行しているSQLステートメント(およびそれらにかかった時間)を見たいと思ったことはありませんか?

~/Source/testapps/rbtrace jweiss$ rbtrace -p $RAILS_PID --methods "ActiveRecord::ConnectionAdapters::PostgreSQLAdapter#execute_and_clear(sql)"             
*** attached to process 7897
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter#execute_and_clear(sql="SELECT  \"articles\".* FROM \"articles\" WHERE \"articles\".\"id\" = $1 LIMIT 1") <0.002631>

2秒以上かかるすべてのメソッド呼び出し?

~/Source/testapps/rbtrace jweiss$ rbtrace -p $RAILS_PID --slow 2000
*** attached to process 8154
    Integer#times <2.463761>
        ArticlesController#create <2.558673>

特定のメソッドが呼び出されるたびに知りたいですか?

~/Source/testapps/rbtrace jweiss$ rbtrace -p $RAILS_PID --methods "ActiveRecord::Persistence#save" 
*** attached to process 8154
ActiveRecord::Persistence#save <0.010964>

アプリが実行しているスレッドを確認しますか?

~/Source/testapps/rbtrace jweiss$ rbtrace -p $RAILS_PID -e "Thread.list"
*** attached to process 8154
>> Thread.list
=> [#<Thread:0x007ff4fcc9a8a8@/usr/local/lib/ruby/gems/2.2.0/gems/puma-2.6.0/lib/puma/server.rb:269 sleep>, #<Thread:0x007ff4fcc9aa10@/usr/local/lib/ruby/gems/2.2.0/gems/puma-2.6.0/lib/puma/thread_pool.rb:148 sleep>, #<Thread:0x007ff4fcc9ab50@/usr/local/lib/ruby/gems/2.2.0/gems/puma-2.6.0/lib/puma/reactor.rb:104 sleep>, #<Thread:0x007ff4f98c0410 sleep>]

はい、-eを使用します サーバー内でRubyコードを実行できます:

~/Source/testapps/rbtrace jweiss$ rbtrace -p $RAILS_PID -e "ActiveRecord::Base.connection_config"
*** attached to process 8154
>> ActiveRecord::Base.connection_config
=> {:adapter=>"postgresql", :pool=>5, :timeout=>5000, :database=>"rbtrace_test"}

ええ、わかりました、今私は少し怖いです。しかし、それでも非常に いいね。 (そして、プロセスを混乱させる権限を持つユーザーだけがrbtraceを実行できるので、おそらく問題ありません)。

rbtraceは、ステージングと本番環境でRubyプロセスを検査するための多数のツールを提供します。 プロセスがメモリをどのように使用(または悪用)しているかを確認したり、低速の関数呼び出しをトレースしたり、Rubyコードを実行したりすることもできます。

問題を修正するために大量のテストコミットやログメッセージを作成する必要はありません。 サーバーにアクセスしてデータを取得し、元に戻すことができます。 そして、たとえ私が完全にでなくても まだ本番環境で快適に使用できますが、テスト環境でも役立つと確信しています。

君はどうでしょう? rbtraceを何に使用できますか?


  1. RubyでStructとOpenStructを使用する方法

    Rubyの構造体とは何ですか? 構造体は組み込みのRubyクラスであり、値オブジェクトを生成する新しいクラスを作成するために使用されます。値オブジェクトは、関連する属性を一緒に格納するために使用されます。 ここに例があります : Point 2つの座標(x &y 。 このデータはさまざまな方法で表すことができます。 いいね : 配列[10, 20] ハッシュ{ x: 10, y: 10 } オブジェクトPoint.new(10, 20) 複数のPointを使用する場合 、オブジェクトアプローチを使用することをお勧めします。 しかし… これら2つの値を一緒に格納するた

  2. Rubyプログラムをデバッグおよび修正する方法

    あなたのプログラムは、最初にあなたが望むことを正確に実行する頻度はどれくらいですか? 多くの場合、プログラムは期待どおりに機能しないため、ルビーのデバッグの技術を使用する必要があります。 理由を見つけるのに役立ちます。 次のエラーメッセージに精通している可能性があります。 undefined method some_method for nil:NilClass これは、nil値がコードへの道を見つけることができたことを意味します。 この記事で説明する手法を使用して、この問題や同様の問題に対処する方法を学びます。 エラーとスタックトレースを理解する Rubyインタープリターからエラー