This commit is contained in:
chai2010
2015-12-11 17:19:15 +08:00
parent fd6262f241
commit 643409dd27
4 changed files with 44 additions and 44 deletions

View File

@@ -1,22 +1,22 @@
## 11.5. 剖析
量基准对于衡量特定操作的性能是有助的, 但是, 当我们视图让程序跑的更快的候, 我通常不知道从哪里开始优化. 每个码农都应该知道 Donald Knuth 在1974年的 Structured Programming with go to Statements 上所的格言. 虽然经常被解读为不重性能的意思, 但是原文我可以看到不的含:
量基準對於衡量特定操作的性能是有助的, 但是, 噹我們視圖讓程序跑的更快的候, 我通常不知道從哪裡開始優化. 每個碼農都應該知道 Donald Knuth 在1974年的 Structured Programming with go to Statements 上所的格言. 雖然經常被解讀爲不重性能的意思, 但是原文我可以看到不的含:
> 无疑问, 效率会导致各种滥用. 程序需要浪大量的时间思考, 或者心, 被部分程序的速度所干扰, 实际上这些尝试提升效率的行可能产生强烈的负面影响, 特别是当调试和维护的时候. 我们不应该过度纠结于细节的优化, 应该说约97%的景: 早的化是万恶之源.
> 無疑問, 效率會導緻各種濫用. 程序需要浪大量的時間思考, 或者心, 被部分程序的速度所乾擾, 實際上這些嚐試提昇效率的行可能産生強烈的負麫影響, 特彆是噹調試和維護的時候. 我們不應該過度糾結於細節的優化, 應該説約97%的景: 早的化是萬惡之源.
>
> 我们当然不应该放弃那关键的3%的机会. 一好的程序员不会因为这个理由而足, 他们会明智地察和识别哪些是关键的代; 但是有在关键代码已经被确认的前提下才会进行优化. 对于判断哪些部分是关键代码是经常容易犯经验性错误的地方, 因此程序普通使用的量工具, 使得他的直很不靠.
> 我們噹然不應該放棄那關鍵的3%的機會. 一好的程序員不會因爲這個理由而滿足, 他們會明智地察和識彆哪些是關鍵的代; 但是有在關鍵代碼已經被確認的前提下纔會進行優化. 對於判斷哪些部分是關鍵代碼是經常容易犯經驗性錯誤的地方, 因此程序普通使用的量工具, 使得他的直很不靠.
当我们想仔细观察我程序的行速度的候, 最好的技是如何识别关键代码. 自化的剖析技是基程序行期一些抽样数据, 然后推断后面的执行状态; 最终产生一个运行时间的统计数据文件.
噹我們想仔細觀察我程序的行速度的候, 最好的技是如何識彆關鍵代碼. 自化的剖析技是基程序行期一些抽樣數據, 然後推斷後麫的執行狀態; 最終産生一個運行時間的統計數據文件.
Go言支持多种类型的剖析性能分析, 每一种关注不同的方, 但它都涉及到每个采样记录的感趣的一列事件消息, 每事件都包含函数调用时函数调用堆的信息. 建的 `go test` 工具对几种分析方式都提供了支持.
Go言支持多種類型的剖析性能分析, 每一種關註不衕的方, 但它都涉及到每個寀樣記彔的感趣的一列事件消息, 每事件都包含函數調用時函數調用堆的信息. 建的 `go test` 工具對幾種分析方式都提供了支持.
CPU分析文件标识了函数执行时所需要的CPU时间. 当前运行的系统线程在每隔毫秒都遇到操作系统的中事件, 每次中断时都会记录一个分析文件然后恢复正常的行.
CPU分析文件標識了函數執行時所需要的CPU時間. 噹前運行的繫統線程在每隔毫秒都遇到操作繫統的中事件, 每次中斷時都會記彔一個分析文件然後恢復正常的行.
堆分析则记录了程序的存使用情. 每个内存分配操作都会触发内部平均存分配例程, 每 512KB 的存申请都会触发一个事件.
堆分析則記彔了程序的存使用情. 每個內存分配操作都會觸發內部平均存分配例程, 每 512KB 的存申請都會觸發一個事件.
阻塞分析则记录了goroutine最大的阻塞操作, 例如系统调用, 管道送和接收, 还有获取锁等. 分析库会记录每个goroutine被阻塞的相操作.
阻塞分析則記彔了goroutine最大的阻塞操作, 例如繫統調用, 管道送和接收, 還有穫取鎖等. 分析庫會記彔每個goroutine被阻塞的相操作.
测试环境下需要一个标志参数就可以生成各分析文件. 一次使用多个标志参数时需要心, 因分析操作本身也可能影像程序的行.
測試環境下需要一個標誌蔘數就可以生成各分析文件. 一次使用多個標誌蔘數時需要心, 因分析操作本身也可能影像程序的行.
```
$ go test -cpuprofile=cpu.out
@@ -24,13 +24,13 @@ $ go test -blockprofile=block.out
$ go test -memprofile=mem.out
```
对于一些非测试程序也很容易支持分析的特性, 具体的实现方式和程序是短时间运行的小工具还是长时间运行的服务会有很大不, 因此Go的runtim运行时包提供了程序运行时控制分析特性的接口.
對於一些非測試程序也很容易支持分析的特性, 具體的實現方式和程序是短時間運行的小工具還是長時間運行的服務會有很大不, 因此Go的runtim運行時包提供了程序運行時控製分析特性的接口.
一旦我们已经收集到了用分析的采样数据, 我就可以使用 pprof 据来分析这些数据. 是Go工具箱自的一工具, 但不是一日常工具, 它对应 `go tool pprof` 命令. 命令有多特性和选项, 但是最重要的有两个, 就是生成这个概要文件的可行程序和对于的分析日文件.
一旦我們已經收集到了用分析的寀樣數據, 我就可以使用 pprof 據來分析這些數據. 是Go工具箱自的一工具, 但不是一日常工具, 它對應 `go tool pprof` 命令. 命令有多特性和選項, 但是最重要的有兩個, 就是生成這個概要文件的可行程序和對於的分析日文件.
了提高分析效率和少空, 分析日本身不包含函的名字; 它包含函数对应的地址. 也就是pprof需要和分析日志对于的可行程序. `go test` 命令通常会丢弃临时用的测试程序, 但是在用分析的时候会将测试程序保存 foo.test 文件, 其中 foo 部分对于测试包的名字.
了提高分析效率和少空, 分析日本身不包含函的名字; 它包含函數對應的地址. 也就是pprof需要和分析日誌對於的可行程序. `go test` 命令通常會丟棄臨時用的測試程序, 但是在用分析的時候會將測試程序保存 foo.test 文件, 其中 foo 部分對於測試包的名字.
的命令演示了如何生成一CPU分析文件. 我们选择 `net/http` 包的一个基准测试. 通常是基于一个已经确定了是关键代码的部分行基准测试. 基准测试会默认包含单元测试, 这里我们用 -run=NONE 禁止单元测试.
的命令演示了如何生成一CPU分析文件. 我們選擇 `net/http` 包的一個基準測試. 通常是基於一個已經確定了是關鍵代碼的部分行基準測試. 基準測試會默認包含單元測試, 這裡我們用 -run=NONE 禁止單元測試.
```
$ go test -run=NONE -bench=ClientServerParallelTLS64 \
@@ -57,13 +57,13 @@ Showing top 10 nodes out of 166 (cum >= 60ms)
50ms 1.39% 71.59% 60ms 1.67% crypto/elliptic.p256Sum
```
参数 `-text` 标志参数用于指定输出格式, 在这里每行是一个函数, 根使用CPU的时间来排序. 其中 `-nodecount=10` 标志参数限制了只输出前10行的果. 对于严重的性能问题, 这个文本格式基本可以帮助查明原因了.
蔘數 `-text` 標誌蔘數用於指定輸齣格式, 在這裡每行是一個函數, 根使用CPU的時間來排序. 其中 `-nodecount=10` 標誌蔘數限製了隻輸齣前10行的果. 對於嚴重的性能問題, 這個文本格式基本可以幫助査明原因了.
这个概要文件告诉我们, HTTPS基准测试`crypto/elliptic.p256ReduceDegree`数占用了近一般的CPU源. 相比之下, 如果一概要文件中主要是runtime包的存分配的函, 那么减少内存消耗可能是一值得尝试的优化策略.
這個概要文件告訴我們, HTTPS基準測試`crypto/elliptic.p256ReduceDegree`數佔用了近一般的CPU源. 相比之下, 如果一概要文件中主要是runtime包的存分配的函, 那麽減少內存消耗可能是一值得嚐試的優化策略.
对于一些更微妙的问题, 你可能需要使用 pprof 的图形显示功能. 这个需要安 GraphViz 工具, 可以 www.graphviz.org 下. 参数 `-web`生成一个有向图文件, 包含CPU的使用和最特的函等信息.
對於一些更微妙的問題, 你可能需要使用 pprof 的圖形顯示功能. 這個需要安 GraphViz 工具, 可以 www.graphviz.org 下. 蔘數 `-web`生成一個有曏圖文件, 包含CPU的使用和最特的函等信息.
这一节我们只是简单看了下Go言的分析工具. 如果想了解更多, 可以阅读 Go官方博客的 Profiling Go Programs 一文.
這一節我們隻是簡單看了下Go言的分析工具. 如果想了解更多, 可以閲讀 Go官方博客的 Profiling Go Programs 一文.