性能測試最基本要考慮如下幾點:linux
一、時間特性,主要指的是軟件產品的事物響應時間(用戶發出請求到收到應答的這段時間)web
二、資源利用率,包括:cpu、內存、網絡、硬盤、虛擬內存(如Java虛擬機)算法
三、服務器可靠性,指服務器能在相對高負載狀況下持續的運行sql
四、可配置優化性,指服務器配置優化、業務邏輯優化、代碼優化等數據庫
性能指標:apache
一、響應時間緩存
響應時間是最能反應服務器性能的指標之一,也是用戶最關心的業務體驗。好比登陸某個商城網站時,只消耗1s鍾。在進行性能測試時,是經過對事務響應時間(Transaction Response Time)來分析服務器的響應速度。服務器
(通常響應時間在3s內,用戶會感受比較滿意。在3s~8s之間用戶勉強能接受,大於8s用戶就可能沒法接受,從而刷新頁面或者離開,僅供參考)網絡
二、吞吐量負載均衡
吞吐量表示單位時間內可以完成的事務數量,所以也被稱爲每秒事務數(Transaction Per Second),計算方式是完成的事務數除以時間。
三、服務器資源佔用
服務器資源佔是指在負載狀況下,系統的資源利用率。資源佔用越低,說明系統越優秀。例如,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的範圍,可能存在一些瓶頸。 |
總結:
一、硬件上的性能瓶頸:
通常指的是CPU、內存、磁盤讀寫等的瓶頸,爲服務器硬件瓶頸。
二、應用軟件上的性能瓶頸:
通常指的是服務器操做系統瓶頸(參數配置)、數據庫瓶頸(參數配置)、web服務器瓶頸(參數配置)、中間件瓶頸(參數配置)等
三、應用程序上的性能瓶頸:
通常指的是開發人員,開發出來的應用程序(如sql語句、數據庫設計、業務邏輯、算法等)。
四、操做系統上的性能瓶頸:
通常指的是Windows、linux等操做系統,如出現物理內存不足時,或虛擬內存設置不合理(虛擬內存設置不合理,會致使虛擬內存的交換率大大下降,從而致使行爲的響應時間大大增長,能夠認爲在操做系統上出現了性能瓶頸)。
五、網絡設備上的性能瓶頸:
通常指的是防火牆、動態負載均衡器、交換機等設備。
性能瓶頸緣由定位十分複雜,需抽絲剝繭逐一排除,以上信息僅供參考。