chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

深度解讀Linux系統(tǒng)性能瓶頸定位策略

馬哥Linux運維 ? 來源:馬哥Linux運維 ? 2026-01-26 17:42 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

一、概述

1.1 背景介紹

在實際生產(chǎn)環(huán)境中,系統(tǒng)性能問題往往來得突然又難以定位。某天下午,你可能會接到告警:電商平臺響應(yīng)時間從平時的200ms突然飆升到2秒,用戶投訴激增,運營團(tuán)隊焦急萬分。這時候,如何快速準(zhǔn)確地找到性能瓶頸,就成了運維工程師的核心能力。

性能問題的表現(xiàn)形式多種多樣:應(yīng)用響應(yīng)緩慢、頁面加載卡頓、API接口超時、數(shù)據(jù)庫查詢變慢等等。但歸根結(jié)底,這些問題通常源于三大系統(tǒng)資源的瓶頸:CPU、內(nèi)存、磁盤IO

很多時候,我們?nèi)菀紫萑?頭痛醫(yī)頭、腳痛醫(yī)腳"的誤區(qū)。看到CPU使用率高就加CPU,看到內(nèi)存不足就加內(nèi)存,結(jié)果錢花了不少,問題依然存在。實際上,性能優(yōu)化需要系統(tǒng)化的診斷方法,要理解各個資源之間的關(guān)聯(lián)關(guān)系。比如,磁盤IO慢可能導(dǎo)致進(jìn)程等待,進(jìn)而引發(fā)CPU的iowait升高;內(nèi)存不足會觸發(fā)頻繁的頁面交換,同樣會拖累磁盤IO性能。

本文將介紹一套完整的性能診斷方法論,從整體到局部,從現(xiàn)象到本質(zhì),幫助你快速定位系統(tǒng)瓶頸。這套方法基于Linux系統(tǒng)自帶的工具,無需額外安裝復(fù)雜的監(jiān)控系統(tǒng),就能在生產(chǎn)環(huán)境中快速排查問題。

1.2 技術(shù)特點

系統(tǒng)化診斷流程:采用"自頂向下"的分析思路,先看整體資源使用情況,再深入到具體進(jìn)程和線程。避免盲目優(yōu)化,確保每一步都有數(shù)據(jù)支撐。通過建立性能基線,對比歷史數(shù)據(jù),能夠快速識別異常波動。

多維度性能指標(biāo):不僅僅關(guān)注CPU使用率、內(nèi)存占用這些表面指標(biāo),更要深入分析上下文切換、緩存命中率、IO等待時間等深層指標(biāo)。這些指標(biāo)往往能揭示性能問題的真正原因。比如,CPU使用率只有50%,但上下文切換頻率極高,說明存在嚴(yán)重的線程競爭問題。

工具鏈完整實用:Linux系統(tǒng)內(nèi)置了一整套性能分析工具(top、vmstat、iostat、mpstat、pidstat等),這些工具經(jīng)過多年驗證,穩(wěn)定可靠。掌握這些工具的使用方法,就能應(yīng)對90%以上的性能問題。更重要的是,這些工具開銷很小,可以在生產(chǎn)環(huán)境中放心使用。

1.3 適用場景

場景一:Web應(yīng)用服務(wù)器性能優(yōu)化典型表現(xiàn)是高并發(fā)時響應(yīng)時間顯著增加。比如電商平臺在促銷活動期間,用戶訪問量激增,服務(wù)器CPU使用率飆升到90%以上,大量請求超時。通過診斷發(fā)現(xiàn),問題可能出在應(yīng)用線程池配置不合理,導(dǎo)致頻繁的上下文切換;也可能是某個接口存在性能問題,占用了大量CPU資源。診斷重點包括:CPU各核心的使用分布、進(jìn)程和線程的CPU占用、系統(tǒng)調(diào)用開銷、上下文切換頻率等。優(yōu)化方向可能是調(diào)整線程池大小、優(yōu)化代碼邏輯、增加緩存、或者進(jìn)行水平擴(kuò)展。

場景二:數(shù)據(jù)庫服務(wù)器瓶頸定位數(shù)據(jù)庫是很多系統(tǒng)的核心,一旦出現(xiàn)性能問題,影響面會非常大。常見表現(xiàn)是查詢變慢、事務(wù)堆積、連接數(shù)打滿。通過診斷可能發(fā)現(xiàn):磁盤IO性能不足,大量慢查詢導(dǎo)致磁盤讀寫壓力大;內(nèi)存配置不當(dāng),緩沖池太小導(dǎo)致緩存命中率低;或者是CPU瓶頸,復(fù)雜查詢消耗大量計算資源。診斷重點包括:磁盤IO的吞吐量和延遲、內(nèi)存緩沖池的使用情況、慢查詢?nèi)罩痉治?、鎖等待情況等。優(yōu)化方向可能是添加索引、優(yōu)化查詢語句、調(diào)整數(shù)據(jù)庫配置參數(shù)、升級硬件(特別是使用SSD替換機(jī)械硬盤)。

場景三:批處理任務(wù)性能分析很多企業(yè)都有定時運行的批處理任務(wù),比如數(shù)據(jù)同步、報表生成、日志分析等。這類任務(wù)的特點是運行時間長、資源占用集中。如果任務(wù)執(zhí)行時間從原來的1小時增加到4小時,就需要分析是哪個環(huán)節(jié)出了問題。可能是CPU密集型任務(wù)(如數(shù)據(jù)計算、加密解密),也可能是IO密集型任務(wù)(如大文件讀寫、數(shù)據(jù)庫批量插入)。診斷重點包括:任務(wù)的資源使用特征、是否存在資源競爭、磁盤IO模式(順序讀寫還是隨機(jī)讀寫)等。優(yōu)化方向可能是并行處理、調(diào)整IO調(diào)度策略、使用更快的存儲設(shè)備、或者優(yōu)化算法減少計算量。

1.4 環(huán)境要求

組件 版本要求 說明
操作系統(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)限才能查看完整信息
硬件配置 無特殊要求 本文方法適用于任何規(guī)模的Linux系統(tǒng)

二、詳細(xì)步驟

2.1 準(zhǔn)備工作

2.1.1 系統(tǒng)檢查

在開始性能診斷之前,需要先了解系統(tǒng)的基本配置信息,建立一個清晰的認(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

# 查看磁盤信息
df -h
lsblk

說明:這些命令幫助我們了解硬件配置的基本情況。比如,一個8核16G內(nèi)存的服務(wù)器和一個2核4G的服務(wù)器,性能診斷的關(guān)注點會有很大不同。CPU核心數(shù)決定了系統(tǒng)的并行處理能力,內(nèi)存大小影響緩存策略,磁盤類型(SSD還是HDD)直接關(guān)系到IO性能。

2.1.2 安裝依賴工具

大部分Linux發(fā)行版默認(rèn)已經(jīng)安裝了基礎(chǔ)的性能工具,但sysstat包可能需要手動安裝。

# Ubuntu/Debian系統(tǒng)
sudo apt update
sudo apt install -y sysstat

# CentOS/RHEL系統(tǒng)
sudo yum install -y sysstat

# 驗證安裝
iostat -V
mpstat -V
pidstat -V

工具說明

top/htop:實時查看進(jìn)程資源占用,系統(tǒng)自帶

vmstat:虛擬內(nèi)存統(tǒng)計,查看系統(tǒng)整體性能

iostat:磁盤IO性能分析,來自sysstat包

mpstat:多處理器統(tǒng)計,分析每個CPU核心的使用情況

pidstat:進(jìn)程級性能統(tǒng)計,精確定位問題進(jìn)程

這些工具的共同特點是:輕量級、開銷小、輸出直觀。在生產(chǎn)環(huán)境中使用不會對系統(tǒng)造成明顯影響。

2.2 CPU性能診斷

2.2.1 快速查看CPU整體狀況

當(dāng)接到性能告警時,第一步是快速了解CPU的整體使用情況。

# 使用top查看實時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ù)載,三個數(shù)字分別代表1分鐘、5分鐘、15分鐘的平均值。一般來說,負(fù)載值不應(yīng)超過CPU核心數(shù)。如果是8核CPU,負(fù)載長期超過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時間,這個值高說明磁盤IO可能是瓶頸

實戰(zhàn)經(jīng)驗:如果看到iowait超過20%,基本可以判斷是磁盤IO問題,而不是CPU計算能力不足。這時候繼續(xù)優(yōu)化CPU是沒用的,應(yīng)該轉(zhuǎn)向磁盤IO診斷。

2.2.2 查看每個CPU核心的使用情況

現(xiàn)代服務(wù)器都是多核CPU,有時候會出現(xiàn)負(fù)載不均衡的情況,某些核心跑滿了,其他核心卻很空閑。

# 查看每個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

分析要點:上面的例子中,CPU 0的使用率達(dá)到89%,而CPU 3只有18%,說明負(fù)載分布不均。這可能是因為:

應(yīng)用程序是單線程的,無法利用多核

進(jìn)程CPU親和性設(shè)置不當(dāng),綁定到了特定核心

某個進(jìn)程占用了大量CPU資源

2.2.3 定位高CPU占用的進(jìn)程

找到了CPU使用率高,下一步就是定位具體是哪個進(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

說明:從上面可以看到,PID為1234的java進(jìn)程占用了95%的CPU,這就是需要重點關(guān)注的對象。

2.2.4 分析上下文切換

CPU使用率不高,但系統(tǒng)響應(yīng)慢?可能是上下文切換過于頻繁。

# 使用vmstat查看上下文切換
vmstat 1 5

# 查看每個進(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ù)。正常情況下幾千到一萬次,如果超過5萬次就需要關(guān)注

in(interrupts):每秒中斷次數(shù)

實戰(zhàn)案例:某電商平臺在促銷期間,應(yīng)用響應(yīng)變慢,CPU使用率只有60%。通過vmstat發(fā)現(xiàn)cs值達(dá)到8萬次/秒,遠(yuǎn)超正常水平。進(jìn)一步排查發(fā)現(xiàn)是應(yīng)用線程池配置過大(500個線程),導(dǎo)致大量線程競爭CPU,頻繁切換。將線程池調(diào)整為100后,上下文切換降到2萬次/秒,響應(yīng)時間恢復(fù)正常。

2.3 內(nèi)存性能診斷

2.3.1 查看內(nèi)存使用概況

內(nèi)存問題往往比CPU問題更隱蔽,但影響更嚴(yán)重。一旦內(nèi)存不足觸發(fā)swap,系統(tǒng)性能會斷崖式下降。

# 查看內(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ū)使用量,如果這個值不為0,說明內(nèi)存已經(jīng)不夠用了

重要提示:很多人看到used很高就以為內(nèi)存不足,其實不然。Linux會盡可能利用空閑內(nèi)存做緩存,這是正常的。真正需要關(guān)注的是available這一列,只要這個值足夠大,系統(tǒng)就不會有內(nèi)存壓力。

2.3.2 識別內(nèi)存泄漏

內(nèi)存泄漏是Web應(yīng)用常見的問題,表現(xiàn)為內(nèi)存使用持續(xù)增長,最終導(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)程申請的總內(nèi)存

RSS:實際物理內(nèi)存占用,這是真正消耗的內(nèi)存

%MEM:內(nèi)存占用百分比

minflt/s:每秒次缺頁錯誤(minor page fault),從緩存中加載頁面

majflt/s:每秒主缺頁錯誤(major page fault),需要從磁盤加載,這個值高說明內(nèi)存不足

診斷內(nèi)存泄漏的方法

# 持續(xù)監(jiān)控某個進(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ù)增長,幾個小時內(nèi)從2G漲到8G,基本可以確定存在內(nèi)存泄漏。

2.3.3 監(jiān)控頁面交換(Swap)

Swap是內(nèi)存不足時的救命稻草,但也是性能殺手。一旦開始頻繁swap,系統(tǒng)性能會急劇下降。

# 查看swap使用情況
free -h | grep Swap

# 使用vmstat監(jiān)控swap活動
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)存寫入swap的數(shù)據(jù)量(KB)

判斷標(biāo)準(zhǔn):如果si和so的值持續(xù)不為0,說明系統(tǒng)在頻繁進(jìn)行頁面交換,這是嚴(yán)重的性能問題信號。

實戰(zhàn)案例:某社交平臺的應(yīng)用服務(wù)器,用戶反饋頁面加載極慢。通過free命令發(fā)現(xiàn)swap使用了1.5G,vmstat顯示si和so值分別為200和150。進(jìn)一步排查發(fā)現(xiàn)是Java應(yīng)用的堆內(nèi)存配置過大(-Xmx12G),而服務(wù)器總內(nèi)存只有16G,導(dǎo)致系統(tǒng)內(nèi)存不足。將堆內(nèi)存調(diào)整為8G后,swap使用降為0,頁面響應(yīng)恢復(fù)正常。

2.4 磁盤IO性能診斷

2.4.1 查看磁盤IO整體狀況

磁盤IO是很多性能問題的根源,特別是使用機(jī)械硬盤的服務(wù)器。

# 查看磁盤IO統(tǒng)計
iostat -x 1 5

# 查看磁盤使用情況
df -h

# 查看磁盤分區(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:每秒寫操作次數(shù)

rkB/s:每秒讀取的數(shù)據(jù)量(KB)

wkB/s:每秒寫入的數(shù)據(jù)量(KB)

await:平均IO等待時間(毫秒),這是最關(guān)鍵的指標(biāo)

%util:磁盤使用率,接近100%說明磁盤已經(jīng)飽和

判斷標(biāo)準(zhǔn)

await < 10ms:性能良好(SSD)

await 10-20ms:可以接受

await > 50ms:存在明顯IO瓶頸

%util > 80%:磁盤接近飽和

2.4.2 定位高IO進(jìn)程

找到磁盤IO瓶頸后,需要定位是哪個進(jìn)程在進(jìn)行大量IO操作。

# 使用pidstat查看進(jìn)程IO情況
pidstat -d 1 5

# 使用iotop實時查看進(jìn)程IO(需要安裝)
sudo iotop -o

# 查看進(jìn)程打開的文件
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

說明:從上面可以看到,PID 1234的java進(jìn)程每秒寫入8MB數(shù)據(jù),這可能是日志寫入或數(shù)據(jù)持久化操作。

2.4.3 分析IO模式

不同的IO模式對性能影響差異很大。順序IO性能遠(yuǎn)高于隨機(jī)IO。

# 查看IO調(diào)度器
cat /sys/block/sda/queue/scheduler

# 查看磁盤隊列深度
cat /sys/block/sda/queue/nr_requests

# 使用iostat查看詳細(xì)IO統(tǒng)計
iostat -x -d 1 5

實戰(zhàn)案例:某內(nèi)容平臺的靜態(tài)資源服務(wù)器,用戶反饋圖片加載緩慢。通過iostat發(fā)現(xiàn)sda的await達(dá)到120ms,%util為95%。使用pidstat定位到nginx進(jìn)程IO很高。進(jìn)一步分析發(fā)現(xiàn)是大量小文件的隨機(jī)讀取導(dǎo)致磁盤IO瓶頸。解決方案是:1)將靜態(tài)資源遷移到SSD;2)啟用nginx的open_file_cache緩存文件句柄;3)使用CDN分流。優(yōu)化后await降到15ms,頁面加載速度提升5倍。

三、示例代碼和配置

3.1 完整診斷腳本

3.1.1 一鍵性能診斷腳本

這個腳本可以快速收集系統(tǒng)的CPU、內(nèi)存、磁盤IO等關(guān)鍵性能指標(biāo)。

#!/bin/bash
# 文件名:perf_check.sh
# 功能:系統(tǒng)性能快速診斷工具

echo"========================================="
echo"系統(tǒng)性能診斷報告"
echo"時間:$(date '+%Y-%m-%d %H:%M:%S')"
echo"========================================="
echo""

# 1. 系統(tǒng)基本信息
echo"【系統(tǒng)信息】"
echo"主機(jī)名:$(hostname)"
echo"內(nèi)核版本:$(uname -r)"
echo"運行時間:$(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. 磁盤IO信息
echo"【磁盤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 實際應(yīng)用案例

案例一:電商平臺高峰期CPU瓶頸

場景描述:某電商平臺在雙11促銷期間,下午2點開始用戶反饋頁面響應(yīng)極慢,訂單提交失敗率激增。監(jiān)控顯示應(yīng)用服務(wù)器響應(yīng)時間從平時的200ms飆升到2000ms以上。

診斷過程

快速查看系統(tǒng)負(fù)載

uptime
# 輸出:load average: 12.5, 10.8, 8.3
# 服務(wù)器是8核CPU,負(fù)載超過12說明有問題

查看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個線程

問題根因:應(yīng)用配置的線程池過大(maxThreads=500),在高并發(fā)下導(dǎo)致大量線程競爭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. 驗證效果
vmstat 1 10
# cs值降到25000次/秒
# CPU使用率降到70%,但響應(yīng)時間恢復(fù)到300ms

優(yōu)化效果

上下文切換從85000次/秒降到25000次/秒

CPU使用率從95%降到70%

響應(yīng)時間從2000ms恢復(fù)到300ms

訂單成功率從60%提升到98%

案例二:社交平臺內(nèi)存泄漏導(dǎo)致OOM

場景描述:某社交平臺的API服務(wù)器,每隔2-3天就會自動重啟一次,查看日志發(fā)現(xiàn)是Java進(jìn)程OOM(Out of Memory)。用戶在高峰期經(jīng)常遇到503錯誤。

診斷過程

查看內(nèi)存使用情況

free -h
# 發(fā)現(xiàn)可用內(nèi)存只有200MB,swap使用了1.8G

監(jiān)控進(jìn)程內(nèi)存變化

# 每小時記錄一次內(nèi)存使用
whiletrue;do
 echo"$(date)-$(ps aux | grep java | grep -v grep | awk '{print $6}')">> mem_track.log
  sleep 3600
done

分析內(nèi)存增長趨勢

cat mem_track.log
# 發(fā)現(xiàn)RSS從啟動時的2G,12小時后增長到14G

檢查swap使用

vmstat 1 10
# si和so值持續(xù)不為0,說明在頻繁swap

問題根因:應(yīng)用存在內(nèi)存泄漏,長時間運行后內(nèi)存持續(xù)增長,最終觸發(fā)OOM。同時JVM堆內(nèi)存配置過大(-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(臨時措施)
sudo swapoff -a

# 3. 重啟應(yīng)用并持續(xù)監(jiān)控
systemctl restart app
watch -n 300"free -h && ps aux | grep java"

后續(xù)優(yōu)化:通過分析heap dump文件,發(fā)現(xiàn)是緩存對象沒有正確釋放導(dǎo)致的內(nèi)存泄漏。修復(fù)代碼后,內(nèi)存使用穩(wěn)定在6G左右,不再增長。

四、最佳實踐和注意事項

4.1 最佳實踐

4.1.1 性能優(yōu)化建議

CPU優(yōu)化

合理配置線程池大小,一般設(shè)置為CPU核心數(shù)的1-2倍

避免在高并發(fā)場景使用synchronized,考慮使用Lock或無鎖數(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)存不要超過物理內(nèi)存的75%,留足夠空間給操作系統(tǒng)

監(jiān)控內(nèi)存使用趨勢,及時發(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

磁盤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)緩存,減少磁盤訪問

對于數(shù)據(jù)庫,考慮將數(shù)據(jù)文件和日志文件放在不同磁盤

4.2 注意事項

4.2.1 診斷工具使用注意事項

采樣頻率不宜過高

iostat、vmstat等工具的采樣間隔建議不低于1秒

過于頻繁的采樣會增加系統(tǒng)開銷,影響診斷結(jié)果的準(zhǔn)確性

生產(chǎn)環(huán)境建議使用1-5秒的采樣間隔

正確理解指標(biāo)含義

CPU使用率高不一定是問題,要結(jié)合業(yè)務(wù)負(fù)載判斷

內(nèi)存used高是正常的,Linux會充分利用內(nèi)存做緩存

關(guān)注available而不是free

swap使用不為0不一定有問題,但si/so持續(xù)不為0就需要關(guān)注

避免過度優(yōu)化

不要為了優(yōu)化而優(yōu)化,要有明確的性能目標(biāo)

優(yōu)化前后要有數(shù)據(jù)對比,證明優(yōu)化有效

有些"優(yōu)化"可能會降低系統(tǒng)穩(wěn)定性

4.2.2 常見錯誤

錯誤現(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ù)計算 查看RES列而不是VIRT列
vmstat的si/so一直為0 采樣間隔過長或系統(tǒng)確實沒有swap 減少采樣間隔或檢查swap是否啟用
mpstat顯示CPU使用率之和超100% 多核CPU的累加值 查看單個CPU的使用率或平均值

五、故障排查和監(jiān)控

5.1 快速排查流程

當(dāng)接到性能告警時,按照以下流程快速定位問題:

第一步:確認(rèn)問題現(xiàn)象

# 查看系統(tǒng)負(fù)載和運行時間
uptime

# 快速查看資源使用情況
top

第二步:判斷瓶頸類型

# 如果CPU iowait高(>20%),是IO問題
# 如果CPU使用率高(>80%),是CPU問題
# 如果有swap活動,是內(nèi)存問題
vmstat 1 5

第三步:定位問題進(jìn)程

# CPU問題
pidstat -u 1 5

# 內(nèi)存問題
pidstat -r 1 5

# IO問題
pidstat -d 1 5

第四步:深入分析

CPU問題:檢查線程數(shù)、上下文切換、是否有死循環(huán)

內(nèi)存問題:檢查是否內(nèi)存泄漏、配置是否合理

IO問題:檢查IO模式、磁盤類型、是否需要優(yōu)化

5.2 性能監(jiān)控指標(biāo)

建議監(jiān)控的關(guān)鍵指標(biāo)及告警閾值:

指標(biāo)類別 指標(biāo)名稱 正常范圍 告警閾值 說明
CPU 使用率 30-70% >85% 持續(xù)高于85%需要優(yōu)化
CPU 負(fù)載 <核心數(shù) >核心數(shù)*1.5 1分鐘負(fù)載超過核心數(shù)1.5倍
CPU 上下文切換 <20000/s >50000/s 過高說明線程競爭激烈
內(nèi)存 可用內(nèi)存 >20% <10% available低于總內(nèi)存10%
內(nèi)存 Swap使用 0 >0且持續(xù)增長 任何swap活動都需要關(guān)注
磁盤 IO等待 <10ms >50ms 超過50ms說明IO瓶頸
磁盤 使用率 <80% >90% 磁盤空間不足
磁盤 %util <60% >85% 磁盤接近飽和

六、總結(jié)

6.1 技術(shù)要點回顧

系統(tǒng)化診斷方法:從整體到局部,先看top/uptime了解全局,再用mpstat/pidstat定位具體問題,最后深入分析

CPU診斷核心:關(guān)注使用率、負(fù)載、iowait、上下文切換四個維度,不要只看使用率

內(nèi)存診斷核心:重點看available而不是free,監(jiān)控swap活動,及時發(fā)現(xiàn)內(nèi)存泄漏

磁盤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等高級工具

掌握火焰圖(Flame Graph)的使用

了解eBPF技術(shù)在性能分析中的應(yīng)用

應(yīng)用層性能優(yōu)化

Java應(yīng)用的JVM調(diào)優(yōu)

數(shù)據(jù)庫查詢優(yōu)化和索引設(shè)計

緩存策略和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ì)說明

Linux內(nèi)核文檔- /proc文件系統(tǒng)和性能相關(guān)接口

性能之巔- 系統(tǒng)性能優(yōu)化經(jīng)典書籍

附錄

A. 命令速查表

# CPU相關(guān)
top             # 實時查看進(jìn)程資源占用
uptime           # 查看系統(tǒng)負(fù)載
mpstat -P ALL 1 5     # 查看每個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活動
pidstat -r 1 5       # 查看進(jìn)程內(nèi)存使用
ps aux --sort=-%mem | head # 按內(nèi)存排序查看進(jìn)程

# 磁盤IO相關(guān)
iostat -x 1 5       # 查看磁盤IO統(tǒng)計
pidstat -d 1 5       # 查看進(jìn)程IO情況
df -h           # 查看磁盤空間使用
lsblk           # 查看磁盤分區(qū)信息

# 綜合診斷
dmesg | tail        # 查看內(nèi)核日志
lsof -p        # 查看進(jìn)程打開的文件
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

磁盤IO await:<20ms(SSD)

上下文切換:10000-20000/s

16核32G內(nèi)存服務(wù)器(數(shù)據(jù)庫)

CPU使用率:50-70%

系統(tǒng)負(fù)載:8-12

可用內(nèi)存:8-12G

磁盤IO await:<10ms(SSD)

上下文切換:15000-30000/s

C. 術(shù)語表

術(shù)語 英文 解釋
負(fù)載 Load Average 系統(tǒng)在一段時間內(nèi)的平均活躍進(jìn)程數(shù)
上下文切換 Context Switch CPU從一個進(jìn)程切換到另一個進(jìn)程
缺頁錯誤 Page Fault 訪問的內(nèi)存頁不在物理內(nèi)存中
IO等待 IO Wait CPU等待IO操作完成的時間
吞吐量 Throughput 單位時間內(nèi)處理的請求數(shù)或數(shù)據(jù)量
延遲 Latency 從請求發(fā)出到收到響應(yīng)的時間
IOPS IO Operations Per Second 每秒IO操作次數(shù)
RSS Resident Set Size 進(jìn)程實際占用的物理內(nèi)存
VSZ Virtual Size 進(jìn)程申請的虛擬內(nèi)存大小

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    11330

    瀏覽量

    225904
  • Linux
    +關(guān)注

    關(guān)注

    88

    文章

    11817

    瀏覽量

    219555
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    9

    文章

    3234

    瀏覽量

    76518

原文標(biāo)題:Linux系統(tǒng)性能瓶頸定位:CPU、內(nèi)存、磁盤IO全面診斷

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    Linux系統(tǒng)性能指南

    Linux服務(wù)器運行了很多應(yīng)用,在高負(fù)載下,服務(wù)器可能會出現(xiàn)性能瓶頸,例如CPU利用率過高、內(nèi)存不足、磁盤I/O瓶頸等,從而導(dǎo)致系統(tǒng)卡頓,服
    的頭像 發(fā)表于 06-23 14:12 ?1924次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>系統(tǒng)性能</b>指南

    Linux系統(tǒng)性能優(yōu)化策略

    近年來,世界上許多大軟件公司紛紛推出各種Linux服務(wù)器系統(tǒng)Linux下的應(yīng)用軟件。目前,Linux 已可以與各種傳統(tǒng)的商業(yè)操作系統(tǒng)分庭抗
    發(fā)表于 07-16 06:23

    Linux和Android系統(tǒng)故障和優(yōu)化性能的方法和流程探討

    作為一名Linux 或 Android 平臺的系統(tǒng)工程師,在開發(fā)系統(tǒng)新功能外,主要工作就是優(yōu)化系統(tǒng)性能,使系統(tǒng)上以最優(yōu)的狀態(tài)運行,但是由于硬
    發(fā)表于 07-22 06:48

    鏡像對系統(tǒng)性能的影響有哪些?

    鏡像抑制基礎(chǔ)知識可減少AD9361和AD9371中正交不平衡的技術(shù)鏡像的來源、含義及對系統(tǒng)性能的影響
    發(fā)表于 03-29 07:59

    如何提高FPGA的系統(tǒng)性能

    本文基于Viitex-5 LX110驗證平臺的設(shè)計,探索了高性能FPGA硬件系統(tǒng)設(shè)計的一般性方法及流程,以提高FPGA的系統(tǒng)性能。
    發(fā)表于 04-26 06:43

    一文帶你詳解芯片--SL8541e-系統(tǒng)性能優(yōu)化

    背景 伙伴反饋,設(shè)備操作卡頓,OH基礎(chǔ)系統(tǒng)版本應(yīng)用操作慢,應(yīng)用人機(jī)交互體驗差。本文為你總結(jié)芯片解決方案–SL8541e-系統(tǒng)性能優(yōu)化。主要內(nèi)容包括: *1. 確定優(yōu)化思路 幀率優(yōu)化 應(yīng)用啟動優(yōu)化
    發(fā)表于 08-22 09:12

    使用Arm Streamline分析樹莓派的性能

    在本指南中,我們將探索Linux應(yīng)用和系統(tǒng)性能分析,并學(xué)習(xí)如何找到一個系統(tǒng)正在花費時間的地方。說明應(yīng)用程序和發(fā)現(xiàn)性能瓶頸有助于集中軟件優(yōu)化努
    發(fā)表于 08-29 06:30

    優(yōu)化BIOS設(shè)置提高系統(tǒng)性能

    BIOS設(shè)置對系統(tǒng)性能的影響非常大,優(yōu)化的BIOS設(shè)置,可大大提高PC整體性能,不恰當(dāng)?shù)脑O(shè)置會導(dǎo)致系統(tǒng)性能下降,運行不穩(wěn)定,甚至出現(xiàn)死機(jī)等現(xiàn)象。下面就BIOS中影響系統(tǒng)性能
    發(fā)表于 10-10 14:27 ?43次下載

    關(guān)于系統(tǒng)性能的實際測試介紹

    系統(tǒng)性能實際測試
    的頭像 發(fā)表于 08-21 01:29 ?3234次閱讀

    深度解讀 30KPA64A 單向 TVS:64V 擊穿機(jī)制與高效防護(hù)策略

    深度解讀 30KPA64A 單向 TVS:64V 擊穿機(jī)制與高效防護(hù)策略
    的頭像 發(fā)表于 02-24 13:52 ?864次閱讀
    <b class='flag-5'>深度</b><b class='flag-5'>解讀</b> 30KPA64A 單向 TVS:64V 擊穿機(jī)制與高效防護(hù)<b class='flag-5'>策略</b>

    Linux系統(tǒng)性能調(diào)優(yōu)方案

    關(guān)鍵要點預(yù)覽:本文將深入解析Linux系統(tǒng)性能瓶頸的根本原因,提供可直接落地的調(diào)優(yōu)方案,讓你的系統(tǒng)性能提升30-50%!
    的頭像 發(fā)表于 08-06 17:49 ?1078次閱讀

    Linux系統(tǒng)性能優(yōu)化技巧

    經(jīng)過10年一線運維經(jīng)驗,我發(fā)現(xiàn)大多數(shù)工程師只掌握了Linux優(yōu)化的冰山一角。今天分享的這些秘技,能讓你的系統(tǒng)性能提升200%以上!
    的頭像 發(fā)表于 08-27 14:34 ?1151次閱讀

    Linux系統(tǒng)性能調(diào)試工具—strace

    今天給大家分享一個linux內(nèi)核自帶的調(diào)試工具,該工具可用于查看和定位系統(tǒng)問題,進(jìn)程運行過程探索,進(jìn)行進(jìn)程監(jiān)控,對每個系統(tǒng)調(diào)用都可以監(jiān)測,有助于我們優(yōu)化
    的頭像 發(fā)表于 01-30 17:03 ?2026次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>系統(tǒng)性能</b>調(diào)試工具—strace

    Linux系統(tǒng)性能優(yōu)化與調(diào)試的思路?

    在開發(fā)過程中,對系統(tǒng)性能的要求越來越高,在求職的過程中很多崗位不單單是要求驅(qū)動開發(fā)或者系統(tǒng)開發(fā),會解決系統(tǒng)性能瓶頸問題,往往是加分項,有些公司特別是大廠都會把
    的頭像 發(fā)表于 01-30 16:58 ?733次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>系統(tǒng)性能</b>優(yōu)化與調(diào)試的思路?

    碳化硅SiC MOSFET并聯(lián)的技術(shù)瓶頸系統(tǒng)性克服策略

    碳化硅SiC MOSFET并聯(lián)的技術(shù)瓶頸系統(tǒng)性克服策略:基于基本半導(dǎo)體產(chǎn)品力的深度解析 傾佳電子(Changer Tech)是一家專注于功率半導(dǎo)體和新能源汽車連接器的分銷商。主要服務(wù)
    的頭像 發(fā)表于 11-17 13:35 ?1596次閱讀
    碳化硅SiC MOSFET并聯(lián)的技術(shù)<b class='flag-5'>瓶頸</b>與<b class='flag-5'>系統(tǒng)性</b>克服<b class='flag-5'>策略</b>