Linux應(yīng)用性能分析及故障排查

本文核心內(nèi)容:

  • Linux性能分析
  • 故障模擬和混沌工廠
  • 故障分析和解決

一嫉你、Linux性能分析

上圖剑令、性能優(yōu)化命令速查哪替,圖片較大,建議下載回本地

性能優(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ù)載的一些情況

image.png

注意: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)程之間的切換

進(jìn)程上下文切換

線程上下文切換
舉例:
thread1 ---> thread3请琳,這個(gè)時(shí)候進(jìn)程內(nèi)共享的上下文信息,不需要去加載赠幕,但是呢俄精,需要切換每個(gè)線程棧的信息,這個(gè)時(shí)候就是線程的上下切換

進(jìn)程上下文切換

中斷上下文切換
這里涉及到內(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í)間再去采樣刷新一次信息

vmstat

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):

    1. CPU負(fù)載小于核數(shù)*0.7
    1. CPU負(fù)載小于核數(shù)-1

如何分析CPU

    1. 查看CPU核數(shù)
    1. 查CPU負(fù)載和CPU使用率
    1. 查看進(jìn)程CPU使用情況
    1. 查看線程上下文切換情況
    1. 查看線程的CPU使用情況

注:這里感興趣的可以自行去了解查詢資料

1.4 內(nèi)存性能指標(biāo)

空閑內(nèi)存
Swap使用率
緩沖和緩存
Slabs描述的內(nèi)核使用量
活動(dòng)和非活動(dòng)內(nèi)存

free -m

1366178220_5505.gif

理解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í)間
IO性能指標(biāo)

順序讀寫和隨機(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不通(先排除不讓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

top

vmstat 2

vmstat

新時(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耐ⅰ!汽绢!

\color{green}{Linux公開學(xué)習(xí)視頻推薦:}https://ke.qq.com/course/434219

當(dāng)然也可以加群857565362一起學(xué)習(xí)共同進(jìn)步

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末吗跋,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌跌宛,老刑警劉巖酗宋,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異秩冈,居然都是意外死亡本缠,警方通過(guò)查閱死者的電腦和手機(jī)斥扛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門入问,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人稀颁,你說(shuō)我怎么就攤上這事芬失。” “怎么了匾灶?”我有些...
    開封第一講書人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵棱烂,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我阶女,道長(zhǎng)颊糜,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任秃踩,我火速辦了婚禮衬鱼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘憔杨。我一直安慰自己鸟赫,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開白布消别。 她就那樣靜靜地躺著抛蚤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪寻狂。 梳的紋絲不亂的頭發(fā)上岁经,一...
    開封第一講書人閱讀 49,950評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音蛇券,去河邊找鬼缀壤。 笑死,一個(gè)胖子當(dāng)著我的面吹牛怀读,可吹牛的內(nèi)容都是我干的诉位。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼菜枷,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼苍糠!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起啤誊,我...
    開封第一講書人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤岳瞭,失蹤者是張志新(化名)和其女友劉穎拥娄,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瞳筏,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡稚瘾,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了姚炕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片摊欠。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖柱宦,靈堂內(nèi)的尸體忽然破棺而出些椒,到底是詐尸還是另有隱情,我是刑警寧澤掸刊,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布免糕,位于F島的核電站,受9級(jí)特大地震影響忧侧,放射性物質(zhì)發(fā)生泄漏石窑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一蚓炬、第九天 我趴在偏房一處隱蔽的房頂上張望松逊。 院中可真熱鬧,春花似錦试吁、人聲如沸棺棵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)烛恤。三九已至,卻和暖如春余耽,著一層夾襖步出監(jiān)牢的瞬間缚柏,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工碟贾, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留币喧,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓袱耽,卻偏偏與公主長(zhǎng)得像杀餐,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子朱巨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350