Ruby Profiler详解之stackprof
2019獨角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
##簡介
stackprof 是基于采樣的一個調(diào)優(yōu)工具,采樣有什么好處呢?好處就是你可以線上使用,按照內(nèi)置的算法抓取一部分?jǐn)?shù)據(jù),只影響一小部分性能。它會產(chǎn)生一系列的 dump 文件,然后你在線下分析這些文件,從而定位出問題,google有一篇基于采樣的論文,也基本證明了采樣是可行的。而 stackprof 也是深受 google 的 perftools 的影響,采用了采樣的方式來做調(diào)優(yōu)。
##基本使用方法
StackProf.run(mode: :cpu, out: './stackprof.dump') do# 你的代碼 end這里我們給出一段示例代碼,來作為測試目標(biāo):
require "stackprof"class Computedef m1"string" * 100enddef m2"string" * 10000enddef start100_000.times dom1m2endend endStackProf.run(mode: :cpu, out: './stackprof.dump') doCompute.new.start end保存為test.rb,同時執(zhí)行 ruby test.rb 就會在當(dāng)前目錄下生成 stackprof.dump 文件,我們用 stackprof 打開這個文件:
stackprof stackprof.dump --text ==================================Mode: cpu(1000)Samples: 1793 (0.61% miss rate)GC: 587 (32.74%) ==================================TOTAL (pct) SAMPLES (pct) FRAME1106 (61.7%) 1106 (61.7%) Compute#m298 (5.5%) 98 (5.5%) Compute#m11206 (67.3%) 2 (0.1%) block in Compute#start1206 (67.3%) 0 (0.0%) <main>1206 (67.3%) 0 (0.0%) Compute#start1206 (67.3%) 0 (0.0%) <main>1206 (67.3%) 0 (0.0%) block in <main>這里可以很明顯的看出是 m2 方法比較慢,占據(jù)了大部分的執(zhí)行時間,相比其他的調(diào)優(yōu)工具,它只是列出了用戶自己的方法所占時間比,在 ruby-prof 中的測試中,它是會顯示String#*這個方法的占比的,但是對于我們來說,它的意義不大,而 stackprof 是不會理會標(biāo)準(zhǔn)庫里的方法的。同時 stackprof 也是可以過濾方法的,比如我們發(fā)現(xiàn)了 m2 這個方法有問題,那么就可以把它過濾出來,看看細(xì)節(jié):
stackprof stackprof.dump --text --method 'Compute#m2'Compute#m2 (/Users/lizhe/Workspace/ruby-performance-tuning/test.rb:9)samples: 1106 self (61.7%) / 1106 total (61.7%)callers:1106 ( 100.0%) block in Compute#startcode:| 9 | end1106 (61.7%) / 1106 (61.7%) | 10 || 11 | def start我們可以看到 m2 這個方法定義在哪一個文件的哪一行,同時是誰調(diào)用了它,以及還顯示了它在源碼中的上下文。假如有多個方法調(diào)用了 m2 ,還會顯示出這幾個方法,以及他們調(diào)用 m2 所占的比例,也就是上面的 callers 部分,因為只有一個 start 方法調(diào)用了 m2,所以它是 100% 。
##在rack中的使用方法
stackprof 本身實現(xiàn)了一個 rack middleware ,所以可以很方便的掛載到一個 rack 應(yīng)用中:
use StackProf::Middleware, enabled: true, mode: :cpu, save_every: 5在 rails 中使用,先在 Gemfile 中添加 stackprof ,然后添加 middleware :
config.middleware.use StackProf::Middleware, enabled: true, mode: :cpu, save_every: 5然后請求你的應(yīng)用,多請求幾次,每5秒鐘它會保存一次輸出結(jié)果到tmp目錄中,查看其中某一個結(jié)果:
==================================Mode: cpu(1000)Samples: 155 (0.00% miss rate)GC: 11 (7.10%) ==================================TOTAL (pct) SAMPLES (pct) FRAME18 (11.6%) 18 (11.6%) Hike::Index#entries12 (7.7%) 12 (7.7%) Hike::Index#stat9 (5.8%) 9 (5.8%) #<Module:0x007fb72a0c7b08>.load_with_autoloading18 (11.6%) 9 (5.8%) Sprockets::Cache::FileStore#[]6 (3.9%) 6 (3.9%) block (2 levels) in BindingOfCaller::BindingExtensions#callers5 (3.2%) 5 (3.2%) Time.parse5 (3.2%) 5 (3.2%) Sprockets::Mime#mime_types5 (3.2%) 5 (3.2%) Pathname#chop_basename4 (2.6%) 4 (2.6%) block in ActionView::PathResolver#find_template_paths4 (2.6%) 4 (2.6%) block in BetterErrors::ExceptionExtension#set_backtrace15 (9.7%) 3 (1.9%) block in ActiveSupport::Dependencies#load_file2 (1.3%) 2 (1.3%) Temple::Mixins::CompiledDispatcher::DispatchNode#initialize5 (3.2%) 2 (1.3%) ActionDispatch::Cookies::EncryptedCookieJar#initialize2 (1.3%) 2 (1.3%) ActiveSupport::KeyGenerator#generate_key2 (1.3%) 2 (1.3%) block in ActionView::PathResolver#query4 (2.6%) 2 (1.3%) Slim::Parser#initialize113 (72.9%) 2 (1.3%) ActionView::Renderer#render_template2 (1.3%) 2 (1.3%) Hike::Trail#stat2 (1.3%) 2 (1.3%) block in ActiveSupport::Dependencies#search_for_file22 (14.2%) 2 (1.3%) block in Temple::Filters::MultiFlattener#on_multi20 (12.9%) 2 (1.3%) Temple::Filters::ControlFlow#dispatcher15 (9.7%) 2 (1.3%) ActionView::Renderer#render_partial1 (0.6%) 1 (0.6%) block in Slim::Parser#initialize1 (0.6%) 1 (0.6%) Pathname#prepend_prefix1 (0.6%) 1 (0.6%) String#blank?1 (0.6%) 1 (0.6%) ActiveSupport::SafeBuffer#initialize10 (6.5%) 1 (0.6%) Sprockets::Asset#dependency_fresh?1 (0.6%) 1 (0.6%) Sprockets::Asset#init_with1 (0.6%) 1 (0.6%) Hike::Index#sort_matches1 (0.6%) 1 (0.6%) block in ActiveSupport::Dependencies::Loadable#require可以利用這樣的方式調(diào)試線上的環(huán)境。
參考鏈接:
- https://github.com/tmm1/stackprof
本文系OneAPM工程師原創(chuàng)文章。OneAPM是中國基礎(chǔ)軟件領(lǐng)域的新興領(lǐng)軍企業(yè),能幫助企業(yè)用戶和開發(fā)者輕松實現(xiàn):緩慢的程序代碼和SQL語句的實時抓取。想技術(shù)文章,請訪問OneAPM官方技術(shù)博客。
轉(zhuǎn)載于:https://my.oschina.net/oneapmofficial/blog/476397
總結(jié)
以上是生活随笔為你收集整理的Ruby Profiler详解之stackprof的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Canvas 波形图
- 下一篇: 【小练习】“表格”制作及答案