性能測試最基本要考慮以下幾點:
1、時間特性,主要指的是軟體産品的事物響應時間(使用者送出請求到收到應答的這段時間)
2、資源使用率,包括:cpu、記憶體、網絡、硬碟、虛拟記憶體(如Java虛拟機)
3、伺服器可靠性,指伺服器能在相對高負載情況下持續的運作
4、可配置優化性,指伺服器配置優化、業務邏輯優化、代碼優化等
性能名額:
1、響應時間
響應時間是最能反應伺服器性能的名額之一,也是使用者最關心的業務體驗。比如登入某個商城網站時,隻消耗1s鐘。在進行性能測試時,是通過對事務響應時間(Transaction Response Time)來分析伺服器的響應速度。
(一般響應時間在3s内,使用者會感覺比較滿意。在3s~8s之間使用者勉強能接受,大于8s使用者就可能無法接受,進而重新整理頁面或者離開,僅供參考)
2、吞吐量
吞吐量表示機關時間内能夠完成的事務數量,是以也被稱為每秒事務數(Transaction Per Second),計算方式是完成的事務數除以時間。
3、伺服器資源占用
伺服器資源占是指在負載情況下,系統的資源使用率。資源占用越低,說明系統越優秀。例如,cpu的占用率、記憶體使用率、查詢Cache指令率、磁盤I/O讀寫速率等。
CPU常用計數器:
計數器 | 計數器分析 |
%Processor Time | 如果該值持續超過95%,表明瓶頸是cpu。 |
Processor Queue Length | 指待處理隊列中的線程數,如果在處理器隊列中總是有兩個以上的線程則通常表示處理器堵塞,處理器瓶頸會導緻該值持續大于2。此外,跟蹤計算機的伺服器工作隊列将顯示目前長度的Server Work Queues\Queue Length,隊列長度持續大于4則表示可能出現處理器擁塞。 |
%User Time | 表示消耗CPU的資料庫操作,如排序、執行aggregate functions等。如果該值很高,可考慮增加索引,盡量使用簡單的表連接配接、水準分割大表格等方法來降低該值。 |
%Privileged Time | 此計數器是特定時間的值,指(CPU核心時間)在特權模式下處理線程執行代碼所花時間的百分比,如果該參數的值和“Physical Disk”參數值一直很高,則表明I/O有問題。可考慮更換磁盤系統。 |
%DPC Time | 網卡CPU的占用率,該值越低越好。如果這個值大于50%并且Processor:%Processor Time非常高,說明提供的網絡已經受CPU影響無法飽和工作 |
記憶體常用計數器:
計數器 | 計數器分析 |
Available Mbytes | 可用實體記憶體數。如果Available Mbytes的值很小,則說明計算機上總的記憶體可能不足,或某程式沒有釋放記憶體。 |
Page/sec | 表明由于硬體頁面錯誤而從磁盤取出的頁面數,或由于頁面錯誤而從磁盤取出的頁面數,或由于頁面錯誤而寫入磁盤以釋放記憶體空間的頁面數。一般如果Page/sec持續高于幾百,那麼應該進一步研究交換活動,有可能需要增加記憶體,以減少換頁的需求。Page/sec的值很大,不一定表明記憶體有問題,而可能是運作使用記憶體映射檔案的程式所緻。 |
Page read/sec | 指頁的硬故障,是Page/sec的子集,為了解析對記憶體的引用,必須讀取頁檔案的次數。該數值越低越好,大于5時表示磁盤讀而不是緩沖讀。 |
Page Faults/sec | 指每秒鐘軟體頁面失效的數目,而Page/sec隻表明資料不能在指定記憶體中立即使用。 |
Cache Bytes | 檔案系統緩存(File System Cache),預設情況下為50%的可用實體記憶體,如果懷疑有記憶體洩露,請監視Memory \Available Bytes、Process\working set 和Process\Handle Count,如果懷疑是記憶體的程序Process\Private Bytes\Process\Working set 和Process\Handle Count,如果懷疑是核心模式程序導緻了洩露,則還應該監視Memory\pool Nonpaged Bytes、Memory\pool Nonpaged Allocs和Process(process_name)\Pool Nonpaged Bytes |
Pages/sec | 每秒鐘檢索的頁數,該數字應少于每秒1頁 |
Committed Bytes | 以位元組表示的确認虛拟記憶體,确認記憶體磁盤頁面檔案上保留了空間的實體記憶體。每個實體磁盤上可以有一個或一個以上的頁面檔案。這個計數器隻顯示上一回觀察到的值;它不是一個平均值。其實就是指有多少虛拟記憶體正在被使用,虛拟記憶體是占用硬碟空間的記憶體,和實體記憶體無關。 |
實體磁盤常用計數器:
計數器 | 計數器分析 |
%Disk Time | 指所選磁盤驅動器為讀或寫入請求提供服務所用時間的百分比。如果三個計數器都比較大,那麼磁盤不是瓶頸。如果隻有%Disk Time比較大,另外兩個都比較适中,則硬碟可能會是瓶頸。若數值持續超過80%,則可能的記憶體洩露。 |
Avg.Disk Queue Length | 它指的是目前磁盤的隊列長度。通俗點來解釋就是:計數器反映的磁盤完成請求所用的時間,較高的值表明磁盤控制器由于失敗而不斷重試該磁盤。這些故障會增加平均磁盤傳送時間。 |
Average Disk Read / Write Queue Length | 指讀取(寫入)請求(隊列)的平均數 |
Disk Reads(Writes)/sec | 實體磁盤上每秒磁盤讀/寫的次數,兩者相加,應小于磁盤裝置最大容量 |
Average Disk sec/Read | 指以秒計算的在此盤上讀取資料所需的平均時間 |
Average Disk sec/Transfer | 指以秒計算的在此盤上寫入資料所需的平均時間。一般來說,該值小于15ms最佳,15~30ms為良好,30~60ms為可以接受,超過60ms則需要考慮更換磁盤或磁盤的RAID方式了 |
Bytes Total/sec | 發送和接收位元組的速率,包括幀字元在内。判斷網絡連接配接速度是否是瓶頸,可以用該計數器的值和目前網絡的帶寬進行比較。 |
線程常用計數器:
計數器 | 計數器分析 |
Context Switch/sec | 如果決定要增加線程位元組池的大小,應該同時監視執行個體化inetinfo 和dllhost 程序這兩個計數器。增加線程可能會增加上下文切換次數,這樣性能不會上升,反而會下降。如果多個執行個體的上、下文切換值非常高,就應該減小線程位元組池。 |
程序常用計數器:
計數器 | 計數器分析 |
Process/ %Processor Time | 被處理器消耗的處理器時間數量。如果伺服器專用于SQL Server,則可接受的最大上限是80%~85% |
Page Faults/sec | 将程序産生的頁故障與系統産生的相比較,以判斷這個程序對系統頁故障産生的影響 |
Working set | 處理線程最近使用的記憶體頁,反映了每個程序使用的記憶體的數量,如果伺服器有足夠的空閑記憶體,頁就會被留在記憶體中,當自由記憶體少于一個特定的門檻值時,頁就會被消除記憶體。 |
Process/Private Bytes | 指程序所配置設定的無法與其他程序共享的目前位元組數量,該計數器主要用來判斷程序在性能測試過程中有無記憶體洩露。我們可以重點監控inetinfo程序的Private Bytes,如果在性能測試過程中,該程序Private Bytes計數器的值不斷增加,或是性能測試停止後一段時間,該程序的Private Bytes仍然持續較高水準,則說明應用存在記憶體洩露。 |
服務緩沖常用計數器:
計數器 | 計數器分析 |
File Cache Hits | 檔案緩存命中的具體值 |
File Cache Hits % | 全部緩存請求中,緩存命中次數所占的比例,反映了IIS的檔案緩存設定的工作情況。對于一個大部分是靜态網組成的網站,該值應該保持在80%左右。 |
File Cache Flushes | 自伺服器啟動之後檔案緩存重新整理的次數,如果重新整理太慢,會浪費記憶體;如果重新整理太快,緩存中的對象就會被頻繁的丢棄再重新生成,起不到緩存的作用,通過将File Cache Hits除以File Cache Flushes 可以得出緩存命中率對緩存清空率的比率。通過觀察這兩個值,可以得到一個适當的重新整理值 |
Connection Refused | 該數值越低越好,高數值表明網絡擴充卡或處理器存在瓶頸。 |
網絡常用計數器:
計數器 | 計數器分析 |
Bytes Total/sec | 發送和接收位元組的速度,包括幀字元在内,判斷網絡連接配接速度是否為瓶頸,可以用該計數器的值和目前網絡的帶寬相除,結果應該小于50%。 |
Apache常用計數器:
計數器 | 計數器分析 |
Apache CPU Usage apache | 伺服器CPU的占用率 |
Kbytes Sent/sec | 伺服器每秒發送的位元組數 |
Hits/sec | Apache 服務每秒的點選率 |
#Busy Workers | Apache 服務占用率 |
#Idle Workers | Apache 服務空閑率 |
Mysql 常用計數器:
計數器 | 計數器分析 |
Threads_connected | 表示目前有多少個客戶連接配接該Mysql伺服器,連接配接數是否過多,網絡是否存在問題,它是動态變化的。當Threads_connected ==max_connections時,資料庫系統就不能提供更多的連接配接數了,這時,如果程式還想建立連接配接線程,資料庫系統就會拒絕,如果程式沒做太多的錯誤處理,就會出現報錯資訊。 |
Threads_running | 如果資料庫超負荷了,将會得到一個正在(查詢的語句持續)增長的數值。這個值也可以小于預先設定的值。這個值在很短的時間内超過限定值是沒有問題的,如果超過預設值時且5s内沒有回落,就要同時監視其他的一些值。 |
Aborted_clients | 用戶端被異常中斷的數值(因為連接配接到Mysql伺服器的用戶端沒有正常地斷開或關閉)。對于一些應用程式是沒有影響的,但對于另一些應用程式可能要跟蹤該值,是以異常中斷連接配接可能表明一些應用程式有問題 |
Questions | 每秒獲得的查詢數量。也可以是全部查詢的數量,可以根據輸入不同的指令得到你想要的不同的值。 |
Handler_* | 如果想監視底層(low-level)資料庫負載,這些值是值得去跟蹤的。如果Handler_read_rnd_next值與正常值相差懸殊,可能是優化或索引出問題了,Handler_rollback表明事務被復原的查詢數量。 |
Opened_tables | 指表緩存沒有命中的數量。如果該值很大,就需要增加table_cache的數值。 |
Select_full_join | 沒有主鍵(key)聯合(join)的執行,該值可能是零。這是捕獲開發錯誤的好方法,因為這樣的查詢有可能降低系統的性能。 |
Select_scan | 執行全表搜尋查詢的數量,如果發現該值持續增長,說明需要優化,缺乏必要的索引或其他問題。 |
Select_queries | 超過該值(--long-query-time)的查詢數量,或沒有使用索引查詢數量。對于全部查詢會有小的沖突。如果該值增長,則表明系統有性能問題。 |
Threads_created | 該值一般較低。較高的值可能意味着需要增加thread_cache的數值,或遇到了持續增加的連接配接,表明存在潛在的問題。 |
Pending normal aio reads | 該值是innodb io 請求查詢的大小(size)。如果該值超出了10~20的範圍,可能存在一些瓶頸。 |
總結:
1、硬體上的性能瓶頸:
一般指的是CPU、記憶體、磁盤讀寫等的瓶頸,為伺服器硬體瓶頸。
2、應用軟體上的性能瓶頸:
一般指的是伺服器作業系統瓶頸(參數配置)、資料庫瓶頸(參數配置)、web伺服器瓶頸(參數配置)、中間件瓶頸(參數配置)等
3、應用程式上的性能瓶頸:
一般指的是開發人員,開發出來的應用程式(如sql語句、資料庫設計、業務邏輯、算法等)。
4、作業系統上的性能瓶頸:
一般指的是Windows、linux等作業系統,如出現實體記憶體不足時,或虛拟記憶體設定不合理(虛拟記憶體設定不合理,會導緻虛拟記憶體的交換率大大降低,進而導緻行為的響應時間大大增加,可以認為在作業系統上出現了性能瓶頸)。
5、網絡裝置上的性能瓶頸:
一般指的是防火牆、動态負載均衡器、交換機等裝置。
性能瓶頸原因定位十分複雜,需抽絲剝繭逐一排除,以上資訊僅供參考。