一個系統或者網站在功能開發完成後通常最終都須要部署到服務器上運行,那麼服務器的性能監控和分析就顯得很是重要了,選用什麼配置的服務器、如何對服務器進行調優、如何從服務器監控中發現程序的性能問題、如何判斷服務器的瓶頸在哪裏等 就成爲了服務器性能監控和分析時重點須要去解決的問題了。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年初即將出版的《性能測試分析與性能診斷調優核心思想》一書。
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命令得版本信息
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這三個指標。
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
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服務器上會常常用到。
soft nofile 65535 hard nofile 65535
備註:做者的原創文章,轉載須註明出處。原創文章歸做者全部,歡迎轉載,可是保留版權。對於轉載了博主的原創文章,不標註出處的,做者將依法追究版權,請尊重做者的成果。本文做者:張永清 文章選自 做者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下全部的網絡鏈接信息
free命令是linux操做系統中對內存進行查看和監控的一個經常使用命令,咱們能夠直接執行free命令來看下能夠獲取到操做系統內存使用的哪些數據
默認直接執行free 獲取到的內存數據的單位都是k,Mem這一行展現的是物理內存的使用狀況,Swap這一行展現的是內存交換區(一般也叫虛擬內存)的總體使用狀況。
l total列展現的爲系統總的可用物理內存和交換區的大小,單位爲k
l used列展現的爲已經被使用的物理內存和交換區的大小,單位爲k
l free列展現的爲還有多少物理內存和交換區沒有被使用,單位爲k
l shared 列展現的爲共享區佔用的物理內存大小,單位爲k
l buff/cache 列展現的爲被緩衝區和page高速緩存合計使用的物理內存大小,單位爲k
l available 列展現的爲還能夠被使用的物理內存的大小,單位爲k。一般狀況下,available 的值等於free+ buff/cache ,linux內核爲了提升磁盤讀寫的速度會使用一部分物理內存去緩存常常被使用的磁盤數據,因此buffer 和 cache對於Linux操做系統的內核來講都屬於已經被使用的內存,而free列展現的是真實未被任何地方使用的物理內存,可是若是物理內存已經不夠用而且應用程序恰巧又須要使用內存時內核就會從 buffer 和 cache 中回收內存來知足應用程序的使用,也就是說buffer 和 cache佔用的內存是能夠被內核釋放的。
備註:做者的原創文章,轉載須註明出處。原創文章歸做者全部,歡迎轉載,可是保留版權。對於轉載了博主的原創文章,不標註出處的,做者將依法追究版權,請尊重做者的成果。
本文做者:張永清 文章選自 做者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年初即將出版的《性能測試分析與性能診斷調優核心思想》一書。
nmon 是一個監控aix和linux服務器性能的免費工具,nmon能夠監控的數據主要包括:CPU 使用信息、內存使用信息,內核統計信息、運行隊列信息、磁盤 I/O 速度、傳輸和讀/寫比率、網絡 I/O 速度、傳輸和讀/寫比
率、消耗資源最多的進程,虛擬內存使用信息等,配合nmon_analyser一塊兒能夠nmon的監控數據轉換爲excel形式的報表,nmon也不是操做系統自帶的監控工具,須要單獨進行安裝,能夠從、
https://sourceforge.net/projects/nmon/網站中下載nmon進行安裝使用。
安裝完成後,執行nmon 命令後,能夠進入nmon的監控選項視圖
內核監控中能夠看到操做系統內核中的運行隊列(RunQueue)大小、每秒CPU上下文(ContextSwitch)切換的次數、每秒CPU的中斷(Interrupts)次數,每秒調用Forks的次數(Linux操做系統建立新的進程通常都是調用fork函數進行建立,從中能夠看到每秒建立了多少新的進程)以及CPU的使用信息等。
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 |
表示非分頁池的使用大小,單位爲字節 |
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