一、概述
1.1 背景介紹
在實(shí)際生產(chǎn)環(huán)境中,系統(tǒng)性能問(wèn)題往往來(lái)得突然又難以定位。某天下午,你可能會(huì)接到告警:電商平臺(tái)響應(yīng)時(shí)間從平時(shí)的200ms突然飆升到2秒,用戶投訴激增,運(yùn)營(yíng)團(tuán)隊(duì)焦急萬(wàn)分。這時(shí)候,如何快速準(zhǔn)確地找到性能瓶頸,就成了運(yùn)維工程師的核心能力。
性能問(wèn)題的表現(xiàn)形式多種多樣:應(yīng)用響應(yīng)緩慢、頁(yè)面加載卡頓、API接口超時(shí)、數(shù)據(jù)庫(kù)查詢變慢等等。但歸根結(jié)底,這些問(wèn)題通常源于三大系統(tǒng)資源的瓶頸:CPU、內(nèi)存、磁盤(pán)IO。
很多時(shí)候,我們?nèi)菀紫萑?頭痛醫(yī)頭、腳痛醫(yī)腳"的誤區(qū)??吹紺PU使用率高就加CPU,看到內(nèi)存不足就加內(nèi)存,結(jié)果錢花了不少,問(wèn)題依然存在。實(shí)際上,性能優(yōu)化需要系統(tǒng)化的診斷方法,要理解各個(gè)資源之間的關(guān)聯(lián)關(guān)系。比如,磁盤(pán)IO慢可能導(dǎo)致進(jìn)程等待,進(jìn)而引發(fā)CPU的iowait升高;內(nèi)存不足會(huì)觸發(fā)頻繁的頁(yè)面交換,同樣會(huì)拖累磁盤(pán)IO性能。
本文將介紹一套完整的性能診斷方法論,從整體到局部,從現(xiàn)象到本質(zhì),幫助你快速定位系統(tǒng)瓶頸。這套方法基于Linux系統(tǒng)自帶的工具,無(wú)需額外安裝復(fù)雜的監(jiān)控系統(tǒng),就能在生產(chǎn)環(huán)境中快速排查問(wèn)題。
1.2 技術(shù)特點(diǎn)
系統(tǒng)化診斷流程:采用"自頂向下"的分析思路,先看整體資源使用情況,再深入到具體進(jìn)程和線程。避免盲目?jī)?yōu)化,確保每一步都有數(shù)據(jù)支撐。通過(guò)建立性能基線,對(duì)比歷史數(shù)據(jù),能夠快速識(shí)別異常波動(dòng)。
多維度性能指標(biāo):不僅僅關(guān)注CPU使用率、內(nèi)存占用這些表面指標(biāo),更要深入分析上下文切換、緩存命中率、IO等待時(shí)間等深層指標(biāo)。這些指標(biāo)往往能揭示性能問(wèn)題的真正原因。比如,CPU使用率只有50%,但上下文切換頻率極高,說(shuō)明存在嚴(yán)重的線程競(jìng)爭(zhēng)問(wèn)題。
工具鏈完整實(shí)用:Linux系統(tǒng)內(nèi)置了一整套性能分析工具(top、vmstat、iostat、mpstat、pidstat等),這些工具經(jīng)過(guò)多年驗(yàn)證,穩(wěn)定可靠。掌握這些工具的使用方法,就能應(yīng)對(duì)90%以上的性能問(wèn)題。更重要的是,這些工具開(kāi)銷很小,可以在生產(chǎn)環(huán)境中放心使用。
1.3 適用場(chǎng)景
場(chǎng)景一:Web應(yīng)用服務(wù)器性能優(yōu)化典型表現(xiàn)是高并發(fā)時(shí)響應(yīng)時(shí)間顯著增加。比如電商平臺(tái)在促銷活動(dòng)期間,用戶訪問(wèn)量激增,服務(wù)器CPU使用率飆升到90%以上,大量請(qǐng)求超時(shí)。通過(guò)診斷發(fā)現(xiàn),問(wèn)題可能出在應(yīng)用線程池配置不合理,導(dǎo)致頻繁的上下文切換;也可能是某個(gè)接口存在性能問(wèn)題,占用了大量CPU資源。診斷重點(diǎn)包括:CPU各核心的使用分布、進(jìn)程和線程的CPU占用、系統(tǒng)調(diào)用開(kāi)銷、上下文切換頻率等。優(yōu)化方向可能是調(diào)整線程池大小、優(yōu)化代碼邏輯、增加緩存、或者進(jìn)行水平擴(kuò)展。
場(chǎng)景二:數(shù)據(jù)庫(kù)服務(wù)器瓶頸定位數(shù)據(jù)庫(kù)是很多系統(tǒng)的核心,一旦出現(xiàn)性能問(wèn)題,影響面會(huì)非常大。常見(jiàn)表現(xiàn)是查詢變慢、事務(wù)堆積、連接數(shù)打滿。通過(guò)診斷可能發(fā)現(xiàn):磁盤(pán)IO性能不足,大量慢查詢導(dǎo)致磁盤(pán)讀寫(xiě)壓力大;內(nèi)存配置不當(dāng),緩沖池太小導(dǎo)致緩存命中率低;或者是CPU瓶頸,復(fù)雜查詢消耗大量計(jì)算資源。診斷重點(diǎn)包括:磁盤(pán)IO的吞吐量和延遲、內(nèi)存緩沖池的使用情況、慢查詢?nèi)罩痉治?、鎖等待情況等。優(yōu)化方向可能是添加索引、優(yōu)化查詢語(yǔ)句、調(diào)整數(shù)據(jù)庫(kù)配置參數(shù)、升級(jí)硬件(特別是使用SSD替換機(jī)械硬盤(pán))。
場(chǎng)景三:批處理任務(wù)性能分析很多企業(yè)都有定時(shí)運(yùn)行的批處理任務(wù),比如數(shù)據(jù)同步、報(bào)表生成、日志分析等。這類任務(wù)的特點(diǎn)是運(yùn)行時(shí)間長(zhǎng)、資源占用集中。如果任務(wù)執(zhí)行時(shí)間從原來(lái)的1小時(shí)增加到4小時(shí),就需要分析是哪個(gè)環(huán)節(jié)出了問(wèn)題??赡苁荂PU密集型任務(wù)(如數(shù)據(jù)計(jì)算、加密解密),也可能是IO密集型任務(wù)(如大文件讀寫(xiě)、數(shù)據(jù)庫(kù)批量插入)。診斷重點(diǎn)包括:任務(wù)的資源使用特征、是否存在資源競(jìng)爭(zhēng)、磁盤(pán)IO模式(順序讀寫(xiě)還是隨機(jī)讀寫(xiě))等。優(yōu)化方向可能是并行處理、調(diào)整IO調(diào)度策略、使用更快的存儲(chǔ)設(shè)備、或者優(yōu)化算法減少計(jì)算量。
1.4 環(huán)境要求
| 組件 | 版本要求 | 說(shuō)明 |
|---|---|---|
| 操作系統(tǒng) | CentOS 7+/Ubuntu 18.04+/Debian 10+ | 需要支持systemd和現(xiàn)代Linux內(nèi)核特性 |
| 內(nèi)核版本 | Linux 4.4+ | 較新的內(nèi)核提供了更完善的性能監(jiān)控接口 |
| sysstat工具包 | 11.0+ | 包含iostat、mpstat、pidstat等核心工具 |
| 權(quán)限要求 | root或sudo權(quán)限 | 部分診斷命令需要提升權(quán)限才能查看完整信息 |
| 硬件配置 | 無(wú)特殊要求 | 本文方法適用于任何規(guī)模的Linux系統(tǒng) |
二、詳細(xì)步驟
2.1 準(zhǔn)備工作
2.1.1 系統(tǒng)檢查
在開(kāi)始性能診斷之前,需要先了解系統(tǒng)的基本配置信息,建立一個(gè)清晰的認(rèn)知基礎(chǔ)。
# 查看系統(tǒng)版本和內(nèi)核信息 cat /etc/os-release uname -a # 查看CPU信息 lscpu nproc # 快速查看CPU核心數(shù) # 查看內(nèi)存信息 free -h cat /proc/meminfo | head -20 # 查看磁盤(pán)信息 df -h lsblk
說(shuō)明:這些命令幫助我們了解硬件配置的基本情況。比如,一個(gè)8核16G內(nèi)存的服務(wù)器和一個(gè)2核4G的服務(wù)器,性能診斷的關(guān)注點(diǎn)會(huì)有很大不同。CPU核心數(shù)決定了系統(tǒng)的并行處理能力,內(nèi)存大小影響緩存策略,磁盤(pán)類型(SSD還是HDD)直接關(guān)系到IO性能。
2.1.2 安裝依賴工具
大部分Linux發(fā)行版默認(rèn)已經(jīng)安裝了基礎(chǔ)的性能工具,但sysstat包可能需要手動(dòng)安裝。
# Ubuntu/Debian系統(tǒng) sudo apt update sudo apt install -y sysstat # CentOS/RHEL系統(tǒng) sudo yum install -y sysstat # 驗(yàn)證安裝 iostat -V mpstat -V pidstat -V
工具說(shuō)明:
top/htop:實(shí)時(shí)查看進(jìn)程資源占用,系統(tǒng)自帶
vmstat:虛擬內(nèi)存統(tǒng)計(jì),查看系統(tǒng)整體性能
iostat:磁盤(pán)IO性能分析,來(lái)自sysstat包
mpstat:多處理器統(tǒng)計(jì),分析每個(gè)CPU核心的使用情況
pidstat:進(jìn)程級(jí)性能統(tǒng)計(jì),精確定位問(wèn)題進(jìn)程
這些工具的共同特點(diǎn)是:輕量級(jí)、開(kāi)銷小、輸出直觀。在生產(chǎn)環(huán)境中使用不會(huì)對(duì)系統(tǒng)造成明顯影響。
2.2 CPU性能診斷
2.2.1 快速查看CPU整體狀況
當(dāng)接到性能告警時(shí),第一步是快速了解CPU的整體使用情況。
# 使用top查看實(shí)時(shí)CPU使用情況 top # 或者使用uptime查看系統(tǒng)負(fù)載 uptime # 查看CPU平均負(fù)載 cat /proc/loadavg
輸出示例:
top - 1415 up 45 days, 3:21, 2 users, load average: 4.52, 3.89, 2.76 Tasks: 245 total, 3 running, 242 sleeping, 0 stopped, 0 zombie %Cpu(s): 78.5 us, 12.3 sy, 0.0 ni, 5.2 id, 3.8 wa, 0.0 hi, 0.2 si, 0.0 st
關(guān)鍵指標(biāo)解讀:
load average:系統(tǒng)平均負(fù)載,三個(gè)數(shù)字分別代表1分鐘、5分鐘、15分鐘的平均值。一般來(lái)說(shuō),負(fù)載值不應(yīng)超過(guò)CPU核心數(shù)。如果是8核CPU,負(fù)載長(zhǎng)期超過(guò)8就需要關(guān)注了。
us(user):用戶空間CPU使用率,應(yīng)用程序消耗的CPU
sy(system):內(nèi)核空間CPU使用率,系統(tǒng)調(diào)用消耗的CPU
id(idle):空閑CPU百分比
wa(iowait):等待IO的CPU時(shí)間,這個(gè)值高說(shuō)明磁盤(pán)IO可能是瓶頸
實(shí)戰(zhàn)經(jīng)驗(yàn):如果看到iowait超過(guò)20%,基本可以判斷是磁盤(pán)IO問(wèn)題,而不是CPU計(jì)算能力不足。這時(shí)候繼續(xù)優(yōu)化CPU是沒(méi)用的,應(yīng)該轉(zhuǎn)向磁盤(pán)IO診斷。
2.2.2 查看每個(gè)CPU核心的使用情況
現(xiàn)代服務(wù)器都是多核CPU,有時(shí)候會(huì)出現(xiàn)負(fù)載不均衡的情況,某些核心跑滿了,其他核心卻很空閑。
# 查看每個(gè)CPU核心的使用率 mpstat -P ALL 1 5 # 或者使用top然后按1鍵查看各核心情況
輸出示例:
1430 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle 1431 all 45.23 0.00 10.52 2.15 0.00 0.25 0.00 0.00 0.00 41.85 1431 0 89.00 0.00 11.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 1431 1 42.00 0.00 8.00 5.00 0.00 1.00 0.00 0.00 0.00 44.00 1431 2 38.00 0.00 12.00 3.00 0.00 0.00 0.00 0.00 0.00 47.00 1431 3 12.00 0.00 5.00 1.00 0.00 0.00 0.00 0.00 0.00 82.00
分析要點(diǎn):上面的例子中,CPU 0的使用率達(dá)到89%,而CPU 3只有18%,說(shuō)明負(fù)載分布不均。這可能是因?yàn)椋?/p>
應(yīng)用程序是單線程的,無(wú)法利用多核
進(jìn)程CPU親和性設(shè)置不當(dāng),綁定到了特定核心
某個(gè)進(jìn)程占用了大量CPU資源
2.2.3 定位高CPU占用的進(jìn)程
找到了CPU使用率高,下一步就是定位具體是哪個(gè)進(jìn)程在消耗CPU。
# 使用top查看進(jìn)程CPU占用,按P鍵按CPU排序 top # 或者使用ps命令 ps aux --sort=-%cpu | head -10 # 使用pidstat查看進(jìn)程CPU使用情況(推薦) pidstat -u 1 5
pidstat輸出示例:
1415 UID PID %usr %system %guest %wait %CPU CPU Command 1416 0 1234 85.00 10.00 0.00 0.00 95.00 0 java 1416 1000 5678 12.00 3.00 0.00 0.00 15.00 1 nginx 1416 0 9012 8.00 2.00 0.00 0.00 10.00 2 mysqld
說(shuō)明:從上面可以看到,PID為1234的java進(jìn)程占用了95%的CPU,這就是需要重點(diǎn)關(guān)注的對(duì)象。
2.2.4 分析上下文切換
CPU使用率不高,但系統(tǒng)響應(yīng)慢?可能是上下文切換過(guò)于頻繁。
# 使用vmstat查看上下文切換 vmstat 1 5 # 查看每個(gè)進(jìn)程的上下文切換情況 pidstat -w 1 5
vmstat輸出示例:
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 4 0 0 512340 89532 1024576 0 0 2 15 2500 45000 45 10 43 2 0
關(guān)鍵指標(biāo):
cs(context switch):每秒上下文切換次數(shù)。正常情況下幾千到一萬(wàn)次,如果超過(guò)5萬(wàn)次就需要關(guān)注
in(interrupts):每秒中斷次數(shù)
實(shí)戰(zhàn)案例:某電商平臺(tái)在促銷期間,應(yīng)用響應(yīng)變慢,CPU使用率只有60%。通過(guò)vmstat發(fā)現(xiàn)cs值達(dá)到8萬(wàn)次/秒,遠(yuǎn)超正常水平。進(jìn)一步排查發(fā)現(xiàn)是應(yīng)用線程池配置過(guò)大(500個(gè)線程),導(dǎo)致大量線程競(jìng)爭(zhēng)CPU,頻繁切換。將線程池調(diào)整為100后,上下文切換降到2萬(wàn)次/秒,響應(yīng)時(shí)間恢復(fù)正常。
2.3 內(nèi)存性能診斷
2.3.1 查看內(nèi)存使用概況
內(nèi)存問(wèn)題往往比CPU問(wèn)題更隱蔽,但影響更嚴(yán)重。一旦內(nèi)存不足觸發(fā)swap,系統(tǒng)性能會(huì)斷崖式下降。
# 查看內(nèi)存使用情況 free -h # 查看詳細(xì)內(nèi)存信息 cat /proc/meminfo | head -30 # 使用vmstat查看內(nèi)存和swap情況 vmstat 1 5
free命令輸出示例:
total used free shared buff/cache available
Mem: 15Gi 8.2Gi 1.5Gi 256Mi 5.8Gi 6.5Gi
Swap: 2.0Gi 512Mi 1.5Gi
關(guān)鍵指標(biāo)解讀:
total:總內(nèi)存大小
used:已使用內(nèi)存(不包括buff/cache)
free:完全空閑的內(nèi)存
buff/cache:用于緩沖和緩存的內(nèi)存,可以被回收
available:真正可用的內(nèi)存,這是最重要的指標(biāo)
Swap used:交換分區(qū)使用量,如果這個(gè)值不為0,說(shuō)明內(nèi)存已經(jīng)不夠用了
重要提示:很多人看到used很高就以為內(nèi)存不足,其實(shí)不然。Linux會(huì)盡可能利用空閑內(nèi)存做緩存,這是正常的。真正需要關(guān)注的是available這一列,只要這個(gè)值足夠大,系統(tǒng)就不會(huì)有內(nèi)存壓力。
2.3.2 識(shí)別內(nèi)存泄漏
內(nèi)存泄漏是Web應(yīng)用常見(jiàn)的問(wèn)題,表現(xiàn)為內(nèi)存使用持續(xù)增長(zhǎng),最終導(dǎo)致OOM(Out of Memory)。
# 查看進(jìn)程內(nèi)存占用排序 ps aux --sort=-%mem | head -10 # 使用pidstat查看進(jìn)程內(nèi)存使用 pidstat -r 1 5 # 查看進(jìn)程的詳細(xì)內(nèi)存映射 pmap -x
pidstat輸出示例:
1420 UID PID minflt/s majflt/s VSZ RSS %MEM Command 1421 0 1234 125.00 0.00 8192000 4096000 25.60 java 1421 1000 5678 45.00 0.00 2048000 512000 3.20 nginx
關(guān)鍵指標(biāo):
VSZ:虛擬內(nèi)存大小,進(jìn)程申請(qǐng)的總內(nèi)存
RSS:實(shí)際物理內(nèi)存占用,這是真正消耗的內(nèi)存
%MEM:內(nèi)存占用百分比
minflt/s:每秒次缺頁(yè)錯(cuò)誤(minor page fault),從緩存中加載頁(yè)面
majflt/s:每秒主缺頁(yè)錯(cuò)誤(major page fault),需要從磁盤(pán)加載,這個(gè)值高說(shuō)明內(nèi)存不足
診斷內(nèi)存泄漏的方法:
# 持續(xù)監(jiān)控某個(gè)進(jìn)程的內(nèi)存使用 watch -n 5"ps aux | grep java | grep -v grep" # 或者使用腳本記錄內(nèi)存變化 whiletrue;do date >> mem_monitor.log ps aux | grep java | grep -v grep >> mem_monitor.log sleep 60 done
如果發(fā)現(xiàn)RSS持續(xù)增長(zhǎng),幾個(gè)小時(shí)內(nèi)從2G漲到8G,基本可以確定存在內(nèi)存泄漏。
2.3.3 監(jiān)控頁(yè)面交換(Swap)
Swap是內(nèi)存不足時(shí)的救命稻草,但也是性能殺手。一旦開(kāi)始頻繁swap,系統(tǒng)性能會(huì)急劇下降。
# 查看swap使用情況
free -h | grep Swap
# 使用vmstat監(jiān)控swap活動(dòng)
vmstat 1 10
# 查看哪些進(jìn)程在使用swap
forfilein/proc/*/status;do
awk'/VmSwap|Name/{printf $2 " " $3}END{ print ""}'$file
done| sort -k 2 -n -r | head -10
vmstat關(guān)鍵指標(biāo):
procs -----------memory---------- ---swap-- -----io---- r b swpd free buff cache si so bi bo 2 1 524288 102400 45120 512000 120 250 50 100
si(swap in):每秒從swap讀入內(nèi)存的數(shù)據(jù)量(KB)
so(swap out):每秒從內(nèi)存寫(xiě)入swap的數(shù)據(jù)量(KB)
判斷標(biāo)準(zhǔn):如果si和so的值持續(xù)不為0,說(shuō)明系統(tǒng)在頻繁進(jìn)行頁(yè)面交換,這是嚴(yán)重的性能問(wèn)題信號(hào)。
實(shí)戰(zhàn)案例:某社交平臺(tái)的應(yīng)用服務(wù)器,用戶反饋?lái)?yè)面加載極慢。通過(guò)free命令發(fā)現(xiàn)swap使用了1.5G,vmstat顯示si和so值分別為200和150。進(jìn)一步排查發(fā)現(xiàn)是Java應(yīng)用的堆內(nèi)存配置過(guò)大(-Xmx12G),而服務(wù)器總內(nèi)存只有16G,導(dǎo)致系統(tǒng)內(nèi)存不足。將堆內(nèi)存調(diào)整為8G后,swap使用降為0,頁(yè)面響應(yīng)恢復(fù)正常。
2.4 磁盤(pán)IO性能診斷
2.4.1 查看磁盤(pán)IO整體狀況
磁盤(pán)IO是很多性能問(wèn)題的根源,特別是使用機(jī)械硬盤(pán)的服務(wù)器。
# 查看磁盤(pán)IO統(tǒng)計(jì) iostat -x 1 5 # 查看磁盤(pán)使用情況 df -h # 查看磁盤(pán)分區(qū)信息 lsblk
iostat輸出示例:
Device r/s w/s rkB/s wkB/s await %util sda 45.20 120.50 1024.00 4096.00 25.30 85.60 sdb 2.10 5.30 64.00 128.00 5.20 12.40
關(guān)鍵指標(biāo)解讀:
r/s:每秒讀操作次數(shù)
w/s:每秒寫(xiě)操作次數(shù)
rkB/s:每秒讀取的數(shù)據(jù)量(KB)
wkB/s:每秒寫(xiě)入的數(shù)據(jù)量(KB)
await:平均IO等待時(shí)間(毫秒),這是最關(guān)鍵的指標(biāo)
%util:磁盤(pán)使用率,接近100%說(shuō)明磁盤(pán)已經(jīng)飽和
判斷標(biāo)準(zhǔn):
await < 10ms:性能良好(SSD)
await 10-20ms:可以接受
await > 50ms:存在明顯IO瓶頸
%util > 80%:磁盤(pán)接近飽和
2.4.2 定位高IO進(jìn)程
找到磁盤(pán)IO瓶頸后,需要定位是哪個(gè)進(jìn)程在進(jìn)行大量IO操作。
# 使用pidstat查看進(jìn)程IO情況 pidstat -d 1 5 # 使用iotop實(shí)時(shí)查看進(jìn)程IO(需要安裝) sudo iotop -o # 查看進(jìn)程打開(kāi)的文件 lsof -p
pidstat輸出示例:
1520 UID PID kB_rd/s kB_wr/s Command 1521 0 1234 0.00 8192.00 java 1521 999 5678 2048.00 512.00 mysqld
說(shuō)明:從上面可以看到,PID 1234的java進(jìn)程每秒寫(xiě)入8MB數(shù)據(jù),這可能是日志寫(xiě)入或數(shù)據(jù)持久化操作。
2.4.3 分析IO模式
不同的IO模式對(duì)性能影響差異很大。順序IO性能遠(yuǎn)高于隨機(jī)IO。
# 查看IO調(diào)度器 cat /sys/block/sda/queue/scheduler # 查看磁盤(pán)隊(duì)列深度 cat /sys/block/sda/queue/nr_requests # 使用iostat查看詳細(xì)IO統(tǒng)計(jì) iostat -x -d 1 5
實(shí)戰(zhàn)案例:某內(nèi)容平臺(tái)的靜態(tài)資源服務(wù)器,用戶反饋圖片加載緩慢。通過(guò)iostat發(fā)現(xiàn)sda的await達(dá)到120ms,%util為95%。使用pidstat定位到nginx進(jìn)程IO很高。進(jìn)一步分析發(fā)現(xiàn)是大量小文件的隨機(jī)讀取導(dǎo)致磁盤(pán)IO瓶頸。解決方案是:1)將靜態(tài)資源遷移到SSD;2)啟用nginx的open_file_cache緩存文件句柄;3)使用CDN分流。優(yōu)化后await降到15ms,頁(yè)面加載速度提升5倍。
三、示例代碼和配置
3.1 完整診斷腳本
3.1.1 一鍵性能診斷腳本
這個(gè)腳本可以快速收集系統(tǒng)的CPU、內(nèi)存、磁盤(pán)IO等關(guān)鍵性能指標(biāo)。
#!/bin/bash # 文件名:perf_check.sh # 功能:系統(tǒng)性能快速診斷工具 echo"=========================================" echo"系統(tǒng)性能診斷報(bào)告" echo"時(shí)間:$(date '+%Y-%m-%d %H:%M:%S')" echo"=========================================" echo"" # 1. 系統(tǒng)基本信息 echo"【系統(tǒng)信息】" echo"主機(jī)名:$(hostname)" echo"內(nèi)核版本:$(uname -r)" echo"運(yùn)行時(shí)間:$(uptime | awk -F'up ' '{print $2}' | awk -F',' '{print $1}')" echo"" # 2. CPU信息 echo"【CPU信息】" echo"CPU核心數(shù):$(nproc)" echo"系統(tǒng)負(fù)載:$(uptime | awk -F'load average:' '{print $2}')" echo"" echo"CPU使用率(最近5秒平均):" mpstat 1 5 | tail -1 echo"" # 3. 內(nèi)存信息 echo"【內(nèi)存信息】" free -h echo"" echo"Swap使用情況:" swapon --show echo"" # 4. 磁盤(pán)IO信息 echo"【磁盤(pán)IO信息】" iostat -x 1 3 | grep -E"Device|sd" echo"" # 5. TOP進(jìn)程 echo"【CPU占用TOP5進(jìn)程】" ps aux --sort=-%cpu | head -6 echo"" echo"【內(nèi)存占用TOP5進(jìn)程】" ps aux --sort=-%mem | head -6 echo"" echo"=========================================" echo"診斷完成" echo"========================================="
使用方法:
chmod +x perf_check.sh ./perf_check.sh
3.2 實(shí)際應(yīng)用案例
案例一:電商平臺(tái)高峰期CPU瓶頸
場(chǎng)景描述:某電商平臺(tái)在雙11促銷期間,下午2點(diǎn)開(kāi)始用戶反饋?lái)?yè)面響應(yīng)極慢,訂單提交失敗率激增。監(jiān)控顯示應(yīng)用服務(wù)器響應(yīng)時(shí)間從平時(shí)的200ms飆升到2000ms以上。
診斷過(guò)程:
快速查看系統(tǒng)負(fù)載
uptime # 輸出:load average: 12.5, 10.8, 8.3 # 服務(wù)器是8核CPU,負(fù)載超過(guò)12說(shuō)明有問(wèn)題
查看CPU使用情況
top # 發(fā)現(xiàn)CPU使用率達(dá)到95%,其中us占85%,sy占10%
定位高CPU進(jìn)程
pidstat -u 1 5 # 發(fā)現(xiàn)tomcat進(jìn)程(PID 1234)占用CPU 780%(多線程累加)
分析上下文切換
vmstat 1 5 # cs值達(dá)到85000次/秒,遠(yuǎn)超正常水平
查看線程數(shù)
ps -eLf | grep java | wc -l # 輸出:512個(gè)線程
問(wèn)題根因:應(yīng)用配置的線程池過(guò)大(maxThreads=500),在高并發(fā)下導(dǎo)致大量線程競(jìng)爭(zhēng)CPU,頻繁的上下文切換反而降低了吞吐量。
解決方案:
# 1. 調(diào)整Tomcat配置 vim /opt/tomcat/conf/server.xml # 修改:maxThreads="500" -> maxThreads="200" # 修改:acceptCount="100" -> acceptCount="200" # 2. 重啟應(yīng)用 systemctl restart tomcat # 3. 驗(yàn)證效果 vmstat 1 10 # cs值降到25000次/秒 # CPU使用率降到70%,但響應(yīng)時(shí)間恢復(fù)到300ms
優(yōu)化效果:
上下文切換從85000次/秒降到25000次/秒
CPU使用率從95%降到70%
響應(yīng)時(shí)間從2000ms恢復(fù)到300ms
訂單成功率從60%提升到98%
案例二:社交平臺(tái)內(nèi)存泄漏導(dǎo)致OOM
場(chǎng)景描述:某社交平臺(tái)的API服務(wù)器,每隔2-3天就會(huì)自動(dòng)重啟一次,查看日志發(fā)現(xiàn)是Java進(jìn)程O(píng)OM(Out of Memory)。用戶在高峰期經(jīng)常遇到503錯(cuò)誤。
診斷過(guò)程:
查看內(nèi)存使用情況
free -h # 發(fā)現(xiàn)可用內(nèi)存只有200MB,swap使用了1.8G
監(jiān)控進(jìn)程內(nèi)存變化
# 每小時(shí)記錄一次內(nèi)存使用
whiletrue;do
echo"$(date)-$(ps aux | grep java | grep -v grep | awk '{print $6}')">> mem_track.log
sleep 3600
done
分析內(nèi)存增長(zhǎng)趨勢(shì)
cat mem_track.log # 發(fā)現(xiàn)RSS從啟動(dòng)時(shí)的2G,12小時(shí)后增長(zhǎng)到14G
檢查swap使用
vmstat 1 10 # si和so值持續(xù)不為0,說(shuō)明在頻繁swap
問(wèn)題根因:應(yīng)用存在內(nèi)存泄漏,長(zhǎng)時(shí)間運(yùn)行后內(nèi)存持續(xù)增長(zhǎng),最終觸發(fā)OOM。同時(shí)JVM堆內(nèi)存配置過(guò)大(-Xmx12G),在16G內(nèi)存的服務(wù)器上留給系統(tǒng)的空間太少。
解決方案:
# 1. 調(diào)整JVM參數(shù) vim /opt/app/bin/startup.sh # 修改:-Xmx12G -Xms12G -> -Xmx8G -Xms8G # 添加:-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/ # 2. 禁用swap(臨時(shí)措施) sudo swapoff -a # 3. 重啟應(yīng)用并持續(xù)監(jiān)控 systemctl restart app watch -n 300"free -h && ps aux | grep java"
后續(xù)優(yōu)化:通過(guò)分析heap dump文件,發(fā)現(xiàn)是緩存對(duì)象沒(méi)有正確釋放導(dǎo)致的內(nèi)存泄漏。修復(fù)代碼后,內(nèi)存使用穩(wěn)定在6G左右,不再增長(zhǎng)。
四、最佳實(shí)踐和注意事項(xiàng)
4.1 最佳實(shí)踐
4.1.1 性能優(yōu)化建議
CPU優(yōu)化:
合理配置線程池大小,一般設(shè)置為CPU核心數(shù)的1-2倍
避免在高并發(fā)場(chǎng)景使用synchronized,考慮使用Lock或無(wú)鎖數(shù)據(jù)結(jié)構(gòu)
使用CPU親和性綁定關(guān)鍵進(jìn)程到特定核心
# 將進(jìn)程綁定到CPU 0-3 taskset -cp 0-3
內(nèi)存優(yōu)化:
JVM堆內(nèi)存不要超過(guò)物理內(nèi)存的75%,留足夠空間給操作系統(tǒng)
監(jiān)控內(nèi)存使用趨勢(shì),及時(shí)發(fā)現(xiàn)內(nèi)存泄漏
合理配置swappiness參數(shù)
# 降低swap傾向(推薦值10) echo10 | sudo tee /proc/sys/vm/swappiness # 永久生效 echo"vm.swappiness=10"| sudo tee -a /etc/sysctl.conf sudo sysctl -p
磁盤(pán)IO優(yōu)化:
優(yōu)先使用SSD,性能提升10倍以上
調(diào)整IO調(diào)度器,SSD使用noop或none,HDD使用deadline
# 查看當(dāng)前調(diào)度器 cat /sys/block/sda/queue/scheduler # 修改為deadline echodeadline | sudo tee /sys/block/sda/queue/scheduler
啟用文件系統(tǒng)緩存,減少磁盤(pán)訪問(wèn)
對(duì)于數(shù)據(jù)庫(kù),考慮將數(shù)據(jù)文件和日志文件放在不同磁盤(pán)
4.2 注意事項(xiàng)
4.2.1 診斷工具使用注意事項(xiàng)
采樣頻率不宜過(guò)高:
iostat、vmstat等工具的采樣間隔建議不低于1秒
過(guò)于頻繁的采樣會(huì)增加系統(tǒng)開(kāi)銷,影響診斷結(jié)果的準(zhǔn)確性
生產(chǎn)環(huán)境建議使用1-5秒的采樣間隔
正確理解指標(biāo)含義:
CPU使用率高不一定是問(wèn)題,要結(jié)合業(yè)務(wù)負(fù)載判斷
內(nèi)存used高是正常的,Linux會(huì)充分利用內(nèi)存做緩存
關(guān)注available而不是free
swap使用不為0不一定有問(wèn)題,但si/so持續(xù)不為0就需要關(guān)注
避免過(guò)度優(yōu)化:
不要為了優(yōu)化而優(yōu)化,要有明確的性能目標(biāo)
優(yōu)化前后要有數(shù)據(jù)對(duì)比,證明優(yōu)化有效
有些"優(yōu)化"可能會(huì)降低系統(tǒng)穩(wěn)定性
4.2.2 常見(jiàn)錯(cuò)誤
| 錯(cuò)誤現(xiàn)象 | 原因分析 | 解決方案 |
|---|---|---|
| iostat命令不存在 | sysstat包未安裝 | sudo apt install sysstat 或 yum install sysstat |
| pidstat顯示權(quán)限不足 | 需要root權(quán)限查看其他用戶進(jìn)程 | 使用sudo執(zhí)行命令 |
| top顯示內(nèi)存使用超100% | 包含了共享內(nèi)存的重復(fù)計(jì)算 | 查看RES列而不是VIRT列 |
| vmstat的si/so一直為0 | 采樣間隔過(guò)長(zhǎng)或系統(tǒng)確實(shí)沒(méi)有swap | 減少采樣間隔或檢查swap是否啟用 |
| mpstat顯示CPU使用率之和超100% | 多核CPU的累加值 | 查看單個(gè)CPU的使用率或平均值 |
五、故障排查和監(jiān)控
5.1 快速排查流程
當(dāng)接到性能告警時(shí),按照以下流程快速定位問(wèn)題:
第一步:確認(rèn)問(wèn)題現(xiàn)象
# 查看系統(tǒng)負(fù)載和運(yùn)行時(shí)間 uptime # 快速查看資源使用情況 top
第二步:判斷瓶頸類型
# 如果CPU iowait高(>20%),是IO問(wèn)題 # 如果CPU使用率高(>80%),是CPU問(wèn)題 # 如果有swap活動(dòng),是內(nèi)存問(wèn)題 vmstat 1 5
第三步:定位問(wèn)題進(jìn)程
# CPU問(wèn)題 pidstat -u 1 5 # 內(nèi)存問(wèn)題 pidstat -r 1 5 # IO問(wèn)題 pidstat -d 1 5
第四步:深入分析
CPU問(wèn)題:檢查線程數(shù)、上下文切換、是否有死循環(huán)
內(nèi)存問(wèn)題:檢查是否內(nèi)存泄漏、配置是否合理
IO問(wèn)題:檢查IO模式、磁盤(pán)類型、是否需要優(yōu)化
5.2 性能監(jiān)控指標(biāo)
建議監(jiān)控的關(guān)鍵指標(biāo)及告警閾值:
| 指標(biāo)類別 | 指標(biāo)名稱 | 正常范圍 | 告警閾值 | 說(shuō)明 |
|---|---|---|---|---|
| CPU | 使用率 | 30-70% | >85% | 持續(xù)高于85%需要優(yōu)化 |
| CPU | 負(fù)載 | <核心數(shù) | >核心數(shù)*1.5 | 1分鐘負(fù)載超過(guò)核心數(shù)1.5倍 |
| CPU | 上下文切換 | <20000/s | >50000/s | 過(guò)高說(shuō)明線程競(jìng)爭(zhēng)激烈 |
| 內(nèi)存 | 可用內(nèi)存 | >20% | <10% | available低于總內(nèi)存10% |
| 內(nèi)存 | Swap使用 | 0 | >0且持續(xù)增長(zhǎng) | 任何swap活動(dòng)都需要關(guān)注 |
| 磁盤(pán) | IO等待 | <10ms | >50ms | 超過(guò)50ms說(shuō)明IO瓶頸 |
| 磁盤(pán) | 使用率 | <80% | >90% | 磁盤(pán)空間不足 |
| 磁盤(pán) | %util | <60% | >85% | 磁盤(pán)接近飽和 |
六、總結(jié)
6.1 技術(shù)要點(diǎn)回顧
系統(tǒng)化診斷方法:從整體到局部,先看top/uptime了解全局,再用mpstat/pidstat定位具體問(wèn)題,最后深入分析
CPU診斷核心:關(guān)注使用率、負(fù)載、iowait、上下文切換四個(gè)維度,不要只看使用率
內(nèi)存診斷核心:重點(diǎn)看available而不是free,監(jiān)控swap活動(dòng),及時(shí)發(fā)現(xiàn)內(nèi)存泄漏
磁盤(pán)IO診斷核心:await和%util是關(guān)鍵指標(biāo),區(qū)分順序IO和隨機(jī)IO,SSD和HDD的優(yōu)化策略不同
6.2 進(jìn)階學(xué)習(xí)方向
深入學(xué)習(xí)性能分析工具
學(xué)習(xí)perf、strace、ltrace等高級(jí)工具
掌握火焰圖(Flame Graph)的使用
了解eBPF技術(shù)在性能分析中的應(yīng)用
應(yīng)用層性能優(yōu)化
Java應(yīng)用的JVM調(diào)優(yōu)
數(shù)據(jù)庫(kù)查詢優(yōu)化和索引設(shè)計(jì)
緩存策略和CDN使用
系統(tǒng)架構(gòu)優(yōu)化
負(fù)載均衡和水平擴(kuò)展
微服務(wù)架構(gòu)下的性能優(yōu)化
容器化環(huán)境的性能監(jiān)控
6.3 參考資料
Linux Performance- Brendan Gregg的性能分析資源
sysstat官方文檔- iostat、mpstat等工具的詳細(xì)說(shuō)明
Linux內(nèi)核文檔- /proc文件系統(tǒng)和性能相關(guān)接口
性能之巔- 系統(tǒng)性能優(yōu)化經(jīng)典書(shū)籍
附錄
A. 命令速查表
# CPU相關(guān) top # 實(shí)時(shí)查看進(jìn)程資源占用 uptime # 查看系統(tǒng)負(fù)載 mpstat -P ALL 1 5 # 查看每個(gè)CPU核心使用率 pidstat -u 1 5 # 查看進(jìn)程CPU使用情況 vmstat 1 5 # 查看系統(tǒng)整體性能和上下文切換 # 內(nèi)存相關(guān) free -h # 查看內(nèi)存使用情況 vmstat 1 5 # 查看內(nèi)存和swap活動(dòng) pidstat -r 1 5 # 查看進(jìn)程內(nèi)存使用 ps aux --sort=-%mem | head # 按內(nèi)存排序查看進(jìn)程 # 磁盤(pán)IO相關(guān) iostat -x 1 5 # 查看磁盤(pán)IO統(tǒng)計(jì) pidstat -d 1 5 # 查看進(jìn)程IO情況 df -h # 查看磁盤(pán)空間使用 lsblk # 查看磁盤(pán)分區(qū)信息 # 綜合診斷 dmesg | tail # 查看內(nèi)核日志 lsof -p# 查看進(jìn)程打開(kāi)的文件 strace -p # 跟蹤進(jìn)程系統(tǒng)調(diào)用
B. 性能基線參考值
8核16G內(nèi)存服務(wù)器(Web應(yīng)用):
CPU使用率:40-60%
系統(tǒng)負(fù)載:4-6
可用內(nèi)存:4-6G
磁盤(pán)IO await:<20ms(SSD)
上下文切換:10000-20000/s
16核32G內(nèi)存服務(wù)器(數(shù)據(jù)庫(kù)):
CPU使用率:50-70%
系統(tǒng)負(fù)載:8-12
可用內(nèi)存:8-12G
磁盤(pán)IO await:<10ms(SSD)
上下文切換:15000-30000/s
C. 術(shù)語(yǔ)表
| 術(shù)語(yǔ) | 英文 | 解釋 |
|---|---|---|
| 負(fù)載 | Load Average | 系統(tǒng)在一段時(shí)間內(nèi)的平均活躍進(jìn)程數(shù) |
| 上下文切換 | Context Switch | CPU從一個(gè)進(jìn)程切換到另一個(gè)進(jìn)程 |
| 缺頁(yè)錯(cuò)誤 | Page Fault | 訪問(wèn)的內(nèi)存頁(yè)不在物理內(nèi)存中 |
| IO等待 | IO Wait | CPU等待IO操作完成的時(shí)間 |
| 吞吐量 | Throughput | 單位時(shí)間內(nèi)處理的請(qǐng)求數(shù)或數(shù)據(jù)量 |
| 延遲 | Latency | 從請(qǐng)求發(fā)出到收到響應(yīng)的時(shí)間 |
| IOPS | IO Operations Per Second | 每秒IO操作次數(shù) |
| RSS | Resident Set Size | 進(jìn)程實(shí)際占用的物理內(nèi)存 |
| VSZ | Virtual Size | 進(jìn)程申請(qǐng)的虛擬內(nèi)存大小 |
-
cpu
+關(guān)注
關(guān)注
68文章
11274瀏覽量
224902 -
Linux
+關(guān)注
關(guān)注
88文章
11754瀏覽量
218994 -
內(nèi)存
+關(guān)注
關(guān)注
9文章
3208瀏覽量
76346
原文標(biāo)題:Linux系統(tǒng)性能瓶頸定位:CPU、內(nèi)存、磁盤(pán)IO全面診斷
文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
Linux系統(tǒng)性能指南
Linux系統(tǒng)的性能優(yōu)化策略
Linux和Android系統(tǒng)故障和優(yōu)化性能的方法和流程探討
鏡像對(duì)系統(tǒng)性能的影響有哪些?
如何提高FPGA的系統(tǒng)性能
一文帶你詳解芯片--SL8541e-系統(tǒng)性能優(yōu)化
使用Arm Streamline分析樹(shù)莓派的性能
優(yōu)化BIOS設(shè)置提高系統(tǒng)性能
Linux系統(tǒng)性能調(diào)優(yōu)方案
Linux系統(tǒng)性能優(yōu)化技巧
Linux系統(tǒng)性能調(diào)試工具—strace
Linux系統(tǒng)性能優(yōu)化與調(diào)試的思路?
碳化硅SiC MOSFET并聯(lián)的技術(shù)瓶頸與系統(tǒng)性克服策略
深度解讀Linux系統(tǒng)性能瓶頸定位策略
評(píng)論