আপনি জানেন যে কর্মক্ষমতা একটি বৈশিষ্ট্য। এবং ডেভেলপমেন্টের সময় অনেক পারফরম্যান্স সমস্যা খুঁজে পাওয়া যায় এবং ঠিক করা যায়।
কিন্তু সেই মন্থরতা সম্পর্কে কী যা শুধুমাত্র উৎপাদনে দেখা যায়? আপনাকে কি কোডের প্রতিটি লাইনে লগ বার্তা যোগ করতে হবে? যে শুধু জিনিস আরও ধীর হবে! অথবা আপনি কি টন টন ছোট "হয়তো এটা ঠিক করে" পাঠাচ্ছেন কি লাঠি আছে দেখার জন্য?
এটি বিশ্লেষণ করার জন্য আপনাকে আপনার কোডটি নষ্ট করতে হবে না। পরিবর্তে, rbtrace
চেষ্টা করুন -এটা।
আপনার চলমান রুবি অ্যাপটি ট্রেস করুন
rbtrace-এর সাহায্যে, আপনি পারফরম্যান্স সমস্যা সনাক্ত করতে পারেন, অন্য রুবি প্রক্রিয়ার মধ্যে কোড চালাতে পারেন এবং কোনো কোড যোগ না করেই লগ মেথড কল করতে পারেন। শুধু gem "rbtrace"
যোগ করুন আপনার Gemfile
এ .
আমি রুবিতে মেমরি লিক ডিবাগ করার বিষয়ে স্যাম স্যাফ্রনের আশ্চর্যজনক পোস্ট থেকে rbtrace সম্পর্কে শিখেছি (যা আপনার সত্যিই পরীক্ষা করা উচিত, যদি আপনি ইতিমধ্যে না করে থাকেন)।
সেই পোস্টে, স্যাম 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}'
এটি দুর্দান্ত৷৷ তবে আপনি আরও অনেক কিছু করতে পারেন।
আরবিট্রেস দিয়ে আপনি কী করতে পারেন?
আপনি যে 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
সহ আপনি আপনার সার্ভারের ভিতরে রুবি কোড চালাতে পারেন:
~/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 আপনাকে স্টেজিং এবং উৎপাদনে আপনার রুবি প্রক্রিয়াগুলি পরিদর্শন করার জন্য প্রচুর সরঞ্জাম দেয়৷ আপনি দেখতে পারেন কিভাবে আপনার প্রসেস মেমরি ব্যবহার করছে (বা অপব্যবহার করছে), স্লো ফাংশন কল ট্রেস করছে এবং এমনকি রুবি কোড এক্সিকিউট করছে।
সমস্যা সমাধানের জন্য আপনাকে টন টেস্ট কমিট এবং লগ মেসেজ তৈরি করতে হবে না। আপনি শুধু সার্ভারে যেতে পারেন, কিছু ডেটা পেতে পারেন এবং ফিরে আসতে পারেন৷৷ এবং আমি সম্পূর্ণ না হলেও এটি এখনও উৎপাদনে ব্যবহার করতে সুবিধাজনক, আমি নিশ্চিত যে এটি আমাদের পরীক্ষার পরিবেশেও সাহায্য করবে৷
তোমার কী অবস্থা? আপনি কি জন্য rbtrace ব্যবহার করতে পারেন?