本文核心內(nèi)容:
- Linux性能分析
- 故障模擬和混沌工廠
- 故障分析和解決
一嫉你、Linux性能分析
上圖剑令、性能優(yōu)化命令速查哪替,圖片較大,建議下載回本地
1.1 什么是Linux性能問(wèn)題
- CPU使用率過(guò)高 00%:沃8!
- CPU負(fù)載過(guò)高
- 內(nèi)存溢出
- 磁盤空間不夠
- 網(wǎng)絡(luò)寬帶被打滿
是系統(tǒng)資源不夠溶推?還是程序?qū)懙挠袉?wèn)題徊件?
1.2 Linux下四大性能指標(biāo)
- 內(nèi)存
- CPU
- 磁盤
- 帶寬
1.3 CPU性能指標(biāo)
CPU使用率:CPU的使用率
平均負(fù)載:?jiǎn)挝粫r(shí)間內(nèi)的活躍線程數(shù)
用戶時(shí)間:CPU在用戶進(jìn)程上的實(shí)際百分比
系統(tǒng)時(shí)間:CPU在內(nèi)核上花費(fèi)的實(shí)際百分比
空閑時(shí)間:系統(tǒng)處于在等待IO操作上的時(shí)間總和
等待:CPU花費(fèi)在等待IO操作上的時(shí)間總和
Nice時(shí)間:CPU優(yōu)先執(zhí)行的時(shí)間百分比
CPU使用率和CPU負(fù)載
CPU使用率是單位時(shí)間內(nèi)CPU繁忙情況的統(tǒng)計(jì),跟平均負(fù)載并不一定完全對(duì)應(yīng)
平均負(fù)載是單位時(shí)間內(nèi)的活躍進(jìn)程數(shù)(處于可運(yùn)行狀態(tài)和不可中斷狀態(tài)的進(jìn)程蒜危,也就是有沒(méi)有獲取到時(shí)間片)
這里舉個(gè)形象的例子:
比如我們?nèi)プ娞菔郏娞菀淮沃荒茏?0個(gè)人,假設(shè)現(xiàn)在電梯內(nèi)有10個(gè)人那么負(fù)載就是剛好的*1辐赞,一部電梯就是一核CPU部翘,10個(gè)人剛剛好,但是超過(guò)10個(gè)人响委,其他人就得等待新思,10個(gè)人先上去,剩下的人就得等待赘风,這時(shí)候就涉及到了CPU的等待情況夹囚,CPU已經(jīng)繁忙了,本來(lái)10個(gè)人CPU的繁忙是1贝次,那么20人崔兴、30人彰导,那么CPU的負(fù)載就是2倍蛔翅、3倍、甚至是4倍位谋,CPU的使用率就是山析,每一層有多少人下去,假設(shè)電梯里的10個(gè)人都是去同一層掏父,那么這個(gè)使用率就是非常高的
使用top
命令笋轨,我們可以查詢到CPU的使用率,等待,平均負(fù)載的一些情況
注意:CPU負(fù)載和CPU使用率沒(méi)有直接關(guān)系>粽=龇怼!
CPU負(fù)載和使用率的關(guān)系
CPU密集型進(jìn)程钾挟,使用大量的CPU會(huì)導(dǎo)致平均負(fù)載升高洁灵,此時(shí)這兩者是一致的
I/O密集型進(jìn)程,等待I/IO也會(huì)導(dǎo)致平均負(fù)載升高掺出,但CPU使用率不一定很高
大量等待CPU的進(jìn)程調(diào)度也會(huì)導(dǎo)致平均負(fù)載升高徽千,此時(shí)的CPU使用率也會(huì)比較高
所以我們可以知道,辨別一個(gè)程序是不是耗費(fèi)CPU汤锨,就要看它是CPU密集型還是I/O密集型双抽,CPU密集型就是程序執(zhí)行大量的計(jì)算,這個(gè)時(shí)候CPU的使用率會(huì)非常高闲礼、而I/O密集型就是程序會(huì)讀取大量的I/O牍汹,比如網(wǎng)絡(luò)間傳輸大文件,或者是Mysql全表掃描的情況柬泽,這個(gè)CPU負(fù)載非常高柑贞,但是CPU使用率很低,因?yàn)檫@個(gè)時(shí)候一直在等待I/O聂抢。
注意:CPU負(fù)載和CPU使用率沒(méi)有直接關(guān)系>弧!琳疏!
CPU上下文切換
CPU寄存器是CPU內(nèi)置的容量小有决,但速度極快的內(nèi)存。
程序計(jì)數(shù)器用來(lái)存儲(chǔ)CPU正在執(zhí)行的指令位置空盼,即將執(zhí)行的下一條指令位置书幕,這些都是CPU執(zhí)行任務(wù)前,要依賴的環(huán)境揽趾,也叫做CPU上下文台汇。
上下文切換,就是先把前一個(gè)任務(wù)的CPU上下文篱瞎,保存起來(lái)苟呐,然后加載新任務(wù)的上下文到寄存器和計(jì)數(shù)器中,才開始運(yùn)行新任務(wù)
上下文切換的次數(shù)
盡量減少CPU的上下文切換@睢GK亍!
上下文切換的幾類:
- 進(jìn)程上下文切換
- 線程上下文切換
- 中斷上下文切換
進(jìn)程上下文切換
舉例:
假設(shè)我們程序先執(zhí)行的thread1
---> 下個(gè)時(shí)間片輪到thread2
澄者,那么就是進(jìn)程1
---> 進(jìn)程2
笆呆,這也就是進(jìn)程之間的切換
線程上下文切換
舉例:
thread1
---> thread3
请琳,這個(gè)時(shí)候進(jìn)程內(nèi)共享的上下文信息,不需要去加載赠幕,但是呢俄精,需要切換每個(gè)線程棧的信息,這個(gè)時(shí)候就是線程的上下切換
中斷上下文切換
這里涉及到內(nèi)核的中斷榕堰,就是CPU暫停正在執(zhí)行的程序嘀倒,保存狀態(tài),也就是中斷它局冰,然后在CPU處理完后會(huì)回到斷點(diǎn)繼續(xù)執(zhí)行测蘑,跟進(jìn)程上下文切換一樣,中斷上下文切換也需要消耗CPU
如何分析上下文切換
執(zhí)行vmstat命令康二,查看系統(tǒng)整體情況
cs(context switch)是每秒上下文切換的次數(shù)
in(interrupt)是每秒中斷的次數(shù)
r (Running or Runnable)是就緒隊(duì)列的長(zhǎng)度碳胳,也就是正在運(yùn)行和等待CPU的進(jìn)程數(shù)
b(Blocked)則是處于不可中斷睡眠狀態(tài)的進(jìn)程數(shù)
vmstat 5
注:5這個(gè)參數(shù)是指我們多長(zhǎng)時(shí)間再去采樣刷新一次信息
CPU負(fù)載高、使用率低沫勿?
產(chǎn)生原因
等待磁盤I/O完成的進(jìn)程過(guò)多挨约,導(dǎo)致進(jìn)程隊(duì)列長(zhǎng)度過(guò)大,但是cpu運(yùn)行的進(jìn)程卻很少产雹,這樣就體現(xiàn)到負(fù)載過(guò)大了诫惭,cpu使用率低
常見場(chǎng)景
磁盤讀寫請(qǐng)求過(guò)多導(dǎo)致大量IO等待Mysql死鎖
、Mysql全表掃描
什么樣的指標(biāo)才是合理的使用CPU
CPU使用率高蔓挖、負(fù)載同時(shí)也高夕土,是完全的CPU使用
像我們常說(shuō)的高性能
不只是說(shuō)我們的qps
上去了,而是要我們單機(jī)的CPU使用率達(dá)到了最優(yōu)瘟判,這個(gè)時(shí)候才是高性能怨绣、否則就是浪費(fèi)機(jī)器,用機(jī)器堆出來(lái)的高性能拷获。
負(fù)載最優(yōu)業(yè)界兩種指標(biāo):
- CPU負(fù)載小于核數(shù)*0.7
- CPU負(fù)載小于核數(shù)-1
如何分析CPU
- 查看CPU核數(shù)
- 查CPU負(fù)載和CPU使用率
- 查看進(jìn)程CPU使用情況
- 查看線程上下文切換情況
- 查看線程的CPU使用情況
注:這里感興趣的可以自行去了解查詢資料
1.4 內(nèi)存性能指標(biāo)
空閑內(nèi)存
Swap使用率
緩沖和緩存
Slabs描述的內(nèi)核使用量
活動(dòng)和非活動(dòng)內(nèi)存
free -m
理解Cached
cached通常屬于available部分(該數(shù)據(jù)3.14內(nèi)核之后提供篮撑,procps-ng較新版本也顯示),也就是可用內(nèi)存。什么時(shí)候程序需要了匆瓜,什么時(shí)候拿去用赢笨。
理解Swap
簡(jiǎn)單來(lái)講,就是用硬盤的一塊空間來(lái)當(dāng)做內(nèi)存使用驮吱。
內(nèi)存不足時(shí)茧妒,會(huì)使用Swap,把進(jìn)程暫時(shí)不用的數(shù)據(jù)存儲(chǔ)到磁盤中
Swap會(huì)導(dǎo)致嚴(yán)重的性能問(wèn)題
理解Cached過(guò)大是怎么回事糠馆?
使用Nginx嘶伟、Netty時(shí)Cached用量過(guò)大,為什么又碌?
這些都是高性能的網(wǎng)絡(luò)I/O程序九昧,并且還要記日志的,這個(gè)時(shí)候網(wǎng)絡(luò)I/O和磁盤I/O都是需要做臨時(shí)存儲(chǔ)毕匀,做緩存的
清空cached铸鹰,cached是系統(tǒng)為了提升I/O性能給你緩存下來(lái)的,是可以清空的皂岔!
清空cached是不會(huì)影響系統(tǒng)數(shù)據(jù)的蹋笼!
echo 1 > /proc/sys/vm/drop_caches
1.5 IO性能指標(biāo)
- 磁盤使用率
- IO飽和度
- IOPS
- 吞吐量
- 響應(yīng)時(shí)間
順序讀寫和隨機(jī)讀寫
順序讀寫和隨機(jī)讀寫,我們一般稱為順序IO躁垛、隨機(jī)IO剖毯。
順序IO: 可以通過(guò)預(yù)讀來(lái)將一部分?jǐn)?shù)據(jù)提前加載到內(nèi)存中
隨機(jī)IO: 需要多次尋址
舉例:為什么Kafka性能高,順序?qū)懀ㄗ芳訉懀┧沁B續(xù)的
標(biāo)準(zhǔn)IO教馆、直接IO逊谋、MMAP
標(biāo)準(zhǔn)IO:緩存IO、系統(tǒng)默認(rèn)IO
直接IO:直接讀取硬盤(直接IO+異步IO)
mmap: 內(nèi)存映射
頁(yè)緩存
持久化應(yīng)該怎么做土铺?
- 方法一:來(lái)一行胶滋,持久化一行。
- 方法二:來(lái)一行悲敷,內(nèi)存中記錄下來(lái)究恤,累計(jì)一批,刷盤持久化后德!
Kafka --->寫入頁(yè)緩存--->磁盤
線上磁盤最常出的問(wèn)題
磁盤可用空間不足部宿,怎么辦?
首頁(yè)想到的是什么瓢湃?清理日志?呱汀!箱季!
如果清理了日志涯穷,還是不行,那么就尋址存在的大文件
du -h --max-depth=1
什么地方容易出現(xiàn)IO問(wèn)題藏雏?
- 中間件
- 消息隊(duì)列Kafka
- 搜索引擎ElasticSearch
- 數(shù)據(jù)庫(kù)Mysql
應(yīng)用
大批量日志打涌娇觥(同步打印,異步打泳蚺埂)
iostat
更多我們可以查看第一張圖的速查表W荨!奏寨!
好用的磁盤IO性能排查工具
iostat:查看塊設(shè)備維度的磁盤IO情況
pidstat:查看進(jìn)程級(jí)別的資源情況
iotop:查看磁盤整體情況和各進(jìn)程情況
先通過(guò)iostat查看整體的磁盤IO情況
在結(jié)合iotop和pidstat分析具體的進(jìn)程情況
1.6 網(wǎng)絡(luò)性能指標(biāo)
寬帶:百兆起意、千兆
吞吐量:
延遲:網(wǎng)絡(luò)發(fā)起 - 收到響應(yīng)的耗時(shí)
PPS:Package Per Second,每秒傳輸?shù)陌鼣?shù)
網(wǎng)絡(luò)可用性:網(wǎng)絡(luò)通不通
并發(fā)連接數(shù):
丟包率:網(wǎng)絡(luò)故障病瞳、發(fā)生n次揽咕,失敗m次
網(wǎng)絡(luò)可用性
網(wǎng)絡(luò)通不通悲酷,先來(lái)ping一ping
ping不通(先排除不讓ping的情況),原因排查亲善,測(cè)試網(wǎng)絡(luò)路由情況设易,斷在那里?
traceroute
蛹头,網(wǎng)絡(luò)路由情況顿肺,一覽無(wú)遺!T稀屠尊!
DNS查詢
nslookup www.baidu.com
網(wǎng)卡配置查看
要查看網(wǎng)絡(luò)配置,通過(guò)ipconfig
| ip addr
查看網(wǎng)卡信息和網(wǎng)絡(luò)新耕拷。
二讼昆、故障模擬和混沌工廠
2.1 模擬故障工具
Sysbench:https://github.com/akopytov/sysbench
模擬20個(gè)線程,壓測(cè)3分鐘
sysbench --threads=20 --time=180 threads run
然后我們通過(guò)top和vmstat查看
top
vmstat 2
新時(shí)代的故障注入工具——混沌工程
混沌工程是一門新興的技術(shù)學(xué)科斑胜,他的初衷是通過(guò)實(shí)驗(yàn)性的方法控淡,讓人們建立對(duì)于復(fù)雜分布式系統(tǒng)在生產(chǎn)中抵御突發(fā)事件能力的信心。 - -混沌工程原則
故障演練
ChaosBlade
ChaosBlade 是一款遵循混沌工程實(shí)驗(yàn)原理止潘,建立在阿里巴巴近十年故障測(cè)試和演練實(shí)踐基礎(chǔ)上掺炭,并結(jié)合了集團(tuán)各業(yè)務(wù)的最佳創(chuàng)意和實(shí)踐,提供豐富故障場(chǎng)景實(shí)現(xiàn)凭戴,幫助分布式系統(tǒng)提升容錯(cuò)性和可恢復(fù)性的混沌工程工具涧狮。
https://github.com/chaosblade-io/chaosblade/blob/master/README_CN.md
參考文章:
https://blog.csdn.net/u013256816/article/details/99917021
https://www.cnblogs.com/pigpdong/p/10932415.html
三、故障分析和解決
3.1 分析CPU問(wèn)題
1. top命令分析上下文切換
2. vmstat分析上下文切換
3. pidstat分析上下文切換和CPU使用情況
4. 通過(guò)ps獲取進(jìn)程ID
5. strace跟蹤進(jìn)程情況
這里就不截圖了么夫,文章的核心是提供思路者冤,而這些命令相信大家都基本了解過(guò),如果有不了解的档痪,可以查閱一下資料
3.2 優(yōu)化CPU問(wèn)題
1. 程序減少不必要的工作
2. 程序減少循環(huán)層次涉枫、減少遞歸
3. 優(yōu)化算法
4. 異步處理,防止阻塞
5. 善用緩存腐螟,防止IO等待
6. CPU綁定(nginx綁定CPU)
7. 限制CPU資源(cgroup愿汰,docker)
3.3 監(jiān)控
CPU需要監(jiān)控
內(nèi)存需要監(jiān)控
磁盤空間需要監(jiān)控
....
監(jiān)控之后,程序還要告警乐纸,通知我們處理問(wèn)題3耐ⅰ!汽绢!