雙11備戰前夕,總繞不過性能壓測環節,TPS 一直上不去 / 不達標,除了代碼上的問題外,服務器環境、配置、網絡、磁盤、CPU 亦是致使性能瓶頸的重要一環,本文旨在分享最近項目性能壓測過程當中的排查經驗,文中的表單你能夠做爲排查手冊保存,若有不對之處,還請在評論區分享、交流你的經驗和觀點:)html
原文地址(樣式排版上更好點,另外文章的後續更新會及時體如今我的博客中) :https://blog.zhuliang.ltd/2019/08/Performance/test-with-perfmon.htmllinux
經過本文,你能夠了解和掌握:算法
關於吞吐量/吞吐率、延時,你能夠經過 Jmeter中的」聚合報告「和」用表格查看報告「來獲取。數據庫
定位的方式不必定是程序級別的,一開始能夠先從操做系統的 CPU 使用率,內存使用率,系統 IO 和 網絡 IO,網絡鏈接數 着手分析。windows
在服務器上最直觀監視性能的方式就是直接使用系統自帶的」性能監視器「。緩存
>perfmon #直接在 "運行" 中輸入 perfmon 便可打開
類別 | 計數器名稱 | 描述 | 結論 |
---|---|---|---|
Memory | Available M bytes | 當前空閒物理內存。 | 當這個數值變小時,說明 windows 開始頻繁地調用磁盤頁面文件,若是這個數值很小(如小於 5Mb,系統會將大部分時間消耗在操做頁面文件上),通常要保留 10% 的可用內存,此值太小多是內存不足或者內存泄漏。 |
Pages/sec | 是 Pages Input/sec 和 Pages Output/sec 總和。 | Pages/sec 推薦 0-20,若是服務器沒有足夠的內存處理其工做符合,此值數值將會一直很高,若是大於 80 ,表示有問題(太多的讀寫數據要訪問磁盤,可考慮增長內存或優化讀寫數據的算法),該系列的值比較低,說明請求響應比較快,不然多是服務器內存短缺引發(也多是緩存太大,致使系統內存太少。)通常若是Pages/sec 持續高於幾百,那麼應該進一步研究頁交換活動。有可能須要增長內存,以減小換頁的需求。Pages/sec 的值很大不必定代表內存有問題,而多是運行使用內存映射文件的程序所致。計數器的比率高表示分頁過多。 | |
Pages Read/sec | 讀取磁盤,以提取解決頁錯誤所需頁的次數。 | 其閾值爲 5,該值越低越好(越低,說明響應時間越短);該值大表示磁盤讀,而非緩存讀。 若是 Page Reads/sec 持續保持爲 5,表示可能內存不足。 | |
Page Faults/sec | 該值表示頁錯誤的個數: 當處理器向內存指定位置請求一頁(多是數據,也多是代碼)出現錯誤時,這就構成了一個「頁錯誤」。若是該頁在內存的其餘位置,該錯誤就被稱爲軟錯誤(用 Transition Fault/sec衡量);若是該頁必須從硬盤上從新讀取時,被稱爲硬錯誤。 | 許多處理器能夠在有大量軟錯誤的狀況下繼續操做,而硬錯誤會致使明顯的拖延。當進程使用的數據所處的內存頁不在內存中時,就會產生該值。若是某頁已經在主內存中,或者它正被共享此頁的其餘進程使用,那麼就不會從磁盤調入該頁。 | |
Cache Bytes | 分配在RAM中的駐留頁面數。 | 默認狀況下爲 50% 的可用內存。 | |
Committed Bytes | 指以字節表示的確認虛擬內存,是磁盤頁面文件上保留空間的物理內存。 | 不超過物理內存的 75% 。 | |
Process | %Processor Time | 處理器消耗的處理器時間,若是專用於某種特定應用(如數據庫服務器和應用服務器),則可用應用相關進程 %Process Time 進行衡量。 | 可接受的上限通常不超過 85% 。 |
Page Faults/sec | 將進程產生的頁故障與系統產生的相比較,以判斷該進程對系統頁故障產生的影響。 | ||
Working Set | 表示進程正在使用的物理內存的量。(至因而具體進程仍是全部進程,須要看監控實例是具體的仍是全部的。) | 系統在工做集中的內存頁進行尋址的時候,不會引起 Page Fault。另外,若是服務器有足夠的空閒內存,頁就會留在工做集中,而當空閒內存少於一個特定的閾值時,頁就會被清除出工做集中。 | |
Private Bytes | 此進程所分配的沒法與其餘進程共享的當前字節數量。若是系統性能隨着時間而下降,則此計數器能夠是內存泄漏的最佳指示器。 | ||
Processor | %Processor Time | 指處理器執行非閒置線程時間的百分比。此計數器能夠做爲處理器活動的主要指示器。(%Processor Time = 100% - Idle Process時間比例) | 若是該值持續超過95%,代表瓶頸是 CPU,能夠考慮增長或更換更快的處理器。正常狀況下,保持在 80%±5% 比較好,太低說明 CPU 利用率不高,太高表示是瓶頸是 CPU。雖然該計數器高不必定是壞事,但若是其餘處理器相關的計數器(如 Privileged Time 或者 Processor Queue Length)線性增長的話,高 CPU 使用率就值得調查了。 |
%User Time | 非內核操做耗費的CPU時間。通常來講,若是系統中使用了大量的算法或者複雜的計算操做,該值就會比較大。 | ||
%Privileged Time | 這個計數器表示一個線程在特權模式下所使用的時間比例,當你的程序調用操做系統的方法(如文件操做,I/O 或者分配內存)時,這些操做系統的方法就是在特權模式下運行的。 | 若是數值持續大於 75% 就表示存在瓶頸。 | |
%DPC Time | CPU 消耗在網絡處理上的時間。 | 該值越小越好。若是持續高 %DPC 時間,則可能存在 CPU 瓶頸或應用程序或硬件相關問題。 | |
%Interrupt Time | 表示 CPU 接收、處理硬件中斷所使用的時間比例。 | 閾值取決於處理器。通常,當該值 >15% 的時候說明可能存在硬件問題。 這個值間接指出產生中斷的硬件設備活動,好比網絡變化。這個計數器顯著增長的話表示硬件可能存在問題 | |
Interrupts/sec | 中斷率,表示每秒設備中斷 CPU 的次數,能夠產生中斷的裝置包括:系統定時器,鼠標,數據通信聯網,網絡卡以及其餘外部設備等。中斷操做在後臺完成。 | 該值閾值取決於處理器,但越低越好,不宜超過 1000,若是該值顯著增長而系統活動沒有相應的增長,則代表存在硬件問題,須要檢查引發中斷的網絡適配器、磁盤或其餘硬件。 | |
Physical Disk | %Disk Time | 指所選磁盤驅動器忙於讀/寫入請求所用的時間百分比。 | 正常值<10,此值過大表示耗費太多時間來訪問磁盤,可考慮增長內存、更換更快的硬盤、優化讀寫數據的算法。若數值持續超過 80(此時處理器和網絡並無飽和),則多是內存泄漏。 |
Current Disk Queue Length | 是在收集性能數據時磁盤上當前的請求數量。它還包括在收集時處於服務的請求。這是瞬態的快照,不是時間間隔的平均值。此計數器會反映暫時的高或低的隊列長度,可是若是磁盤驅動器被迫持續運行,它有可能一直處於高的狀態。 | 請求的延遲與此隊列的長度減去磁盤的軸數成正比。爲了提升性能,此差應該平均小於 2。 | |
Average Disk Queue Length | 指讀取和寫入請求的平均數。該值不該超過磁盤數的 1.5~2倍。要提升性能,可增長磁盤。注意,一個Raid Disk 實際有多個磁盤。 | 正常值應小於 5,此值持續過大表示磁盤 IO 太慢,要更換更快的硬盤。建議結合 Pages /sec 一塊兒分析,看是內存分頁過多致使磁盤一直在讀寫仍是就是磁盤問題。 | |
Average Disk Read/Write Queue Length | 指讀取/寫入請求(隊列)的平均數。 | ||
DiskRead(Writes)/sec | 物理磁盤上每秒磁盤讀、寫的次數。 | 二者相加,應該小於磁盤設備最大容量。 | |
Average Disk sec/Read | 指以秒計算的在磁盤上讀取數據所需的平均時間。 | ||
Average Disk sec/Write | 指以秒計算的在磁盤上寫入數據所需的平均時間。 | ||
Network Interface | Bytes Total/sec | 爲發送和接受字節的速率,包括幀字符在內。判斷網絡鏈接速度是不是瓶頸,能夠用該計數器的值和目前網絡的帶寬比較。 | 建議不要超過帶寬的 50% 。 |
System | %Total Processor Time | 系統上全部處理器都忙於執行非空閒線程的平均時間的百分比,該值反映了用於有用做業上的時間的比率。對單處理器系統來講,該值很容易理解;對多處理器來上,該值體現了全部處理器的平均繁忙程度。eg:若是全部處理器都繁忙,此值爲 100%,若是有一半的處理器繁忙,另外一半處理器徹底空閒,此值爲 50%。 | |
File Data Operation/sec | 計算機對文件系統設備執行讀取和寫入操做的速率。本計數器的計數不包括文件控制文件。 | ||
Processor Queue Length | 處理器隊列的線程數量,該計數器顯示的是等待中的線程數量,不包括正在運行的線程數量。 | 在 CPU 利用率 80~90% 的系統中,該值應爲 "[1,3] * 處理器數量":如在一臺 8 核處理器,該值在 [8, 24] 區間範圍內算正常;而在 CPU 利用率較低的系統上,該值應爲 [0,1],若持續大於 2,就有可能碰到了問題資源,須要進一步排查。 | |
Call/sec | 指運行在計算機上的全部處理器調用操做系統服務例行程序的綜合速率,這些例行程序執行全部在計算機上的如安排和同步活動等基本的程序,並提供對非圖形設備、內存管理和名稱空間管理的訪問。 | 該值跟 Processor.Interrupts/sec 聯合使用,若是 Processor.Interrupts/sec 大於 Call/sec,則說明系統中某一硬件產生了過多的終端。 | |
Context Switches/sec | 進程切換率,指計算機上的全部處理器所有從一個線程切換到另外一個線程的綜合速率。產生上下文的可能狀況:當正在運行的線程自動放棄處理器時出現上下文切換;一個有更高優先級的線程取代一個正在運行的低優先級線程的時候會發生上下文切換;在用戶模式和內核模式之間切換時產生上下文切換。 | 通常,該值小於 5000/秒/CPU 是不須要擔憂的。若是Context 該值達到 15000/秒/CPU 的話就是一個制約因素了,須要看下是否代碼致使(如過多的異步操做)。P.S.:上下文切換一樣會發生在許多線程擁有相同優先級的狀況,若是 CPU 使用率不高且 Context Swtich 很是低,那麼可能線程被堵塞。 | |
Web Service | Current Connections | 當前鏈接數(針對到 IIS 實例)。 | 結合壓測用戶/線程數進行分析。 |
Current Anonymous Users | 當前匿名鏈接數。 | 結合壓測用戶/線程數進行分析。 | |
Current NonAnonymous Users | 當前非匿名用戶/匿名鏈接數。 | 結合壓測用戶/線程數進行分析。 | |
Get/Put/Post Requests/sec | 使用Get/Put/Post 方式 HTTP 請求的速率。 |
參考性能優化
- 提升 IIS/P2P 併發數,請參見:(經過設置註冊表提升 P2P/IIS 併發數)[https://blog.zhuliang.ltd/2019/09/Performance/tcpip-max-limit.html]
Processor queue length:https://social.msdn.microsoft.com/Forums/vstudio/en-US/356b87a3-e8b1-48ad-9355-e68ce3eef754/processor-queue-length?forum=vstest服務器
Interrupt Time 說明:https://docs.microsoft.com/en-us/previous-versions/technet-magazine/cc718984(v=msdn.10)網絡
性能計數器:http://www.appadmintools.com/documents/windows-performance-counters-explained/多線程