性能測試分析與性能調優診斷--史上最全的服務器性能分析監控調優篇

       一個系統或者網站在功能開發完成後通常最終都須要部署到服務器上運行,那麼服務器的性能監控和分析就顯得很是重要了,選用什麼配置的服務器、如何對服務器進行調優、如何從服務器監控中發現程序的性能問題、如何判斷服務器的瓶頸在哪裏等 就成爲了服務器性能監控和分析時重點須要去解決的問題了。html

 本文章節目錄:java

1     服務器的性能監控和分析node

1.一、      Linux服務器的性能指標監控和分析mysql

1.1.1 、      經過vmstat深挖服務器的性能問題linux

1.1.2 、      如何經過mpstat 分析服務器的性能指標ios

1.1.3  、     從lsof中能看到什麼nginx

1.1.4 、      如何經過free看懂內存的真實使用web

1.1.五、       網絡流量如何監控redis

1.1.6 、   nmon對Linux服務器的總體性能監控算法

1.2 、     Windows服務器的性能指標監控和分析

1.2.一、    Windows性能監視器

1.2.二、    Windows性能監視器下的性能分析

備註:做者的原創文章,轉載須註明出處。原創文章歸做者全部,歡迎轉載,可是保留版權。對於轉載了博主的原創文章,不標註出處的,做者將依法追究版權,請尊重做者的成果。

本文做者:張永清  文章選自 做者2020年初即將出版的《性能測試分析與性能診斷調優核心思想》一書。

1.1 、 Linux服務器的性能指標監控和分析

1.1.1  、經過vmstat深挖服務器的性能問題

vmstat差很少是性能測試時在linux服務器上執行最多的命令,使用該命令每每能輔助咱們進行不少的性能問題定位。

 咱們先來看一下執行vmstat 命令後,獲取到的服務器的資源使用的監控數據有哪些。

 

咱們在執行vmstat 的時候,後面加了兩個參數,其中參數1表明每隔1秒獲取一次服務器的資源使用數據,10表明總共獲取10次。

指標

含義

r

r是第一列的監控數據,表明了目前實際在運行的指令隊列(也就是有多少任務須要CPU來進行執行),從數據來看,這臺服務器目前CPU的資源比較空閒,若是發現這個數據超過了服務器CPU的核數,就可能會出現CPU瓶頸了(在判斷時,還須要結合CPU使用的百分比一塊兒來看,也就是上圖中最後5列的數據指標),通常該數據超出了CPU核數的3個時,就比較高了,超出了5個就很高了,若是都已經超過了10時,那就很不正常了,服務器的狀態就很危險了。若是運行隊列超過CPU核數過多,表示CPU很繁忙,一般會形成CPU的使用率很高。

b

b是第二列的監控數據,表示目前由於等待資源而阻塞運行的指令個數,好比由於等待I/O、內存交換、CPU等資源而形成了阻塞,該值若是太高了的話,就須要檢查服務器上I/O、內存,CPU等資源是否是出現了瓶頸。

swpd

swpd是第三列的監控數據,表示虛擬內存(swap)已使用的大小(swap指的是服務器的物理運行內存不夠用的時候,會把物理內存中的部分空間釋放出來,以供須要運行的程序去使用,而那些釋放出來的空間可能來自一些很長時間沒有什麼操做的程序,這些被釋放的空間會被臨時保存到Swap中,等到那些程序要運行時,再從Swap分區中恢復保存的數據到內存中,swap分區通常使用的都是磁盤的空間,磁盤的I/O讀寫通常會比物理內存慢不少,若是存在大量的swap讀寫交換,將會很是影響程序運行的性能),也就是切換到內存交換區的內存數量(單位爲k),此處須要注意,並非swpd的值大於0,就是服務器的物理內存已經不夠用了,一般還須要結合si和so這兩個數據指標來一塊兒分析,若是si和so 還維持在0左右,那服務器的物理內存仍是夠用的。

free

free是第四列的監控數據,表示空閒的物理內存的大小,就是還有多少物理內存沒有被使用(單位爲k),這個free的數據是不包含buff和cache這兩列的數據值在內的。

buff

buff 是第五列的監控數據,表示做爲Linux/Unix系統的緩存的內存大小(單位爲k),通常對塊設備的讀寫才須要緩衝,通常內存很大的服務器,這個值通常都會比較大,操做系統也會自動根據服務器的物理內存去調整緩衝區的內存使用大小,以提升讀寫的速度。

cache

cache是第6列的監控數據,表示用來給已經打開的文件作緩衝的內存大小,cache直接用來記憶咱們打開的文件,把空閒的物理內存的一部分拿來作文件和目錄的緩存,是爲了提升程序執行的性能,當程序使用內存時,buffer/cached會很快地被使用,當空閒的物理內存不足時(即free的內存不足),這些緩存的內存即可以釋放出來。

si

si是第7列的監控數據,表示每秒從磁盤(虛擬內存swap)讀入到內存的大小,若是這個值長期大於0,那物理運行內存可能已是不夠用了。

so

so是第8列的監控數據,表示每秒寫入磁盤(虛擬內存swap)的內存大小,so恰好和si相反,si通常是將磁盤空間調入內存,so通常是將內存數據調入磁盤。

bi

bi是第9列的監控數據,表示塊設備每秒讀取的塊數量(從磁盤讀取數據,這個值通常表示每秒讀取了磁盤的多少個block),這裏的塊設備(block)是指系統上全部的磁盤和其餘塊設備,默認塊大小是1024byte。

bo

bo是第10列的監控數據,表示塊設備每秒寫入的塊數量(往磁盤寫入數據,這個值通常表示每秒有多少個block寫入了磁盤)。一般狀況下,隨機磁盤讀寫的時候,bi和bo這2個值越大(如超出1024k),能看到CPU在IO等待的值也會越大。

in

in是第11列的監控數據,表示 每秒CPU的中斷次數,包括時鐘中斷。

cs

cs是第12列的監控數據,表示 CPU每秒上下文切換次數,例如咱們調用系統函數,就要進行上下文切換,線程的切換,也要進程上下文切換,這個值要越小越好,太大了,要考慮調低線程或者進程的數目,例如在apache和nginx這種web服務器中,咱們通常作性能測試時會進行幾千併發甚至幾萬併發的測試,選擇web服務器的進程能夠由進程或者線程的峯值一直下調,壓測,直到cs到一個比較小的值,這個進程和線程數就是比較合適的值了。系統調用也是,每次調用系統函數,咱們的代碼就會進入內核空間,致使上下文切換,這個是很耗資源,也要儘可能避免頻繁調用系統函數。上下文切換次數過多表示你的CPU大部分浪費在上下文切換,致使CPU幹正經事的時間少了,CPU沒有充分利用,是不可取的。系統運行時,若是觀察到in和cs 這兩個指標很是高,那就須要對系統進行性能調優了。

us

us(user time)是第13列的監控數據,表示用戶模式CPU使用時間的百分比,該值通常越高,說明CPU被正常利用的越好,筆者曾經在給一個機器學習算法(密集型CPU應用)作壓力測試時,us的值能夠接近100,那說明CPU已經充分被算法服務使用了。

sy

sy是第14列的監控數據,表示系統內核進程執行時間百分比(system time),sy的值高時,說明系統內核消耗的CPU資源多,這並非一個服務器性能好的表現,一般in、cs、io的頻繁操做等太高,都會引發sy的指標太高,這個時候咱們應該要去定位緣由了。

id

 id是第15列的監控數據,表示空閒 CPU時間的佔比,通常來講,id + us + sy = 100,通常能夠認爲id是空閒CPU使用率,us是用戶CPU使用率,sy是系統CPU使用率。

wa

wa是第16列的監控數據,表示I/O等待時間百分比,wa的值高時,說明IO等待比較嚴重,這可能因爲磁盤大量做隨機訪問形成,也有可能磁盤出現瓶頸(塊操做)

st

st是第17列的監控數據,表示CPU等待虛擬機調度的時間佔比,這個指標通常在虛擬機中才會有,物理機中,該值通常維持爲0,咱們都知道虛擬機中的CPU通常是物理機CPU的虛擬核,一臺物理機通常會有多個虛擬機同時在運行,那麼此時虛擬機之間就會存在CPU的爭搶狀況,好比某臺虛擬機上運行着佔用CPU很高的密集型計算,就會致使其餘的虛擬機上的CPU須要一直等待密集型計算的虛擬機上CPU的釋放,st就是等待時間佔CPU時間的佔比,該值若是一直持續很高,那麼表示虛擬服務器須要長期等待CPU,運行在該服務器的應用程序的性能會受到直接的影響,筆者曾經在壓測時發現,該值越高,也會引發sy的值變高(由於操做系統內核須要不斷的去調度CPU)。

 

vmstat還能夠支持其餘的參數使用,咱們能夠經過執行vmstat  --help 命令查看到它支持的其餘參數

備註:做者的原創文章,轉載須註明出處。原創文章歸做者全部,歡迎轉載,可是保留版權。對於轉載了博主的原創文章,不標註出處的,做者將依法追究版權,請尊重做者的成果。

本文做者:張永清  文章選自 做者2020年初即將出版的《性能測試分析與性能診斷調優核心思想》一書。文章連接:http://www.javashuo.com/article/p-hnynqvbi-w.html

l         -a, --active 顯示活躍和非活躍的內存

l         -f, --forks 顯示操做系統從啓動至今的fork數量,fork通常指的就是啓動過的進程數量,linux操做系統用fork()函數來建立進程。

l         -m, --slabs 顯示slab的相關信息,slab是linux內核中按照對象大小進行分配的內存分配器,經過slab的信息能夠來查看各個內核模塊佔用的內存空間,能夠經過cat /proc/meminfo |grep Slab 命令查看Slab佔用的總內存大小,若是佔用的內存過大,那麼多是內核模塊出現了內存泄漏了。

l         -n, --one-header 這個參數表示只顯示頭部第一行的信息

l         -s, --stats  event counter statistics 顯示內存相關的統計信息及多種系統操做活動發生數量統計,好比CPU時鐘中斷的次數,CPU上下文切換的次數等。

l         -d, --disk  disk statistics 顯示每一塊磁盤I/O相關的明細信息

l         -D, --disk-sum 顯示磁盤I/O相關的彙總信息,-D 顯示的信息是對-d參數顯示的每一個磁盤塊的信息的彙總。

l         -p, --partition <dev>  partition specific statistics 顯示磁盤中某個分區的I/O讀寫信息。例如執行vmstat -p /dev/sda1 能夠顯示/dev/sda1這個分區的I/O讀寫的相關的信息。

 

l         -S, --unit <char>   define display unit 使用指定單位顯示。參數有 k 、K 、m 、M ,分別表明1000、102四、1000000、1048576字節(byte)。默認單位爲K(1024 bytes)

 

l         -w, --wide  wide output 這個參數用於調整命令輸出結果的顯示方式,輸出的結果和單獨執行vmstat命令獲得的結果是徹底同樣,只是在輸出時,會以更寬的寬度來展現數據。

 

l         -t, --timestamp        show timestamp 在vmstat命令輸出的數據的基礎上,增長每次獲取數據時的當前時間戳的輸出顯示

 

l         -V, --version  output version information and exit  輸出vmstat命令得版本信息

 

1.1.二、  如何經過mpstat 分析服務器的性能指標

linux中的mpstat 命令也是在性能測試時常常用來監控服務器總體性能指標的一種方式,mpstat命令和上面咱們講到的vmstat命令很是相似,咱們來看一下執行vmstat 命令後,獲取到的服務器的資源使用的監控數據。

咱們在執行mpstat的時候,後面一樣加了兩個參數,其中參數1表明每隔1秒獲取一次服務器的資源使用數據,10表明總共獲取10次,這點和vmstat的使用很相似。

l         %usr 表示的是用戶模式下CPU使用時間的百分比,和vmstat中獲得的us數據基本一致

l         %nice 表示CPU在進程優先級調度下CPU佔用時間的百分比,在操做系統中,進程的運行是能夠設置優先級的,linux操做系統也是同樣,優先級越高的,獲取到CPU運行的機會越高。這個值通常的時候都會是0.00,可是一旦咱們在程序運行時,修改過默認優先級時,%nice就會產生佔用時間的百分比,在linux中,執行top或者ps命令時,一般會輸出PRI/PR、NI、%ni/%nice這三個指標。

  1. PRI:表示進程執行的優先級,值越小,優先級就越高,會越早得到CPU的執行權。
  2. NI:表示進程的Nice值,表示進程可被執行的優先級的修正數值,PRI值越小會越早被CPU執行,在加入Nice值後,將會使得PRI的值發生變化,新的PRI值=老的PRI值+Nice值,那麼能夠看出PRI的排序是和Nice密切相關的,Nice值越小,那麼PRI值就會越小,就會越早被CPU執行,在Linux操做系統中若是Nice值相同時進程uid爲root進程的執行優先級會更高。一般狀況下,子進程會繼承父進程的Nice值,在操做系統啓動時init進程會被賦予0,其它進程(其它的進程基本都是init進程開闢的子進程)會自動繼承這個Nice值。
  3. %ni/%nice:能夠形象的表示爲改變過優先級的進程的佔用CPU的百分比,便可以理解爲Nice值影響了內核分配給進程的cpu時間片的多少。

l         %sys表示系統內核進程執行時間百分比(system time),該值越高時,說明系統內核消耗的CPU資源越多,和vmstat命令中的sy數據基本一致。

l         %iowait表示I/O等待時間百分比,該值越高時,說明IO等待越嚴重,和vmstat命令中的wa數據基本一致。

l         %irq表示用於處理系統中斷的 CPU 百分比,和vmstat命令中的in數據的含義相似,in越高,那麼%irq也會越高。

l         %soft表示用於軟件中斷的 CPU 百分比。

l         %steal 表示CPU等待虛擬機調度的時間佔比,這個指標通常在虛擬機中才會有,物理機中該值通常維持爲0,和vmstat命令中的st數據基本一致。

l         %guest表示運行vCPU(虛擬處理器)時所消耗的cpu時間百分比

l         %gnice表示運行降級虛擬程序所使用的CPU佔比

l         %idle表示空閒 CPU時間的佔比,和vmstat命令中的id數據基本一致。

咱們上面經過執行mpstat 1 10 獲取到的是服務器中全部的CPU核數的彙總數據,因此能夠看到在顯示時,CPU列顯示的爲all,若是咱們須要查看服務器中麼某一個CPU核的資源使用狀況,能夠在執行mpstat命令時,加上-P 這個參數,好比執行mpstat -P 0 1 10  命令能夠獲取到服務器中CPU覈編號爲0的CPU核的資源的使用狀況(CPU核的編號是從0開始,好比圖中咱們的服務器有2個CPU核那麼CPU核的編號就是0和1)。

備註:做者的原創文章,轉載須註明出處。原創文章歸做者全部,歡迎轉載,可是保留版權。對於轉載了博主的原創文章,不標註出處的,做者將依法追究版權,請尊重做者的成果。

本文做者:張永清  文章選自 做者2020年初即將出版的《性能測試分析與性能診斷調優核心思想》一書。文章連接:http://www.javashuo.com/article/p-hnynqvbi-w.html

1.1.3 、  從lsof中能看到什麼

lsof 是對Linux操做系統中對文件進行監控的一個經常使用命令,使用該命令能夠列出當前系統打開了哪些文件,系統中某個進程打開了哪些文件等。

咱們直接執行lsof便可以顯示當前操做系統打開了哪些文件,lsof命令必須運行在root用戶下,這是由於lsof命令執行時須要訪問核心內存和內核文件,以下圖所示,咱們直接執行lsof命令後獲得的結果。

l         第1列展現的爲進程的名稱,圖中顯示的進程名稱爲nginx。

l         第2列展現的爲進程的id編號(也就是Linux操做系統中常說的PID)

l         第3列展現的爲進程的全部者,也就是這個進程是運行在哪一個Linux用戶下的,能夠看到圖中的進程基本都是運行在root用戶下,這是由於我在啓動nginx時,就是在root用戶下來啓動的

l         第4列展現的爲文件描述符(File Descriptor number),常見的類型以下

文件描述符簡稱

英文全稱

中文解釋

cwd

current working directory

當前工做的目錄

mem

memory-mapped file

表明把磁盤文件映射到內存中

txt 

program text

進程運行的程序文件,包括編譯後的代碼文件以及產生的數據文件等,圖中的nginx命令文件就屬於txt類型。

rtd

root directory

表明root目錄

pd

parent directory

父目錄

DEL

a Linux map file that has been deleted

表明已經刪除的Linux映射文件

數字+字符,如0u、1w、2w等

 

0:表示標準輸出

1:表示標準輸入

2:表示標準錯誤

u:表示該文件被打開並處於讀取/寫入模式

r:表示該文件被打開並處於只讀模式

w:表示該文件被打開並處於只寫入模式

 

l         第5列展現的爲打開的文件類型,常見的類型以下

類型

英文全稱

解釋

DIR

directory

表明了一個文件目錄

CHR

character special file

特殊字符文件

LINK

symbolic link file

連接文件

IPv4

IPv4 socket

IPv4 套接字文件

IPv6

IPv6 network file

打開了一個IPV6的網絡文件

REG

regular file

普通文件

FIFO

FIFO special file

先進先出的隊列文件

unix

UNIX domain socket

unix下的域套接字,也稱inter-process communication socket,也就是常說的IPC scoket(進程間的通訊scoket),在開發中常常會被使用的一種通信方式。

MPB

multiplexed block file

多路複用的塊文件

MPC

multiplexed character file

多路複用的字符文件

inet

an Internet domain socket

Intent 域套接字

l         第6列展現的是使用character special、block special表示的設備號

l         第7列展現的是文件的大小(前提是文件有效)

l         第8列展現的是操做系統本地文件的node number或者協議類型(在網絡通信的狀況下會展現通信協議類型,好比以下nginx的LISTEN監聽進程就是一個TCP協議)

l         第9列展現的是文件的絕對路徑或者網絡通信連接的地址、端口、狀態或者掛載點等。

lsof 還能夠支持其餘的參數使用,常見的使用以下:

l         lsof –c 查看某個進程名稱當前打開了哪些文件,例如執行lsof –c nginx命令能夠查看nginx進程當前打開了哪些文件

l         lsof –p 查看某個進程id 當前打開了哪些文件,例如執行lsof –p 1 命令能夠查看進程id爲1的進程當前打開了哪些文件

l         lsof –i 查看IPv四、IPv6下打開的文件,此時看到的大部分都是網絡的連接通信,會包括服務端的LISTEN監聽或者客戶端和服務端的網絡通信。

在lsof –i後加上 :(冒號) 端口號時,能夠定位到某個端口下的IPv四、IPv6模式打開的文件和該端口下的網絡連接通信,例如執行lsof –i:80命令能夠查看一下80端口下的網絡連接通信狀況

從這個展現的通信狀況能夠看到,80端口下起了兩個LISTEN監聽進程,分別是在root用戶下和nobody用戶下,而且能夠看到ip爲192.168.1.100的電腦和80端口進行了TCP通信連接,TCP通信連接的狀態爲

ESTABLISHED,而且連接時佔用了服務器上的53151和53152 這兩個端口。

TCP通信連接是在作性能測試時常常須要關注的,尤爲是在高併發的狀況下如何優化TCP連接數和TCP連接的快速釋放,是性能調優的一個關注點。連接的經常使用狀態以下

 

狀態

解釋

LISTEN

監聽狀態,這個通常應用程序啓動時,會啓動監聽,好比nginx程序啓動後,就會產生監聽進程,通常的時候,監聽進程的端口都是能夠本身進行設置,以防止端口衝突

ESTABLISHED

連接已經正常創建,表示客戶端和服務端正在通信中。

CLOSE_WAIT

客戶端主動關閉鏈接或者網絡異常致使鏈接中斷,此時此次連接下服務端的狀態會變成CLOSE_WAIT,須要服務端來主動進行關閉該連接。

TIME_WAIT

服務端主動斷開連接,收到客戶端確認後連接狀態變爲TIME_WAIT,可是服務端並不會立刻完全關閉該連接,只是修改了狀態。TCP協議規定TIME_WAIT狀態會一直持續2MSL的時間纔會完全關閉,以防止以前連接中的網絡數據包由於網絡延遲等緣由延遲出現。處於TIME_WAIT狀態的鏈接佔用的資源不會被內核釋放,因此性能測試中若是服務端出現了大量的TIME_WAIT狀態的連接就須要分析緣由了,通常不建議服務端主動去斷開連接。

SYN_SENT

表示請求正在連接中,當客戶端要訪問服務器上的服務時,通常都須要發送一個同步信號給服務端的端口,在此時連接的狀態就爲SYN_SENT,通常SYN_SENT狀態的時間都是很是短,除非是在很是高的併發調用下,否則通常SYN_SENT狀態的連接都很是少。

 SYN_RECV

表示服務端接收到了客戶端發出的SYN請求而且服務器在給客戶端回覆SYN+ACK後此時服務端所處的中間狀態。

LAST_ACK

表示TCP鏈接關閉過程當中的一種中間狀態,關閉一個TCP鏈接須要發送方和接收方分別都進行關閉,雙方都是經過發送FIN(關閉鏈接標誌)來表示單方向數據的關閉,當通訊雙方發送了最後一個FIN的時候,發送方此時處於LAST_ACK狀態。

CLOSING

表示TCP鏈接關閉過程當中的一種中間狀態,通常存在的時間很短不是常常能夠看到,在發送方和接收方都主動發送FIN而且在收到對方對本身發送的FIN以前收到了對方發送的FIN的時候,兩邊就都進入了CLOSING狀態。

FIN_WAIT1

一樣是表示TCP鏈接關閉過程當中的一種中間狀態,存在的時間很短通常幾乎看不到,發送方或者調用方主動調用close函數關閉鏈接後會馬上進入FIN_WAIT1狀態,此時只要收到對端的ACK確認後立刻會進入FIN_WAIT2狀態。

FIN_WAIT2

一樣是表示TCP鏈接關閉過程當中的一種中間狀態,主動關閉鏈接的一方在等待對端FIN到來的過程當中一般會一直保持這個狀態。通常網絡中斷或者對端服務很忙還沒及時發送FIN或者對端程序有bug忘記關閉鏈接等都會致使主動關閉鏈接的一方長時間處於FIN_WAIT2狀態。若是主動關閉鏈接的一方發現大量FIN_WAIT2狀態時, 應該須要去檢查是否是網絡不穩定或者對端的程序存在鏈接泄漏的狀況。

 

在TCP協議層中有一個FLAGS字段,這個字段通常包含SYN(創建鏈接標誌)、 FIN(關閉鏈接標誌)、 ACK(響應確認標誌)、 PSH(DATA數據傳輸標誌)、 RST(鏈接重置標誌)、 URG(緊急標誌)這幾種標誌,每種標誌表明一種鏈接信號。

 

 


無論是什麼狀態下的TCP連接,都會佔用服務器的大量資源,並且每一個連接都會佔用一個端口,Linux服務器的TCP和UDP的端口總數是有限制的(0-65535),超過這個範圍就沒有端口能夠用了,程序會沒法啓動,連接也會沒法進行。因此若是服務端出現了大量的CLOSE_WAIT和TIME_WAIT的連接時,就須要去及時去查找緣由和進行優化。CLOSE_WAIT狀態通常大部分的時候,都是本身寫的代碼或者程序出現了明顯的問題形成。 

針對若是出現了大量的TIME_WAIT狀態的連接,能夠從服務器端進行一些優化以讓服務器快速的釋放TIME_WAIT狀態的連接佔用的資源。優化的方式以下

使用vim /etc/sysctl.conf來編輯sysctl.conf文件以優化Linux操做系統的文件內核參數設置,加入以下配置:

net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30

net.ipv4.tcp_keepalive_time=600

net.ipv4.tcp_max_tw_buckets = 5000

fs.file-max = 900000

net.ipv4.tcp_max_syn_backlog = 2000

net.core.somaxconn = 2048

net.ipv4.tcp_synack_retries = 1

net.ipv4.ip_local_port_range =1000    65535

net.core.rmem_max = 2187154

net.core.wmem_max = 2187154

net.core.rmem_default = 250000

net.core.wmem_default = 250000

而後執行sysctl –p命令能夠內核讓參數當即生效,這種調優通常在nginx、apache 這種web服務器上會常常用到。

  • net.ipv4.tcp_syncookies = 1 表示開啓syn cookies,當出現syn等待隊列溢出時啓用cookies來處理,默認狀況下是關閉狀態。客戶端向linux服務器創建TCP通信連接時會首先發送SYN包,發送完後客戶端會等待服務端回覆SYN+ACK,服務器在給客戶端回覆SYN+ACK後,服務器端會將此時處於SYN_RECV狀態的鏈接保存到半連接隊列中以等待客戶端繼續發送ACK請求給服務器端直到最終連接徹底創建,在出現大量的併發請求時這個半連接隊列中可能會緩存了大量的SYN_RECV狀態的連接從而致使隊列溢出,隊列的長度能夠經過內核參數net.ipv4.tcp_max_syn_backlog進行設置,在開啓cookies後服務端就不須要將SYN_RECV狀態的半狀態連接保存到隊列中,而是在回覆SYN+ACK時將連接信息保存到ISN中返回給客戶端,當客戶端進行ACK請求時經過ISN來獲取連接信息以完成最終的TCP通信連接。
  • net.ipv4.tcp_tw_reuse = 1 表示開啓連接重用,即容許操做系統將TIME-WAIT socket的連接從新用於新的tcp連接請求,默認爲關閉狀態。
  • net.ipv4.tcp_tw_recycle = 1 表示開啓操做系統中TIME-WAIT socket連接的快速回收,默認爲關閉狀態。
  • net.ipv4.tcp_fin_timeout = 30 設置服務器主動關閉連接時,scoket連接保持等待狀態的最大時間。
  • net.ipv4.tcp_keepalive_time = 600 表示請求在開啓keepalive(如今通常客戶端的http請求都是開啓了keepalive選項)時TCP發送keepalive消息的時間間隔,默認是7200秒,在設置短一些後能夠更快的去清理掉無效的請求。
  • net.ipv4.tcp_max_tw_buckets = 5000 表示連接爲TIME_WAIT狀態時linux操做系統容許其接收的套接字數量的最大值,過多的TIME_WAIT套接字會使Web服務器變慢
  • fs.file-max  = 900000 表示linux操做系統能夠同時打開的最大句柄數,在web服務器中,這個參數有時候會直接限制了web服務器能夠支持的最大連接數,須要注意的是這個參數是對整個操做系統生效的。而ulimit –n 能夠用來查看進程可以打開的最大句柄數,在句柄數不夠時通常會出現相似」 Too many open files」的報錯。在Centos7中可使用cat /proc/sys/fs/file-max 命令來查看操做系統能夠可以打開的最大句柄數。
  • 使用vi /etc/security/limits.conf 編輯limits.conf配置文件,能夠修改進程可以打開的最大句柄數,在limits.conf增長以下配置便可
soft nofile 65535

hard nofile 65535
  • net.ipv4.tcp_max_syn_backlog 表示服務器能接受SYN同步包的最大客戶端鏈接數,也就是上面說的半鏈接的最大數量,默認值爲128
  • net.core.somaxconn = 2048 表示服務器能處理的最大客戶端鏈接數,這裏的鏈接指的是能同時完成鏈接創建的最大數量,默認值爲128
  • net.ipv4.tcp_synack_retries = 1 表示服務器在發送SYN+ACK回覆後,在未繼續收到客戶端的ACK請求時服務器端從新嘗試發送SYN+ACK回覆的重試次數
  • net.ipv4.ip_local_port_range =2048    65535 修改能夠用於和客戶端創建鏈接的端口範圍,默認爲32768到61000,修改後,能夠避免創建鏈接時端口不夠用的狀況。
  • net.core.rmem_max = 2187154  表示linux操做系統內核scoket接收緩衝區的最大大小,單位爲字節
  • net.core.wmem_max = 2187154表示linux操做系統內核scoket發送緩衝區的最大大小,單位爲字節
  • net.core.rmem_default = 250000 表示linux操做系統內核scoket接收緩衝區的默認大小,單位爲字節
  • net.core.wmem_default = 250000表示linux操做系統內核scoket發送緩衝區的默認大小,單位爲字節

 

備註:做者的原創文章,轉載須註明出處。原創文章歸做者全部,歡迎轉載,可是保留版權。對於轉載了博主的原創文章,不標註出處的,做者將依法追究版權,請尊重做者的成果。本文做者:張永清  文章選自 做者2020年初即將出版的《性能測試分析與性能診斷調優核心思想》一書。文章連接:http://www.javashuo.com/article/p-hnynqvbi-w.html

l         lsof +d 列出指定目錄下被使用的文件,例如執行lsof +d /usr/lib/locale/ 命令查看/usr/lib/locale/ 目錄下有哪些文件被打開使用了

l         lsof +D 和上面+d 參數的做用相似,也是列出指定目錄下被使用的文件,不一樣的是+D會以遞歸的形式列出,也就是會列出指定目錄下全部子目錄下被使用的文件,而-d 參數只會列出當前指定目錄下被使用的文件,

而不會繼續去列出子目錄下被使用的文件,例如執行lsof +D /usr/lib/ 命令查看/usr/lib/ 目錄以及子目錄下有哪些文件被打開使用了

l         lsof 後面能夠直接指定一個全路徑的文件以列出該文件正在被哪些進程所使用,例如執行lsof /usr/lib/modules/3.10.0-862.el7.x86_64/modules.symbols.bin 命令能夠查看到modules.symbols.bin文件目前正在被那個

進程使用

l         lsof –i:@ip 能夠列出某個指定ip上的全部網絡鏈接通信,例如執行lsof -i@192.168.1.221 命令能夠查看到192.168.1.221這個ip上的全部的網絡鏈接通信

l         lsof –i 網絡協議 能夠列出某個指定協議下的網絡鏈接信息

lsof –i tcp 命令能夠列出tcp下全部的網絡鏈接信息

  • lsof -i tcp:80 命令能夠列出tcp下80端口全部的網絡鏈接信息

  • lsof –i udp 命令能夠列出udp下全部的網絡鏈接信息

  • lsof -i udp:323 命令能夠列出udp下323端口全部的網絡鏈接信息

1.1.4    如何經過free看懂內存的真實使用

free命令是linux操做系統中對內存進行查看和監控的一個經常使用命令,咱們能夠直接執行free命令來看下能夠獲取到操做系統內存使用的哪些數據

默認直接執行free 獲取到的內存數據的單位都是k,Mem這一行展現的是物理內存的使用狀況,Swap這一行展現的是內存交換區(一般也叫虛擬內存)的總體使用狀況。

l         total列展現的爲系統總的可用物理內存和交換區的大小,單位爲k

l         used列展現的爲已經被使用的物理內存和交換區的大小,單位爲k

l         free列展現的爲還有多少物理內存和交換區沒有被使用,單位爲k

l         shared 列展現的爲共享區佔用的物理內存大小,單位爲k

l         buff/cache 列展現的爲被緩衝區和page高速緩存合計使用的物理內存大小,單位爲k

  • buff在操做系統中指的是緩衝區,是負責磁盤塊設備的讀寫緩衝,會直接佔用物理內存。
  • cache 指的是操做系統中的 page cache(也就是一般所說的高速緩存),高速緩存是linux內核實現的磁盤緩存,能夠減小內核對磁盤的I/O讀寫操做,會將磁盤中的數據緩存到物理內存中,這樣對磁盤的訪問就會變爲對物理內存的訪問,從而大大提升了讀寫速度。cache 有一點相似應用程序中使用redis來作緩存同樣,把一些常常須要訪問的數據存儲到內存中來提升訪問的速度。

l         available 列展現的爲還能夠被使用的物理內存的大小,單位爲k。一般狀況下,available 的值等於free+ buff/cache ,linux內核爲了提升磁盤讀寫的速度會使用一部分物理內存去緩存常常被使用的磁盤數據,因此buffer 和 cache對於Linux操做系統的內核來講都屬於已經被使用的內存,而free列展現的是真實未被任何地方使用的物理內存,可是若是物理內存已經不夠用而且應用程序恰巧又須要使用內存時內核就會從 buffer 和 cache 中回收內存來知足應用程序的使用,也就是說buffer 和 cache佔用的內存是能夠被內核釋放的。

1.1.5  、 網絡流量如何監控

備註:做者的原創文章,轉載須註明出處。原創文章歸做者全部,歡迎轉載,可是保留版權。對於轉載了博主的原創文章,不標註出處的,做者將依法追究版權,請尊重做者的成果。

本文做者:張永清  文章選自 做者2020年初即將出版的《性能測試分析與性能診斷調優核心思想》一書。

在linux中,可使用iftop命令來對服務器網卡的網絡流量進行監控,iftop並非linux操做系統中自己就有的工具,須要單獨進行安裝,能夠從http://www.ex-parrot.com/~pdw/iftop/ 網站中下載iftop工具。

 

 

 

下載完成後,首先執行./configure 命令進行安裝前的自動安裝配置檢查

[root@localhost iftop-1.0pre4]# ./configure

checking build system type... x86_64-unknown-linux-gnu

checking host system type... x86_64-unknown-linux-gnu

checking target system type... x86_64-unknown-linux-gnu

checking for a BSD-compatible install... /usr/bin/install -c

checking whether build environment is sane... yes

checking for a thread-safe mkdir -p... /usr/bin/mkdir -p

checking for gawk... gawk

checking whether make sets $(MAKE)... yes

checking whether make supports nested variables... yes

checking for gcc... gcc

checking whether the C compiler works... yes

checking for C compiler default output file name... a.out

checking for suffix of executables...

checking whether we are cross compiling... no

checking for suffix of object files... o

checking whether we are using the GNU C compiler... yes

checking whether gcc accepts -g... yes

checking for gcc option to accept ISO C89... none needed

checking whether gcc understands -c and -o together... yes

checking for style of include used by make... GNU

checking dependency style of gcc... gcc3

checking how to run the C preprocessor... gcc -E

checking for grep that handles long lines and -e... /usr/bin/grep

checking for egrep... /usr/bin/grep -E

checking for ANSI C header files... yes

checking for sys/types.h... yes

checking for sys/stat.h... yes

checking for stdlib.h... yes

checking for string.h... yes

checking for memory.h... yes

checking for strings.h... yes

checking for inttypes.h... yes

checking for stdint.h... yes

checking for unistd.h... yes

checking sgtty.h usability... yes

checking sgtty.h presence... yes

checking for sgtty.h... yes

checking sys/ioctl.h usability... yes

checking sys/ioctl.h presence... yes

checking for sys/ioctl.h... yes

checking sys/time.h usability... yes

checking sys/time.h presence... yes

checking for sys/time.h... yes

checking sys/sockio.h usability... no

checking sys/sockio.h presence... no

checking for sys/sockio.h... no

checking termio.h usability... yes

checking termio.h presence... yes

checking for termio.h... yes

checking termios.h usability... yes

checking termios.h presence... yes

checking for termios.h... yes

checking for unistd.h... (cached) yes

checking for an ANSI C-conforming const... yes

checking for size_t... yes

checking whether time.h and sys/time.h may both be included... yes

checking sys/dlpi.h usability... no

checking sys/dlpi.h presence... no

checking for sys/dlpi.h... no

checking for regcomp... yes

checking for select... yes

checking for strdup... yes

checking for strerror... yes

checking for strspn... yes

checking for library containing socket... none required

checking for library containing log... -lm

checking for gethostbyname... yes

checking for library containing inet_aton... none required

checking for library containing inet_pton... none required

checking for inet_aton... yes

checking for inet_pton... yes

checking size of u_int8_t... unknown type

checking size of u_int16_t... unknown type

checking size of u_int32_t... unknown type

checking for stdint.h... (cached) yes

checking for library containing getnameinfo... none required

checking for library containing gethostbyaddr_r... none required

checking how to call gethostbyaddr_r... 8 args, int return

checking gethostbyaddr_r usability... yes

checking where to find pcap.h... /include

checking for pcap_open_live in -lpcap... yes

checking pcap.h usability... yes

checking pcap.h presence... yes

checking for pcap.h... yes

checking for a curses library containing mvchgat... -lcurses

checking POSIX threads compilation... CFLAGS= and LIBS=-lpthread

checking POSIX threads usability... yes

checking if we need to enable promiscuous mode by default... no

checking that generated files are newer than configure... done

configure: creating ./config.status

config.status: creating Makefile

config.status: creating config/Makefile

config.status: creating config.h

config.status: executing depfiles commands

configure: WARNING:

******************************************************************************

 

This is a pre-release version.  Pre-releases are subject to limited

announcements, and therefore limited circulation, as a means of testing

the more widely circulated final releases.

 

Please do not be surprised if this release is broken, and if it is broken, do

not assume that someone else has spotted it.  Instead, please drop a note on

the mailing list, or a brief email to me on pdw@ex-parrot.com

 

Thank you for taking the time to be the testing phase of this development

process.

 

Paul Warren

 

******************************************************************************

備註:做者的原創文章,轉載須註明出處。原創文章歸做者全部,歡迎轉載,可是保留版權。對於轉載了博主的原創文章,不標註出處的,做者將依法追究版權,請尊重做者的成果。

本文做者:張永清  文章選自 做者2020年初即將出版的《性能測試分析與性能診斷調優核心思想》一書。文章連接:http://www.javashuo.com/article/p-hnynqvbi-w.html

配置安裝檢查經過後,執行make && make install 命令對源碼先進行編譯,而後進行安裝

[root@localhost iftop-1.0pre4]# make && make install

make  all-recursive

make[1]: Entering directory `/home/iftop/iftop-1.0pre4'

Making all in config

make[2]: Entering directory `/home/iftop/iftop-1.0pre4/config'

make[2]: Nothing to be done for `all'.

make[2]: Leaving directory `/home/iftop/iftop-1.0pre4/config'

make[2]: Entering directory `/home/iftop/iftop-1.0pre4'

gcc -DHAVE_CONFIG_H -I.     -g -O2  -MT addr_hash.o -MD -MP -MF .deps/addr_hash.Tpo -c -o addr_hash.o addr_hash.c

mv -f .deps/addr_hash.Tpo .deps/addr_hash.Po

gcc -DHAVE_CONFIG_H -I.     -g -O2  -MT edline.o -MD -MP -MF .deps/edline.Tpo -c -o edline.o edline.c

mv -f .deps/edline.Tpo .deps/edline.Po

gcc -DHAVE_CONFIG_H -I.     -g -O2  -MT hash.o -MD -MP -MF .deps/hash.Tpo -c -o hash.o hash.c

mv -f .deps/hash.Tpo .deps/hash.Po

gcc -DHAVE_CONFIG_H -I.     -g -O2  -MT iftop.o -MD -MP -MF .deps/iftop.Tpo -c -o iftop.o iftop.c

mv -f .deps/iftop.Tpo .deps/iftop.Po

gcc -DHAVE_CONFIG_H -I.     -g -O2  -MT ns_hash.o -MD -MP -MF .deps/ns_hash.Tpo -c -o ns_hash.o ns_hash.c

mv -f .deps/ns_hash.Tpo .deps/ns_hash.Po

gcc -DHAVE_CONFIG_H -I.     -g -O2  -MT options.o -MD -MP -MF .deps/options.Tpo -c -o options.o options.c

mv -f .deps/options.Tpo .deps/options.Po

gcc -DHAVE_CONFIG_H -I.     -g -O2  -MT resolver.o -MD -MP -MF .deps/resolver.Tpo -c -o resolver.o resolver.c

mv -f .deps/resolver.Tpo .deps/resolver.Po

gcc -DHAVE_CONFIG_H -I.     -g -O2  -MT screenfilter.o -MD -MP -MF .deps/screenfilter.Tpo -c -o screenfilter.o screenfilter.c

mv -f .deps/screenfilter.Tpo .deps/screenfilter.Po

gcc -DHAVE_CONFIG_H -I.     -g -O2  -MT serv_hash.o -MD -MP -MF .deps/serv_hash.Tpo -c -o serv_hash.o serv_hash.c

mv -f .deps/serv_hash.Tpo .deps/serv_hash.Po

gcc -DHAVE_CONFIG_H -I.     -g -O2  -MT sorted_list.o -MD -MP -MF .deps/sorted_list.Tpo -c -o sorted_list.o sorted_list.c

mv -f .deps/sorted_list.Tpo .deps/sorted_list.Po

gcc -DHAVE_CONFIG_H -I.     -g -O2  -MT threadprof.o -MD -MP -MF .deps/threadprof.Tpo -c -o threadprof.o threadprof.c

mv -f .deps/threadprof.Tpo .deps/threadprof.Po

gcc -DHAVE_CONFIG_H -I.     -g -O2  -MT ui_common.o -MD -MP -MF .deps/ui_common.Tpo -c -o ui_common.o ui_common.c

mv -f .deps/ui_common.Tpo .deps/ui_common.Po

gcc -DHAVE_CONFIG_H -I.     -g -O2  -MT ui.o -MD -MP -MF .deps/ui.Tpo -c -o ui.o ui.c

mv -f .deps/ui.Tpo .deps/ui.Po

gcc -DHAVE_CONFIG_H -I.     -g -O2  -MT tui.o -MD -MP -MF .deps/tui.Tpo -c -o tui.o tui.c

mv -f .deps/tui.Tpo .deps/tui.Po

gcc -DHAVE_CONFIG_H -I.     -g -O2  -MT util.o -MD -MP -MF .deps/util.Tpo -c -o util.o util.c

mv -f .deps/util.Tpo .deps/util.Po

gcc -DHAVE_CONFIG_H -I.     -g -O2  -MT addrs_ioctl.o -MD -MP -MF .deps/addrs_ioctl.Tpo -c -o addrs_ioctl.o addrs_ioctl.c

mv -f .deps/addrs_ioctl.Tpo .deps/addrs_ioctl.Po

gcc -DHAVE_CONFIG_H -I.     -g -O2  -MT addrs_dlpi.o -MD -MP -MF .deps/addrs_dlpi.Tpo -c -o addrs_dlpi.o addrs_dlpi.c

mv -f .deps/addrs_dlpi.Tpo .deps/addrs_dlpi.Po

gcc -DHAVE_CONFIG_H -I.     -g -O2  -MT dlcommon.o -MD -MP -MF .deps/dlcommon.Tpo -c -o dlcommon.o dlcommon.c

mv -f .deps/dlcommon.Tpo .deps/dlcommon.Po

gcc -DHAVE_CONFIG_H -I.     -g -O2  -MT stringmap.o -MD -MP -MF .deps/stringmap.Tpo -c -o stringmap.o stringmap.c

mv -f .deps/stringmap.Tpo .deps/stringmap.Po

gcc -DHAVE_CONFIG_H -I.     -g -O2  -MT cfgfile.o -MD -MP -MF .deps/cfgfile.Tpo -c -o cfgfile.o cfgfile.c

mv -f .deps/cfgfile.Tpo .deps/cfgfile.Po

gcc -DHAVE_CONFIG_H -I.     -g -O2  -MT vector.o -MD -MP -MF .deps/vector.Tpo -c -o vector.o vector.c

mv -f .deps/vector.Tpo .deps/vector.Po

gcc  -g -O2    -o iftop addr_hash.o edline.o hash.o iftop.o ns_hash.o options.o resolver.o screenfilter.o serv_hash.o sorted_list.o threadprof.o ui_common.o ui.o tui.o util.o addrs_ioctl.o addrs_dlpi.o dlcommon.o stringmap.o cfgfile.o vector.o  -lpcap -lm  -lcurses -lpthread

make[2]: Leaving directory `/home/iftop/iftop-1.0pre4'

make[1]: Leaving directory `/home/iftop/iftop-1.0pre4'

Making install in config

make[1]: Entering directory `/home/iftop/iftop-1.0pre4/config'

make[2]: Entering directory `/home/iftop/iftop-1.0pre4/config'

make[2]: Nothing to be done for `install-exec-am'.

make[2]: Nothing to be done for `install-data-am'.

make[2]: Leaving directory `/home/iftop/iftop-1.0pre4/config'

make[1]: Leaving directory `/home/iftop/iftop-1.0pre4/config'

make[1]: Entering directory `/home/iftop/iftop-1.0pre4'

make[2]: Entering directory `/home/iftop/iftop-1.0pre4'

 /usr/bin/mkdir -p '/usr/local/sbin'

  /usr/bin/install -c iftop '/usr/local/sbin'

 /usr/bin/mkdir -p '/usr/local/share/man/man8'

 /usr/bin/install -c -m 644 iftop.8 '/usr/local/share/man/man8'

make[2]: Leaving directory `/home/iftop/iftop-1.0pre4'

make[1]: Leaving directory `/home/iftop/iftop-1.0pre4'

命令執行完成後,能夠看到iftop已經被安裝到/usr/local/sbin目錄下了

完成iftop的安裝後,就能夠直接執行iftop命令了,命令執行後能夠看到以下圖的網絡流量使用信息

 

 

l        表明了網絡流量的流轉方向

l         TX:表示發送的總流量

l         RX:表示接收的總流量

l         TOTAL:表示總流量

l         peak:表示每秒流量的峯值

l         rates:分別表示過去 2s 10s 40s 的平均流量

iftop 命令還能夠支持添加其它參數的使用

iftop –i 指定網卡名 能夠用來監控指定網卡的網絡流量信息,例如執行iftop -i ens33命令能夠監控ens33這塊網卡的網絡流量使用

 

 

 iftop –P 能夠在網絡流量信息中展現host信息和對應的端口信息,以下圖所示  

 

備註:做者的原創文章,轉載須註明出處。原創文章歸做者全部,歡迎轉載,可是保留版權。對於轉載了博主的原創文章,不標註出處的,做者將依法追究版權,請尊重做者的成果。

本文做者:張永清  文章選自 做者2020年初即將出版的《性能測試分析與性能診斷調優核心思想》一書。

1.1.六、    nmon對Linux服務器的總體性能監控

nmon 是一個監控aix和linux服務器性能的免費工具,nmon能夠監控的數據主要包括:CPU 使用信息、內存使用信息,內核統計信息、運行隊列信息、磁盤 I/O 速度、傳輸和讀/寫比率、網絡 I/O 速度、傳輸和讀/寫比

率、消耗資源最多的進程,虛擬內存使用信息等,配合nmon_analyser一塊兒能夠nmon的監控數據轉換爲excel形式的報表,nmon也不是操做系統自帶的監控工具,須要單獨進行安裝,能夠從、

https://sourceforge.net/projects/nmon/網站中下載nmon進行安裝使用。

安裝完成後,執行nmon 命令後,能夠進入nmon的監控選項視圖

  • 鍵盤按下c後,能夠實時監控到服務器CPU中每個CPU核的使用信息

  • 鍵盤按下l後,能夠實時監控CPU的總體使用信息,此時展現的再也不是單個CPU核的使用信息,而是全部CPU核總體的平均使用信息,以下圖所示

  • 鍵盤按下m後,能夠實時監控到服務器的物理內存和虛擬內存的使用信息

  • 鍵盤按下k後,能夠實時監控到服務器的內核信息

內核監控中能夠看到操做系統內核中的運行隊列(RunQueue)大小、每秒CPU上下文(ContextSwitch)切換的次數、每秒CPU的中斷(Interrupts)次數,每秒調用Forks的次數(Linux操做系統建立新的進程通常都是調用fork函數進行建立,從中能夠看到每秒建立了多少新的進程)以及CPU的使用信息等。

  • 鍵盤按下d後,能夠實時監控到服務器的磁盤I/O的讀寫信息

  • 鍵盤按下j後,能夠實時監控到服務器的文件系統的相關信息

  • 鍵盤按下n後,能夠實時監控到服務器網卡流量的相關信息

  • 鍵盤按下t後,能夠實時監控top process的相關資源使用信息

1.二、 Windows服務器的性能指標監控和分析

1.2.一、   Windows性能監視器

Windows服務器在安裝完Windows操做系統後,操做系統中默認就自帶了性能監控工具,這個自帶的性能監控工具經過訪問操做系統的控制面板->全部控制面板項->管理工具->性能監視器就能打開自帶的這個性能監控工

具,也能夠經過在命令行中運行Perfmon.msc命令來打開自帶的性能監控工具,打開後的界面以下圖所示。

在Windows2003服務器操做系統中,這個性能監控工具是直接叫性能,以下圖所示

在Windows2003中,打開性能監控工具的界面以下圖所示,界面展現略有不一樣,可是包含的功能基本一致。

針對Processor、Process、Memory、TCP/UDP/IP/ICMP、PhysicalDisk等監控對象,Windows自帶的性能監視器提供了數百個性能計數器能夠對這些對象進行監控,計數器能夠提供應用程序、Windows服務、操做系統等的相關的性能信息來輔助分析程序性能瓶頸和對系統及應用程序性能進行診斷和調優。

在進入性能監視器界面後,能夠經過點擊按鈕來添加對應的計數器,以下圖所示。

 

常見的計數器以下

l         Processor:指的就是Windows服務器的CPU,在添加時會有實例的選擇,每個實例表明了CPU的每個核,好比4核的CPU的就會有4個實例,能夠根據須要選擇對應的實例,在選擇了Processor後,能夠看到該實例下全部和Processor相關的計數器,以下圖

Processor相關的計數器指標說明以下

計數器

說明

%Processor Time

CPU執行非閒置進程和線程時間的百分比(能夠通俗的理解爲CPU處於繁忙使用狀態的時間佔比),該計數器通常能夠用來做爲CPU的總體利用率指標

%User Time

CPU處於用戶模式下的使用時間佔比,該計數器和Linux下的%usr指標含義相似

%Privileged Time

CPU在特權模式下處理線程所花的時間佔比,該計數器通常能夠做爲系統服務、操做系統自身模式下耗費的CPU時間佔比,這個指標通常不會過高,若是過高就須要去定位緣由,通常的時候%User Time越高,說明CPU被利用的越好。

Interrupts/sec

CPU每秒的中斷次數, 該計數器和Linux下的in指標的含義相似

%Interrupt Time

CPU中斷時間佔比,該計數器和Linux下的%irq指標的含義相似

%Idle Time

CPU空閒時間佔比,該計數器和Linux下的%idle指標的含義相似

%DPC Time

CPU處理網絡傳輸等待的時間佔比

l         Memory:指的就是Windows服務器的物理內存,在選擇了Memory後,能夠看到該實例下全部和Memory相關的計數器,以下圖

Memory相關的計數器指標說明以下

計數器

說明

Available Bytes

服務器剩餘的可用物理內存的大小(單位爲字節),若是該值很小說明服務器總的內存可能不夠或者部分應用一直都沒有及時釋放內存,

服務器的可用物理內存是經過將程序釋放的內存、空閒內存、備用內存相加在一塊兒計算出來的。

Committed Bytes

已被提交的虛擬內存字節數,內存分配時會先在虛擬地址空間上保留一段空間保留一段時間,此時系統尚未分配真正的物理內存只是分配了一段內存地址,在這一步操做成功後再提交分配的這段內存地址,操做系統接收到提交的內存地址後纔會分配真正的物理內存。

Page Faults/sec

每秒缺頁中斷或者頁面錯誤的數量,通常內存中不存在須要訪問的數據致使須要從硬盤讀取可能會致使此指標較高。

Reads/sec

每秒爲了解決硬錯誤(通常指引用的頁面在內存中不存在)而從硬盤上讀取頁面的次數

Writes/sec

每秒爲了釋放物理內存空間而須要將頁面寫入磁盤的次數

Input/sec

每秒爲了解決硬錯誤而從硬盤讀取的頁面數量,通常是指內存引用時頁面不在內存,爲解決這種狀況而從磁盤讀取的頁面數量。

Output/sec

每秒內存中的頁面發生了修改從而須要寫入磁盤的頁面數量

Pages/sec

每秒爲了解決硬錯誤(通常指引用的頁面在內存中不存在)而從硬盤上讀取或寫入硬盤的頁面數量

Cathe Bytes

Windows文件系統的緩存,這塊也是佔用服務器的物理內存,可是在物理內存不夠時是能夠釋放的,Windows在釋放內存時通常會使用頁交換的方式進行,頁交換會將固定大小的代碼和數據塊從 物理內存移動到磁盤。

Pool Nonpaged Allocs

在非分頁池中分配空間的調用數,這個計數器是以調用分配空間的次數來衡量的,而不會管每次調用分配的空間量是多少。

通常內核或者設備驅動使用非分頁池來保存可能訪問的數據,一旦加載到該池就始終駐留在物理內存中,而且在訪問的時候又不能出現錯誤,未分頁池不執行換入換出操做,若是一旦發生內存泄漏,將會很是嚴重。與非分頁池對應的就是分頁池(Paged Pool),指的是能夠存到操做系統的分頁文件中,容許其佔用的物理內存被從新設置,相似用戶模式的虛擬內存。

Pool Nonpaged Bytes

非分頁池的大小(單位:字節)。內存池非分頁字節的計算方式不一樣於進程池中非分頁字節,所以它可能不等於進程池非分頁字節總數。

Pool Paged Allocs

在分頁池中分配空間的調用數。它也是以調用分配空間的次數來衡量的,而無論每次調用分配的空間量是多少。

Pool Paged Bytes

分頁池的大小(單位:字節)。內存池分頁字節的計算方式與進程池分頁字節的計算方式不一樣,所以它可能不等於進程池分頁字節總數。

Transition Faults/sec

經過恢復共享頁中被其它進程正在使用的頁、已修改頁列表或待機列表中的頁、或在頁故障時寫入磁盤的頁來解決頁故障的速率。在沒有其餘磁盤活動的狀況下恢復了這些頁。轉換錯誤按錯誤數計算,由於每一個操做中只有一個頁面出錯,因此它也等於出錯的頁面數。

Write Copies/sec

經過從物理內存中的其餘位置複製頁來知足的寫入嘗試致使頁錯誤的速率。這是一種效率很高的共享數據的方式,由於頁面只在寫入時被複制,不然頁面被共享。此計數器只顯示副本數而不考慮每次操做中複製的頁數。

System Code Total Bytes

虛擬內存中當前可分頁給操做系統程序的空間大小(單位:字節)。它是操做系統使用的物理內存量的量度而且能夠在不使用時寫入磁盤。這個值是經過添加ntoskrnl.exe、hal.dll、引導驅動程序和ntldr/osloader加載的文件系統中的字節來計算的。此計數器不包括必須保留在物理內存中且沒法寫入磁盤的操做系統程序。

System Driver Total Bytes

設備驅動程序當前使用的可分頁虛擬內存的大小(單位:字節),包括物理內存(內存/系統驅動程序駐留空間)和寫入磁盤的代碼和數據。它是內存/系統代碼總字節數的組成部分

l         PhysicalDisk:指的就是Windows服務器的磁盤設備,在選擇了PhysicalDisk後,能夠看到該實例下全部和PhysicalDisk相關的計數器,以下圖

備註:做者的原創文章,轉載須註明出處。原創文章歸做者全部,歡迎轉載,可是保留版權。對於轉載了博主的原創文章,不標註出處的,做者將依法追究版權,請尊重做者的成果。

本文做者:張永清  文章選自 做者2020年初即將出版的《性能測試分析與性能診斷調優核心思想》一書。文章連接:http://www.javashuo.com/article/p-hnynqvbi-w.html

PhysicalDisk相關的計數器指標說明以下

計數器

說明

Disk Bytes/sec 

每秒從磁盤I/O讀取和寫入的字節數

Disk Read Bytes/sec 

每秒從磁盤I/O讀取的字節數,這個計數器是以字節大小來描述每秒對磁盤的讀取操做。

Disk Write Bytes/sec 

每秒寫入磁盤I/O的字節數,這個計數器是以字節大小來描述每秒對磁盤的寫入操做。

Disk Reads/sec

對磁盤讀取操做的速率,這個計數器是以每秒對磁盤I/O的讀取次數來描述對磁盤的讀取頻率

Disk Writes/sec

對磁盤寫入操做的速率,這個計數器是以每秒對磁盤I/O的寫入次數來描述對磁盤的寫入頻率

Disk Transfers/sec

每秒對磁盤I/O讀取和寫入的次數

%Disk Time

所選磁盤驅動器正忙於處理讀取或寫入請求所用時間佔比

%Disk Read Time

所選磁盤驅動器正忙於處理讀取請求的時間佔比

%Disk Write Time

所選磁盤驅動器正忙於處理寫入磁盤請求的時間佔比

Avg. Disk Queue Length

所選磁盤在性能監視器性能數據採樣間隔期間須要排隊的平均讀寫請求數

Avg. Disk Read Queue Length

所選磁盤在性能監視器性能數據採樣間隔期間須要排隊的平均讀取請求數

Avg. Disk Write Queue Length

所選磁盤在性能監視器性能數據採樣間隔期間須要排隊的平均寫入請求數

Split IO/Sec

對磁盤I/O的讀寫請求拆分爲多個請求的速率。分割I/O多是因爲請求的數據太大,沒法容納單個I/O,或者物理磁盤在單個磁盤系統上已經被被分割。

l         IPv4:指的就是Windows服務器的IPv4網絡請求,在選擇了IPv4後,能夠看到該實例下全部和IPv4相關的計數器,以下圖

IPv4相關的計數器指標說明以下

計數器

說明

Datagrams/sec

服務器每秒發送和接收到的請求報文數

Datagrams Received/sec

服務器每秒接收到的請求報文數

Datagrams Received Header Errors/sec

服務器每秒接收到的請求報文中header 錯誤的數量

Datagrams Received Address  Errors/sec

服務器每秒接收到的請求報文中請求地址錯誤的數量

Datagrams  Forwarded/sec

服務器每秒轉發的請求報文數

Datagrams Received Unknown Protocol/sec

服務器每秒接收到沒法處理的未知網絡協議的請求報文數

Datagrams send/sec

服務器每秒發送的報文數

l         Process:指的就是Windows服務器的進程監控,在選擇了Process後,能夠看到該實例下全部和Process相關的計數器,以下圖

Process相關的計數器指標說明以下

計數器

說明

Thread Count

表示當前正在運行的線程數

Virtual Bytes

表示進程佔用的所有虛擬地址空間大小(單位爲字節),包括進程間的共享地址空間

Virtual BytesPeak

表示進程佔用的所有虛擬地址空間的峯值大小,峯值表示從服務器開始運行一直到如今的時間中曾經使用的最大值。

Working Set

表示進程工做集佔用內存的大小,包含了每一個進程下的各個線程引用過的頁面空間以及可能被其餘程序共享的內存空間。

WorkingSetPeak

表示進程工做集佔用內存的峯值大小,峯值表示從服務器開始運行一直到如今的時間中曾經使用的最大值。

Private Bytes

表示進程佔用的虛擬地址空間大小(單位爲字節),而且不包括進程間的共享地址空間,能夠認爲佔用的空間大小是進程私有使用的。

Handle Count

表示進程使用的kernel object handle數量,當程序進入穩定運行狀態的時候, Handle Count數量也應該維持在一個穩定的區間。 若是發現Handle Count在整個程序週期內整體趨勢連續向上,應該考慮程序是否有Handle 泄漏。

Pool Paged Bytes

表示分頁池的使用大小,單位爲字節

Pool Nonpaged Bytes

表示非分頁池的使用大小,單位爲字節

 

1.2.二、   Windows性能監視器下的性能分析

l         內存泄漏:Windows服務器下藉助性能監視器的計數器分析內存泄漏問題的通常步驟以下:

若是剩餘的有效物理內存一直在減小而且已提交的虛擬內存一直在增長,那麼此時程序代碼可能存在內存泄漏的風險,可是此時還須要觀察Process計數器中的Private Bytes和Working Set是否是也在持續增長,

若是一樣在持續增長那麼從服務器端監控看存在內存泄漏的可能性就很是大了,此時就須要去看部署在服務器上的程序是否是存在內存不能回收的狀況,能夠中止壓測,看下內存使用是否會釋放和回落。另外若是

觀察到HandleCount 的使用一直上漲,那麼多是內核模式進程致使了內存泄露,那麼此時就還須要持續觀察內存分頁池中的Paged Bytes和 Pool Paged Bytes是否是也是在一直上漲。

未完待續.......

性能測試分析與性能診斷調優核心思想目錄提綱(計劃2020年上架出版)

1.    性能測試和性能分析的基礎概念... 

1.1.     性能測試的基礎概念... 

1.1.1       性能測試的分類... 

1.1.2       性能測試的場景... 

1.2.     常見的性能測試指標... 

1.2.1       響應時間... 

1.2.2    TPS/QPS. 5

1.2.3       併發用戶... 

1.2.4    PV/UV.. 

1.2.5       點擊率... 

1.2.6       吞吐量... 

1.2.7       資源開銷... 

1.3.     性能測試的基本流程... 

1.3.1       性能需求分析... 

1.3.2       制定性能測試計劃... 

1.3.3       編寫性能測試方案... 

1.3.4       編寫性能測試案例... 

2     服務器的性能監控和分析... 

2.1      Linux服務器的性能指標監控和分析... 

2.1.1       經過vmstat深挖服務器的性能問題... 

2.1.2       如何經過mpstat 分析服務器的性能指標... 

2.1.3       從lsof中能看到什麼... 

2.1.4       如何經過free看懂內存的真實使用... 

2.1.5       網絡流量如何監控... 

2.1.6    nmon對Linux服務器的總體性能監控... 

2.2      Windows服務器的性能指標監控和分析... 

2.2.1    Windows性能監視器... 

2.2.2    Windows性能監視器下的性能分析... 

3     web中間件的性能分析... 

3.1      nginx的性能分析和調優... 

3.1.1    nginx的負載均衡策略... 

3.2      apache的性能分析和調優... 

4     應用中間件的性能分析... 

4.1      tomcat的性能分析和調優... 

4.2      jboss的性能分析和調優... 

五、java應用服務的性能分析和調優

5.1 jvm的常見監控

5.2 jvm的性能分析與診斷

5.3 jvm的性能調優技巧

六、移動APP的性能分析和監控

6.1 安卓APP的常見性能監控

6.2 安卓APP的性能分析

七、性能測試案例分析

7.1 Loadrunner 對http服務的性能壓測分析

7.2 Loadrunner對 rpc服務的性能壓測分析

7.3 jmeter對http 服務的性能壓測分析

7.4 Jmeter對rpc服務的性能壓測分析

八、性能測試分析與大數據

8.1 流式計算的性能測試與分析

8.2 spark的性能測試與調優

8.3 storm的性能測試與調優

九、數據庫的性能分析

9.1 mysql數據庫的性能監控

9.2 mysql數據庫的性能定位

9.3 sql語句的性能調優

備註:做者的原創文章,轉載須註明出處。原創文章歸做者全部,歡迎轉載,可是保留版權。對於轉載了博主的原創文章,不標註出處的,做者將依法追究版權,請尊重做者的成果。

本文做者:張永清  文章選自 做者2020年初即將出版的《性能測試分析與性能診斷調優核心思想》一書。文章連接:http://www.javashuo.com/article/p-hnynqvbi-w.html

相關文章
相關標籤/搜索