1. 程式人生 > >linux伺服器硬體資源指標、jvm監控 、儲存資料庫、redis監控

linux伺服器硬體資源指標、jvm監控 、儲存資料庫、redis監控

linux 監控命令 nmon dstat  top iostat vmstat iftop iotop lsof netstat

伺服器硬體資源指標(cpu、記憶體、磁碟、網路) dstat top iotop  iostat  vmstat 

Iostat/iotop:Iostat 查詢IO詳細資訊 ;iotop 查詢IO被哪個進行消耗 (Iostat -xm 5)

lsof:查詢進行檔案控制代碼數,結合使用的命令為 ulimit -a | grep 'open files'

netstat:查詢網路連線情況

Iftop:查詢網絡卡流量

一、dstat -tcpmail 命令

安裝命令  yum -y install dstat




cpu利用率 百分比 
usr使用者cpu佔了51%
sys 系統cpu 佔了3%
Idl 閒置cpu 佔了45%
wai 處於等待的程序消耗的cpu

hip  sip 分表代表硬中斷 、軟中斷次數

procs 代表程序

單位個數

memory

記憶體使用率

單位大小

Used 使用 

Buff  作為buffer cache的記憶體,對塊裝置的讀寫進行緩衝

Cach 作為page cache的記憶體, 檔案系統的cache。

Free 空閒的實體記憶體

不關注這些 ,關注swap 交換快取 一直使用 系統會出問題   

  • si: 交換記憶體使用,由磁碟調入記憶體
  • so: 交換記憶體使用,由記憶體調入磁碟

disk

磁碟讀寫dsk  (read writ)

磁碟看 iostat 中util 如果這個值接近百分之百說明 磁碟有瓶頸

net

網路收發(recv  send) 

paging

分頁統計,大多數情況下這兩個數是 0.

system   

int (interrupt)系統中斷次數、csw (context  switch)代表上下文切換次數

load avg

1分鐘 平均load ,5分鐘平均load  10分鐘平均load

檢視網路
ethool ech0

Speed: 1000Mb/s   125MB/s 容量 網路容量超過125m 就有問題

  1MB=8Mb

byte是位元組數,bit是位數

Mbit 是位元位數

二、iostat   -xm 2  命令 

iostat用於輸出CPU和磁碟輸入輸出、分割槽、網路檔案系統NFS相關的統計資訊。iostat命令用於監控系統裝置的輸入/輸出情況,並生成報告,以便根據統計報告修改系統配置,獲取更優的效能。

幫助檢視瓶頸是不是在磁碟這  重點關注之一 util 磁碟利用率 如果達到百分之百了說明 磁碟已經到最大了,出現瓶頸了

await 代表一次io 在磁碟這的延遲多少毫秒    r/s  w/s  代表每秒讀多少次,每秒寫多少次


三、vmstat  1   命令 

代表每1秒鐘輸出vmstat 的資訊

swap   si so   有持續不為零 在swap 這存在瓶頸


r 等待執行的任務數,我測試的伺服器目前CPU比較空閒,沒什麼程式在跑,當這個值超過了CPU數目,就會出現CPU瓶頸了。這個也和top的負載有關係,一般負載超過了3就比較高,超過了5就高,超過了10就不正常了,伺服器的狀態很危險。top的負載類似每秒的執行佇列。如果執行佇列過大,表示你的CPU很繁忙,一般會造成CPU使用率很高。

b 等待IO的程序數量

memory

swpd 虛擬記憶體已使用的大小,如果大於0,表示你的機器實體記憶體不足了,如果不是程式記憶體洩露的原因,那麼你該升級記憶體了或者把耗記憶體的任務遷移到其他機器。

free   空閒的實體記憶體的大小,我的機器記憶體總共G,剩餘1381M。

buff   Linux/Unix系統是用來儲存,目錄裡面有什麼內容,許可權等的快取,我本機大概佔用38M,做緩衝區記憶體

cache cache檔案目錄系統快取)做高速緩衝區記憶體

swap

si  每秒從磁碟讀入虛擬記憶體的大小,如果這個值大於0,表示實體記憶體不夠用或者記憶體洩露了,要查詢耗記憶體程序解決掉。我的機器記憶體充裕,一切正常。

so  每秒虛擬記憶體寫入磁碟的大小,如果這個值大於0,表示實體記憶體不夠用或者記憶體洩露了,要查詢耗記憶體程序解決掉。我的機器記憶體充裕,一切正常。

io 讀寫

bi  bi是從磁碟讀的速度

bobo寫資料到磁碟的速率

system

in 每秒CPU的中斷次數,包括時間中斷

cs 每秒上下文切換次數,例如我們呼叫系統函式,就要進行上下文切換,執行緒的切換,也要程序上下文切換,這個值要越小越好,太大了,要考慮調低執行緒或者程序的數目,例如在apache和nginx這種web伺服器中,我們一般做效能測試時會進行幾千併發甚至幾萬併發的測試,選擇web伺服器的程序可以由程序或者執行緒的峰值一直下調,壓測,直到cs到一個比較小的值,這個程序和執行緒數就是比較合適的值了。系統呼叫也是,每次呼叫系統函式,我們的程式碼就會進入核心空間,導致上下文切換,這個是很耗資源,也要儘量避免頻繁呼叫系統函式。上下文切換次數過多表示你的CPU大部分浪費在上下文切換,導致CPU幹正經事的時間少了,CPU沒有充分利用,是不可取的。
cpu
us 使用者CPU時間,us的值比較高時,說明使用者程序消耗的cpu時間多,但是如果長期超過50%的使用,那麼我們就該考慮優化程式演算法或其他措施了

sy 系統CPU時間,sys的值過高時,說明系統核心消耗的cpu資源多,這個不是良性的表現,我們應該檢查原因。如果太高,表示系統呼叫時間長,例如是IO操作頻繁。

id  空閒 CPU時間,一般來說,id + us + sy = 100,一般我認為id是空閒CPU使用率,us是使用者CPU使用率,sy是系統CPU使用率。

wa 等待IO CPU時間。Wa過高時,說明io等待比較嚴重,這可能是由於磁碟大量隨機訪問造成的,也有可能是磁碟的頻寬出現瓶頸。

st 從虛擬裝置獲得的時間

四、top命令  輸入完top  按數字1  就出來幾核cpu ,程序的情況
Top –p PID H:檢查進行下執行緒CPU消耗


01:06:48    當前時間
up 1:22    系統執行時間,格式為時:分
1 user    當前登入使用者數
load average: 0.06, 0.60, 0.48    系統負載,即任務佇列的平均長度。三個數值分別為 1分鐘、5分鐘、15分鐘前到現在的平均值。
第二、三行為程序和CPU的資訊。當有多個CPU時,這些內容可能會超過兩行。內容如下:
total 程序總數
running 正在執行的程序數
sleeping 睡眠的程序數
stopped 停止的程序數
zombie 殭屍程序數
Cpu(s): 
0.3% us 使用者空間佔用CPU百分比
1.0% sy 核心空間佔用CPU百分比
0.0% ni 使用者程序空間內改變過優先順序的程序佔用CPU百分比
98.7% id 空閒CPU百分比
0.0% wa 等待輸入輸出的CPU時間百分比
0.0%hi:硬體CPU中斷佔用百分比
0.0%si:軟中斷佔用百分比
0.0%st:虛擬機器佔用百分比
最後兩行為記憶體資訊。內容如下:
Mem:
191272k total    實體記憶體總量
173656k used    使用的實體記憶體總量
17616k free    空閒記憶體總量
22052k buffers    用作核心快取的記憶體量
Swap: 
192772k total    交換區總量
0k used    使用的交換區總量
192772k free    空閒交換區總量
123988k cached    緩衝的交換區總量,記憶體中的內容被換出到交換區,而後又被換入到記憶體,但使用過的交換區尚未被覆蓋,該數值即為這些內容已存在於記憶體中的交換區的大小,相應的記憶體再次被換出時可不必再對交換區寫入。

程序資訊區統計資訊區域的下方顯示了各個程序的詳細資訊。首先來認識一下各列的含義。
序號  列名    含義
a    PID     程序id
b    PPID    父程序id
c    RUSER   Real user name
d    UID     程序所有者的使用者id
e    USER    程序所有者的使用者名稱
f    GROUP   程序所有者的組名
g    TTY     啟動程序的終端名。不是從終端啟動的程序則顯示為 ?
h    PR      優先順序
i    NI      nice值。負值表示高優先順序,正值表示低優先順序
j    P       最後使用的CPU,僅在多CPU環境下有意義
k    %CPU    上次更新到現在的CPU時間佔用百分比
l    TIME    程序使用的CPU時間總計,單位秒
m    TIME+   程序使用的CPU時間總計,單位1/100秒
n    %MEM    程序使用的實體記憶體百分比
o    VIRT    程序使用的虛擬記憶體總量,單位kb。VIRT=SWAP+RES
p    SWAP    程序使用的虛擬記憶體中,被換出的大小,單位kb。
q    RES     程序使用的、未被換出的實體記憶體大小,單位kb。RES=CODE+DATA
r    CODE    可執行程式碼佔用的實體記憶體大小,單位kb
s    DATA    可執行程式碼以外的部分(資料段+棧)佔用的實體記憶體大小,單位kb
t    SHR     共享記憶體大小,單位kb
u    nFLT    頁面錯誤次數
v    nDRT    最後一次寫入到現在,被修改過的頁面數。
w    S       程序狀態(D=不可中斷的睡眠狀態,R=執行,S=睡眠,T=跟蹤/停止,Z=殭屍程序)
x    COMMAND 命令名/命令列
y    WCHAN   若該程序在睡眠,則顯示睡眠中的系統函式名
z    Flags   任務標誌,參考 sched.h

iftop

五、iotop 檢視當前系統程序的磁碟讀寫情況。最後一列代表程序的名字


六、lsof、

七、netstat、

八、Iftop、

JVM監控  jvisualvm  jconsole jstat    jstack  jmap    tprofiler greys

記憶體溢位out of memory,JVM分為堆記憶體溢位和perm區記憶體溢位,堆記憶體溢位由什麼導致的,怎麼定位分析。

不斷的new 物件,不釋放 ,會導致記憶體溢位

public class Test {
public static void main(String[] args) throws InterruptecException {
for(int i =0; i<1000;i++){

Thread.sleep(1000);
System.out.println(i);
}

}
}
javac Test.java 編譯
java Test 


jps -l

JVM原理

heap 堆  perm是不佔對記憶體的

new 的物件  在堆記憶體裡面,先放到Eden區,Eden區是有限的,Eden滿了後會進行一次YGC,YGC完了之後,還有存活的物件,引用還沒有釋放的物件,被移到S0區,S0區滿了之後,Eden還往S0區放,這時,S0於S1空間調換,S0把空間都給S1,S0繼續接受YGC完之後存活的物件。S0、S1滿了,會往Old區裡存,同時進行YGC。Old區滿了之後,進行FGC一次,整個堆不在接受新new的物件往裡存,就相當整個jvm不提供服務了。FGC的花的時 間,儘量要少FGC,第二要儘量讓FGC時間短。堆裡存的new 的物件

Perm 區存的類。物件分兩種,非類的物件,類物件object。Old區滿了、 Perm區滿了 也會存在FGC。


一、jvisualvm   找到jdk 的bin目錄 用jvisualvm 
監視 執行緒 visual GC 這三個
進行執行緒dump  應用執行緒mian   從最低下看

用命令打dump   ps -l  檢視java pid號,jstack 程序號 顯示java程序的dump 

jstack 程序號 >jatack.log 就會有日誌

輸出成一個檔案 在log裡就有 

簡介

VisualVM 是一個工具,它提供了一個可視介面,用於檢視 Java 虛擬機器 (Java Virtual Machine, JVM) 上執行的基於 Java 技術的應用程式(Java 應用程式)的詳細資訊。VisualVM 對 Java Development Kit (JDK) 工具所檢索的 JVM 軟體相關資料進行組織,並通過一種使您可以快速檢視有關多個 Java 應用程式的資料的方式提供該資訊。您可以檢視本地應用程式以及遠端主機上執行的應用程式的相關資料。此外,還可以捕獲有關 JVM 軟體例項的資料,並將該資料儲存到本地系統,以供後期檢視或與其他使用者共享。

VisualVM 幾乎涉及了jvm調優的方方面面。同樣是在jdk/bin目錄下面雙擊jvisualvm.exe既可使用,啟動起來後和jconsole 一樣同樣可以選擇本地和遠端,如果需要監控遠端同樣需要配置相關引數,主介面如下;

VisualVM可以根據需要安裝不同的外掛,每個外掛的關注點都不同,有的主要監控GC,有的主要監控記憶體,有的監控執行緒等。

如何安裝:

1、從主選單中選擇“工具”>“外掛”。
2、在“可用外掛”標籤中,選中該外掛的“安裝”複選框。單擊“安裝”。
3、逐步完成外掛安裝程式。

我這裡以 Eclipse(pid 22296)為例,雙擊後直接展開,主介面展示了系統和jvm兩大塊內容,點選右下方jvm引數和系統屬性可以參考詳細的引數資訊.

因為VisualVM的外掛太多,我這裡主要介紹三個我主要使用幾個:監控、執行緒、Visual GC

監控的主頁其實也就是,cpu、記憶體、類、執行緒的圖表

執行緒和jconsole功能沒有太大的區別

Visual GC 是常常使用的一個功能,可以明顯的看到年輕代、老年代的記憶體變化,以及gc頻率、gc的時間等。

以上的功能其實jconsole幾乎也有,VisualVM更全面更直觀一些,另外VisualVM非常多的其它功能,可以分析dump的記憶體快照,dump出來的執行緒快照並且進行分析等,還有其它很多的外掛大家可以去探索


二、jconsole  

Jconsole(Java Monitoring and Management Console)是從java5開始,在JDK中自帶的java監控和管理控制檯,用於對JVM中記憶體,執行緒和類等的監控,是一個基於JMX(java management extensions)的GUI效能監測工具。jconsole使用jvm的擴充套件機制獲取並展示虛擬機器中執行的應用程式的效能和資源消耗等資訊。

直接在jdk/bin目錄下點選jconsole.exe即可啟動,介面如下:

在彈出的框中可以選擇本機的監控本機的java應用,也可以選擇遠端的java服務來監控,如果監控遠端服務需要在tomcat啟動指令碼中新增如下程式碼:

1 2 3 -Dcom.sun.management.jmxremote.port=6969  -Dcom.sun.management.jmxremote.ssl=false  -Dcom.sun.management.jmxremote.authenticate=false

連線進去之後,就可以看到jconsole概覽圖和主要的功能:概述、記憶體、執行緒、類、VM、MBeans

  • 概述,以圖表的方式顯示出堆記憶體使用量,活動執行緒數,已載入的類,CUP佔用率的折線圖,可以非常清晰的觀察在程式執行過程中的變動情況。

  • 記憶體,主要展示了記憶體的使用情況,同時可以檢視堆和非堆記憶體的變化值對比,也可以點選執行GC來處罰GC的執行

  • 執行緒,主介面展示執行緒數的活動數和峰值,同時點選左下方執行緒可以檢視執行緒的詳細資訊,比如執行緒的狀態是什麼,堆疊內容等,同時也可以點選“檢測死鎖”來檢查執行緒之間是否有死鎖的情況。

  • 類,主要展示已載入類的相關資訊。
  • VM 概要,展示JVM所有資訊總覽,包括基本資訊、執行緒相關、堆相關、作業系統、VM引數等。
  • Mbean,檢視Mbean的屬性,方法等。

三、jstat  -gcutil 程序號 1000       檢視gc情況 每一秒顯示一次程序號xx 的GC情況 


S0 s1 e 代表yong區

O  老年代 o區

P 持久代

前五列都代表百分比

YGC  代表次數相當計數器  單位是次數

 YGCT 代表YGC 一次花了多少時間  秒

FGC 代表次數相當計數器   單位是次數

FGCT 代表FGC 一次花了多少時間  秒

GCT  GCT=YGCT+FGCT 的時間 單位都是秒

1、O區頻繁滿了 會產生FGC , 這是系統tps 會驟然下降,過於平凡系統tps 就降為零 ,導致系統掛掉。

2、O區滿了 E區滿了  不釋放

3、O p 區滿了 都會產生FGC

寫程式碼 模擬對記憶體溢位的情況。

jmap 列印例項資訊 

out of memory jvm記憶體溢位分兩種:heap堆記憶體溢位和perm區記憶體溢位。


Jdk中的bin目錄下面 的一些命令

四、jmap 分析記憶體 打記憶體dump的
jmap(JVM Memory Map)命令用於生成heap dump檔案,如果不使用這個命令,還闊以使用-XX:+HeapDumpOnOutOfMemoryError引數來讓虛擬機器出現OOM的時候·自動生成dump檔案。 jmap不僅能生成dump檔案,還闊以查詢finalize執行佇列、Java堆和永久代的詳細資訊,如當前使用率、當前使用的是哪種收集器等
option引數
-dump : 生成堆轉儲快照
-finalizerinfo : 顯示在F-Queue佇列等待Finalizer執行緒執行finalizer方法的物件
-heap : 顯示Java堆詳細資訊
-histo : 顯示堆中物件的統計資訊
-permstat : to print permanent generation statistics
-F : 當-dump沒有響應時,強制生成dump快照
五、 jstack

jstack用於生成java虛擬機器當前時刻的執行緒快照。執行緒快照是當前java虛擬機器內每一條執行緒正在執行的方法堆疊的集合,生成執行緒快照的主要目的是定位執行緒出現長時間停頓的原因,如執行緒間死鎖、死迴圈、請求外部資源導致的長時間等待等。 執行緒出現停頓的時候通過jstack來檢視各個執行緒的呼叫堆疊,就可以知道沒有響應的執行緒到底在後臺做什麼事情,或者等待什麼資源。 如果java程式崩潰生成core檔案,jstack工具可以用來獲得core檔案的java stack和native stack的資訊,從而可以輕鬆地知道java程式是如何崩潰和在程式何處發生問題。另外,jstack工具還可以附屬到正在執行的java程式中,看到當時執行的java程式的java stack和native stack的資訊, 如果現在執行的java程式呈現hung的狀態,jstack是非常有用的。

option引數

-F : 當正常輸出請求不被響應時,強制輸出執行緒堆疊
-l : 除堆疊外,顯示關於鎖的附加資訊
-m : 如果呼叫到本地方法的話,可以顯示C/C++的堆疊

jstack + java程序號 ,就


資料庫監控

redis監控