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 緩存
緩存與緩衝不佔用自己的內存
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 使用