Linux 監控分析

 

1、硬件基礎html

Cpu   邏輯的處理、計算、判斷java

現代分時多任務操做系統對 CPU 都是分時間片使用的:好比A進程佔用10ms,而後B進程佔用30ms,而後空閒60ms,linux

再又是A進程佔10ms,B進程佔30ms,空閒60ms;若是在一段時間內都是如此,那麼這段時間內的佔用率爲40%。ios

CPU對線程的響應並非連續的,一般會在一段時間後自動中斷線程。未響應的線程增長,就會不斷加大CPU的佔用。面試

指標:Cpu 利用率:供(用戶進程+系統進程)幹活的時間/總的時間sql

Cpu 利用率越高 進程等待時間切片的時間愈來愈長,代碼處理等待時間愈來愈長數據庫

一個cpu 在同一瞬間只能處理一個任務,多個任務時,任務掛起,等待下個時間片緩存

寄存器——cpu 上下文切換  怎麼知道以前處理到哪了接下來須要幹什麼安全

查詢指令:cat /proc/cpuinfo服務器

 

內存  至關於閃存,cpu幹活的地方(數據存放的地方)

查詢指令:cat /proc/meminfo

 

硬盤   將重要的數據記錄起來,以便將來再次使用這些數據

查詢指令:fdisk -l (須要root權限)

 

No-sql 非關係型數據庫數據存內存中:讀取速度快

360安全管家清理的數據存在磁盤中

固態硬盤:快 分散式讀寫   & 機械硬盤  通道式的讀寫

二級緩存:介於cpu 與內存之間(平常 中不多用)

磁盤I/O

一切問題兼I/O (聯繫數據庫讀寫操做理解)

理解數據庫的執行過程

一、讀取的數據越多,數據不在內存中的機率更大,須要從磁盤中讀取寫入內存,再從內存中經過cpu拿走。內存尋址

--大機率不在內存中:不是熱點數據不在內存中

寫的sql 性能很差(例如select * from students;)

二、寫操做將數據寫到內存,內存自動同步到磁盤。同步速度不夠快則會形成數據丟失

 

面試題:cpu 、內存、磁盤之間的關係?

Cpu 至關於車間的工人,內存至關於車間,磁盤至關於倉庫

怎麼提升加工效率:加人、加大車間

 

2、Linux 監控分析命令

Top  命令

思考題1:

用戶態、系統態

Root 用戶起了Java進程消耗的是用戶進程仍是系統進程  —用戶進程

Java進程寫日誌的時候(寫入磁盤)是消耗用戶進程仍是系統進程  —系統進程(寫日誌的時候調用的是系統內核)

負載(load average)過去一分鐘、過去五分鐘、過去十五分鐘的平均負載

思考題2:負載高cpu必定高麼?cpu 低負載就必定低麼?    不必定。

CPU  與負載有關係,但沒有絕對關係

好比:

Cpu 正在調度的一個進程,時間片都給了這個進程 cpu 使用率高但負載不高

cpu 使用率20% ,但系統有大量等待I/O的返回  這個時候負載比較高

思考題3:負載怎麼去理解?

類比:3條車道的馬路

      0 1 2 3  4+以上就會出現排隊

負載= cpu正在調度的進程(running)+正在等待I/O的進程之和

負載多少合理取決於cpu 顆粒數 

雙核cpu 理論上負載小於等於2就能夠

通常:負載是cpu顆粒數的 70%~80%

cpu使用率多少合適取決於什麼類型的應用

I/O 密集型(常見)--  讀取數據,建議cpu 不超過80%(us+sy)

CPU計算密集型-- 大部分時間都在作計算用 ,cpu 達到100% 也很正常

Vmstat 命令: r(running),不包含sleeping狀態的進程  b(正在等待I/O的進程)

 

A – running(等待)—running(真,拿到時間片)—--等待I/o過程,中斷不可恢復狀態--中斷不可恢復--running(真)

中斷不可恢復(中斷過程不可干預,必定會返回一個結果)是等待io返回 io返回後中斷就恢復

中斷可恢復是等待外部輸入,好比外部input後恢復 這種不算入負載

B -running(等待)-- running(等待)             -- running(真,拿到時間片)     —等待input 操做(中斷可恢復狀態)--

c-running(等待) --running(等待)              --running(等待)                -- running(真,拿到時間片)---

                                             --負載爲2                     --     負載爲2

性能好壞的評估要結合負載與cpu 一塊兒看

 

進程中存在的狀態:running  sleeping(包含中斷可恢復狀態、中斷不可恢復狀態),同一瞬間只有一個running 狀態  sleeping狀態是大多數進程的狀態

Kill -9 殺不掉進程的狀況:該進程是中斷不可恢復狀態

網絡帶寬:

看cpu-Top 命令:

三個區域

Us  用戶進程

Sy  系統進程

Ni 改變過優先級的進程

Id 空閒cpu

Wa 等待

Hi 硬中斷

Si 軟中斷

St 強制內存交換

Mem (物理內存)

虛擬內存(swap):在磁盤上開闢一塊空間看成內存使用,可是會利用內存已分配過但再也不使用的物理內存的空間

大部分在磁盤上小部分在內存上。

用到虛擬內存的話,進程就會卡

緩存:把頻繁的數據緩存起來,看成緩存。下次用到時從緩存中讀取,快。

緩衝:把要同步到磁盤的文件緩衝起來,寫入磁盤

Mem-Buffer 緩衝

Swap -Cache 緩存

緩存與緩衝不佔用自己的內存

Linux中Buffer和Cache的區別

1. Cache:緩存區,是高速緩存,是位於CPU和主內存之間的容量較小但速度很快的存儲器,由於CPU的速度遠遠高於主內存的速度,

CPU從內存中讀取數據需等待很長的時間,而  Cache保存着CPU剛用過的數據或循環使用的部分數據,這時從Cache中讀取數據會更快,減小了CPU等待的時間,提升了系統的性能。

  Cache並非緩存文件的,而是緩存塊的(塊是I/O讀寫最小的單元);Cache通常會用在I/O請求上,若是多個進程要訪問某個文件,

能夠把此文件讀入Cache中,這樣下一個進程獲取CPU控制權並訪問此文件直接從Cache讀取,提升系統性能。

2. Buffer:緩衝區,用於存儲速度不一樣步的設備或優先級不一樣的設備之間傳輸數據;經過buffer能夠減小進程間通訊須要等待的時間,

當存儲速度快的設備與存儲速度慢的設備進行通訊時,存儲慢的數據先把數據存放到buffer,達到必定程度存儲快的設備再讀取buffer的數據,在此期間存儲快的設備CPU能夠幹其餘的事情。

Buffer:通常是用在寫入磁盤的,例如:某個進程要求多個字段被讀入,當全部要求的字段被讀入以前已經讀入的字段會先放到buffer中。

 

Java系統基本不須要關注內存的使用率(內存溢出)的狀況-- —  初始化的時候分闢一塊內存使用空間,4G內存初始化的時候分配3G cpu使用率爲75% 

Mjava=heap+noheap+direct m

非java系統須要考慮內存的使用率,好比C --

交互區   java是線程模式

進程區 cpu 不可能超100%

任務區 每一個任務都有可能超100% -多核cpu

virt進程所佔的內存

Res 進程所佔的物理內存

Shr  共享內存

Uptime  查看負載

Vmstat 

Vmstat 2  每隔2s打印狀況 能夠看進程隊列、i/O的使用狀況

Sar  2(delay)  4 (count)

Sar -q 2 4

Runq-sz  正在運行的進程隊列

Plist-sz   當前系統進程(非正在運行的進程)與線程之和

看內存-top \free -m \sar 命令

看內存是否充裕

Si 從內存到磁盤 swap in

So  從磁盤到內存 swap out

Iostat

Sar -B ,-r -w

百度:linux 內存 缺頁

缺頁計算邏輯

看磁盤-iostat ,sar -d

Device 區域  tps   io 次數

 iostat -x

rrqm/s  wrqm/s  合併

r/s  w/s 

看網絡-netstat  -i ,tcpdump

 

總結:(01:45)

Cpu:使用率 負載 隊列 -- top  sar iostat vmstat

內存:pgin  pgout  剩餘  swap 使用  --sar  top  vmstat  free

磁盤:r/S w/S  隊列 操做時間(總體服務時間) busy--iostat -x, sar -d,nmon

網絡:上行 下行 丟包 --–netstat nmon

分析:

Cpu 使用率通常不超過80%   (us+sy)

us 太高,系統進程佔的cpu 太高,進程等待時間切片的時間愈來愈長

Cpu 使用異常,平時保存在10%,忽然一天到達40%

負載數:小於等於cpu 顆粒數

負載大於cpu顆粒數:有不少等待進程。

 

對於cpu 來講首先看負載,負載高看cpu 高不高

一、看cpu使用狀況,使用率高解決使用率高的問題;

二、使用率不高看進程隊列 sar  -q   vmstat

看正在調度的進程數高仍是等待io 的進程數高

等待io 的進程數高說明等待服務器的返回,看下等待什麼東西的返回

若是是cpu正在調度的進程數高,說明進程起多了或cpu 在時間切片內沒有執行完還在繼續幹活

 Cpu 使用率太高--查cpu太高的緣由:

user(用戶進程高,查哪一個用戶進程佔用率高。Java  查看java 下哪一個線程使用率太高,把線程棧信息打印出來;

看這個佔cpu 線程比較高的棧正在執行的方法)

system (系統進程高,系統內核調度:I、大量磁盤io致使(判斷是否io致使:看磁盤隊列、看磁盤繁忙程度(nmon)-超過30% 具體是磁盤讀仍是寫致使的。讀磁盤-內存不夠了,

須要從磁盤中拿數據了;寫磁盤致使-系統寫操做太多,減小寫操做,查看應用程序中有哪些寫操做   好比寫日誌、info日誌級別就好,少用debug;寫不少文件 將寫操做合併或減小寫操做)

II、中斷(上下文切換,一、頻繁進程搶佔(進程優先級搶佔  top  );二、這個時間片內未調度完(程序執行慢)   top 中hi si  vmstat 中system 的cs in 指標 )

上下文切換,從這個進程切換到下一個進程 ,說明在這個時間片內當前任務沒有執行完強制切換到下一個時間片,要不就是進程在頻繁的搶佔

 

Strace  終極命令  系統使用率太高時分析不出問題的話可用該命令 看完以後就沒有而後了

 

是根據系統內核調用的命令

系統內核調用哪一個模塊調用了多少次

cpu 負載

內存:top  命令 看free 是否持續減小,而且swap有沒有持續上升

磁盤:nmon  中的busy 超過30% 說明磁盤比較繁忙

隊列  Sar -d  iostat -x ( await  svctm )

有排隊現象看 讀多仍是寫多

網絡:netstat -i  /tcpdump (沒講) 看上行、下行 ,是否丟包

nmon 使用

相關文章
相關標籤/搜索