性能優(yōu)化
性能指標(biāo)
高并發(fā)和響應(yīng)快對應(yīng)著性能優(yōu)化的兩個核心指標(biāo):吞吐和延時
- 應(yīng)用負載角度:直接影響了產(chǎn)品終端的用戶體驗
- 系統(tǒng)資源角度:資源使用率、飽和度等
性能問題的本質(zhì)就是系統(tǒng)資源已經(jīng)到達瓶頸,但請求的處理還不夠快,無法支撐更多的請求。性能分析實際上就是找出應(yīng)用或系統(tǒng)的瓶頸,設(shè)法去避免或緩解它們。
- 選擇指標(biāo)評估應(yīng)用程序和系統(tǒng)性能
- 為應(yīng)用程序和系統(tǒng)設(shè)置性能目標(biāo)
- 進行性能基準(zhǔn)測試
- 性能分析定位瓶頸
- 性能監(jiān)控和告警
對于不同的性能問題要選取不同的性能分析工具。下面是常用的Linux Performance Tools以及對應(yīng)分析的性能問題類型。
到底應(yīng)該怎么理解”平均負載”
平均負載 :單位時間內(nèi),系統(tǒng)處于可運行狀態(tài)和不可中斷狀態(tài)的平均進程數(shù),也就是平均活躍進程數(shù)。它和我們傳統(tǒng)意義上理解的CPU使用率并沒有直接關(guān)系。
其中不可中斷進程是正處于內(nèi)核態(tài)關(guān)鍵流程中的進程(如常見的等待設(shè)備的I/O響應(yīng))。不可中斷狀態(tài)實際上是系統(tǒng)對進程和硬件設(shè)備的一種保護機制。
平均負載多少時合理
實際生產(chǎn)環(huán)境中將系統(tǒng)的平均負載監(jiān)控起來,根據(jù)歷史數(shù)據(jù)判斷負載的變化趨勢。當(dāng)負載存在明顯升高趨勢時,及時進行分析和調(diào)查。當(dāng)然也可以當(dāng)設(shè)置閾值(如當(dāng)平均負載高于CPU數(shù)量的70%時)
現(xiàn)實工作中我們會經(jīng)?;煜骄撦d和CPU使用率的概念,其實兩者并不完全對等:
- CPU 密集型進程,大量 CPU 使用會導(dǎo)致平均負載升高,此時兩者一致
- I/O 密集型進程,等待 I/O 也會導(dǎo)致平均負載升高,此時 CPU 使用率并不一定高
- 大量等待 CPU 的進程調(diào)度會導(dǎo)致平均負載升高,此時 CPU 使用率也會比較高
平均負載高時可能是 CPU 密集型進程導(dǎo)致,也可能是 I/O 繁忙導(dǎo)致。具體分析時可以結(jié)合 mpstat/pidstat 工具輔助分析負載來源。
CPU
CPU上下文切換(上)
CPU 上下文切換,就是把前一個任務(wù)的 CPU 上下文(CPU 寄存器和 PC)保存起來,然后加載新任務(wù)的上下文到這些寄存器和程序計數(shù)器,最后再跳轉(zhuǎn)到程序計數(shù)器所指的位置,運行新任務(wù)。其中,保存下來的上下文會存儲在系統(tǒng)內(nèi)核中,待任務(wù)重新調(diào)度執(zhí)行時再加載,保證原來的任務(wù)狀態(tài)不受影響。
按照任務(wù)類型,CPU 上下文切換分為:
- 進程上下文切換
- 線程上下文切換
- 中斷上下文切換
進程上下文切換
Linux 進程按照等級權(quán)限將進程的運行空間分為內(nèi)核空間和用戶空間。從用戶態(tài)向內(nèi)核態(tài)轉(zhuǎn)變時需要通過系統(tǒng)調(diào)用來完成。
一次系統(tǒng)調(diào)用過程其實進行了兩次 CPU 上下文切換:
- CPU 寄存器中用戶態(tài)的指令位置先保存起來,CPU 寄存器更新為內(nèi)核態(tài)指令的位置,跳轉(zhuǎn)到內(nèi)核態(tài)運行內(nèi)核任務(wù);
- 系統(tǒng)調(diào)用結(jié)束后,CPU 寄存器恢復(fù)原來保存的用戶態(tài)數(shù)據(jù),再切換到用戶空間繼續(xù)運行。
系統(tǒng)調(diào)用過程中并不會涉及虛擬內(nèi)存等進程用戶態(tài)資源,也不會切換進程。和傳統(tǒng)意義上的進程上下文切換不同。因此系統(tǒng)調(diào)用通常稱為特權(quán)模式切換。
進程是由內(nèi)核管理和調(diào)度的,進程上下文切換只能發(fā)生在內(nèi)核態(tài)。因此相比系統(tǒng)調(diào)用來說,在保存當(dāng)前進程的內(nèi)核狀態(tài)和CPU寄存器之前,需要先把該進程的虛擬內(nèi)存,棧保存下來。再加載新進程的內(nèi)核態(tài)后,還要刷新進程的虛擬內(nèi)存和用戶棧。
進程只有在調(diào)度到CPU上運行時才需要切換上下文,有以下幾種場景:CPU時間片輪流分配,系統(tǒng)資源不足導(dǎo)致進程掛起,進程通過sleep函數(shù)主動掛起,高優(yōu)先級進程搶占時間片,硬件中斷時CPU上的進程被掛起轉(zhuǎn)而執(zhí)行內(nèi)核中的中斷服務(wù)。
線程上下文切換
線程上下文切換分為兩種:
- 前后線程同屬于一個進程,切換時虛擬內(nèi)存資源不變,只需要切換線程的私有數(shù)據(jù),寄存器等;
- 前后線程屬于不同進程,與進程上下文切換相同。
同進程的線程切換消耗資源較少,這也是多線程的優(yōu)勢。
中斷上下文切換
中斷上下文切換并不涉及到進程的用戶態(tài),因此中斷上下文只包括內(nèi)核態(tài)中斷服務(wù)程序執(zhí)行所必須的狀態(tài)(CPU寄存器,內(nèi)核堆棧,硬件中斷參數(shù)等)。
中斷處理優(yōu)先級比進程高,所以中斷上下文切換和進程上下文切換不會同時發(fā)生
CPU上下文切換(下)
通過 vmstat 可以查看系統(tǒng)總體的上下文切換情況
vmstat 5 #每隔5s輸出一組數(shù)據(jù)
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 103388 145412 511056 0 0 18 60 1 1 2 1 96 0 0
0 0 0 103388 145412 511076 0 0 0 2 450 1176 1 1 99 0 0
0 0 0 103388 145412 511076 0 0 0 8 429 1135 1 1 98 0 0
0 0 0 103388 145412 511076 0 0 0 0 431 1132 1 1 98 0 0
0 0 0 103388 145412 511076 0 0 0 10 467 1195 1 1 98 0 0
1 0 0 103388 145412 511076 0 0 0 2 426 1139 1 0 99 0 0
4 0 0 95184 145412 511108 0 0 0 74 500 1228 4 1 94 0 0
0 0 0 103512 145416 511076 0 0 0 455 723 1573 12 3 83 2 0
- cs (context switch) 每秒上下文切換次數(shù)
- in (interrupt) 每秒中斷次數(shù)
- r (runnning or runnable)就緒隊列的長度,正在運行和等待CPU的進程數(shù)
- b (Blocked) 處于不可中斷睡眠狀態(tài)的進程數(shù)
要查看每個進程的詳細情況,需要使用pidstat來查看每個進程上下文切換情況
pidstat -w 5
14時51分16秒 UID PID cswch/s nvcswch/s Command
14時51分21秒 0 1 0.80 0.00 systemd
14時51分21秒 0 6 1.40 0.00 ksoftirqd/0
14時51分21秒 0 9 32.67 0.00 rcu_sched
14時51分21秒 0 11 0.40 0.00 watchdog/0
14時51分21秒 0 32 0.20 0.00 khugepaged
14時51分21秒 0 271 0.20 0.00 jbd2/vda1-8
14時51分21秒 0 1332 0.20 0.00 argusagent
14時51分21秒 0 5265 10.02 0.00 AliSecGuard
14時51分21秒 0 7439 7.82 0.00 kworker/0:2
14時51分21秒 0 7906 0.20 0.00 pidstat
14時51分21秒 0 8346 0.20 0.00 sshd
14時51分21秒 0 20654 9.82 0.00 AliYunDun
14時51分21秒 0 25766 0.20 0.00 kworker/u2:1
14時51分21秒 0 28603 1.00 0.00 python3
- cswch 每秒自愿上下文切換次數(shù)(進程無法獲取所需資源導(dǎo)致的上下文切換)
- nvcswch 每秒非自愿上下文切換次數(shù)(時間片輪流等系統(tǒng)強制調(diào)度)
vmstat 1 1 #新終端觀察上下文切換情況
此時發(fā)現(xiàn)cs數(shù)據(jù)明顯升高,同時觀察其他指標(biāo):
r列:遠超系統(tǒng)CPU個數(shù),說明存在大量CPU競爭
us和sy列:sy列占比80%,說明CPU主要被內(nèi)核占用
in列:中斷次數(shù)明顯上升,說明中斷處理也是潛在問題
說明運行/等待CPU的進程過多,導(dǎo)致大量的上下文切換,上下文切換導(dǎo)致系統(tǒng)的CPU占用率高
pidstat -w -u 1 #查看到底哪個進程導(dǎo)致的問題
從結(jié)果中看出是 sysbench 導(dǎo)致 CPU 使用率過高,但是 pidstat 輸出的上下文次數(shù)加起來也并不多。分析 sysbench 模擬的是線程的切換,因此需要在 pidstat 后加 -t 參數(shù)查看線程指標(biāo)。
另外對于中斷次數(shù)過多,我們可以通過 /proc/interrupts 文件讀取
watch -d cat /proc/interrupts
發(fā)現(xiàn)次數(shù)變化速度最快的是重調(diào)度中斷(RES),該中斷用來喚醒空閑狀態(tài)的CPU來調(diào)度新的任務(wù)運行。分析還是因為過多任務(wù)的調(diào)度問題,和上下文切換分析一致。
某個應(yīng)用的CPU使用率達到100%,怎么辦?
Linux作為多任務(wù)操作系統(tǒng),將CPU時間劃分為很短的時間片,通過調(diào)度器輪流分配給各個任務(wù)使用。為了維護CPU時間,Linux通過事先定義的節(jié)拍率,觸發(fā)時間中斷,并使用全局變了jiffies記錄開機以來的節(jié)拍數(shù)。時間中斷發(fā)生一次該值+1.
CPU使用率,除了空閑時間以外的其他時間占總CPU時間的百分比。可以通過/proc/stat中的數(shù)據(jù)來計算出CPU使用率。因為/proc/stat時開機以來的節(jié)拍數(shù)累加值,計算出來的是開機以來的平均CPU使用率,一般意義不大??梢蚤g隔取一段時間的兩次值作差來計算該段時間內(nèi)的平均CPU使用率。性能分析工具給出的都是間隔一段時間的平均CPU使用率,要注意間隔時間的設(shè)置。
CPU使用率可以通過top 或 ps來查看。分析進程的CPU問題可以通過perf,它以性能事件采樣為基礎(chǔ),不僅可以分析系統(tǒng)的各種事件和內(nèi)核性能,還可以用來分析指定應(yīng)用程序的性能問題。
perf top / perf record / perf report (-g 開啟調(diào)用關(guān)系的采樣)
sudo docker run --name nginx -p 10000:80 -itd feisky/nginx
sudo docker run --name phpfpm -itd --network container:nginx feisky/php-fpm
ab -c 10 -n 100 http://XXX.XXX.XXX.XXX:10000/ #測試Nginx服務(wù)性能
發(fā)現(xiàn)此時每秒可承受請求給長少,此時將測試的請求數(shù)從100增加到10000。在另外一個終端運行top查看每個CPU的使用率。發(fā)現(xiàn)系統(tǒng)中幾個php-fpm進程導(dǎo)致CPU使用率驟升。
接著用perf來分析具體是php-fpm中哪個函數(shù)導(dǎo)致該問題。
perf top -g -p XXXX #對某一個php-fpm進程進行分析
發(fā)現(xiàn)其中 sqrt 和 add_function 占用 CPU 過多, 此時查看源碼找到原來是sqrt中在發(fā)布前沒有刪除測試代碼段,存在一個百萬次的循環(huán)導(dǎo)致。將該無用代碼刪除后發(fā)現(xiàn)nginx負載能力明顯提升
系統(tǒng)的CPU使用率很高,為什么找不到高CPU的應(yīng)用?
sudo docker run --name nginx -p 10000:80 -itd feisky/nginx:sp
sudo docker run --name phpfpm -itd --network container:nginx feisky/php-fpm:sp
ab -c 100 -n 1000 http://XXX.XXX.XXX.XXX:10000/ #并發(fā)100個請求測試
實驗結(jié)果中每秒請求數(shù)依舊不高,我們將并發(fā)請求數(shù)降為5后,nginx負載能力依舊很低。
此時用top和pidstat發(fā)現(xiàn)系統(tǒng)CPU使用率過高,但是并沒有發(fā)現(xiàn)CPU使用率高的進程。
出現(xiàn)這種情況一般時我們分析時遺漏的什么信息,重新運行top命令并觀察一會。發(fā)現(xiàn)就緒隊列中處于Running狀態(tài)的進行過多,超過了我們的并發(fā)請求次數(shù)5. 再仔細查看進程運行數(shù)據(jù),發(fā)現(xiàn)nginx和php-fpm都處于sleep狀態(tài),真正處于運行的卻是幾個stress進程。
下一步就利用pidstat分析這幾個stress進程,發(fā)現(xiàn)沒有任何輸出。用ps aux交叉驗證發(fā)現(xiàn)依舊不存在該進程。說明不是工具的問題。再top查看發(fā)現(xiàn)stress進程的進程號變化了,此時有可能時以下兩種原因?qū)е拢?/p>
- 進程不停的崩潰重啟(如段錯誤/配置錯誤等),此時進程退出后可能又被監(jiān)控系統(tǒng)重啟;
- 短時進程導(dǎo)致,即其他應(yīng)用內(nèi)部通過 exec 調(diào)用的外面命令,這些命令一般只運行很短時間就結(jié)束,很難用top這種間隔較長的工具來發(fā)現(xiàn)
可以通過pstree來查找 stress 的父進程,找出調(diào)用關(guān)系。
pstree | grep stress
發(fā)現(xiàn)是php-fpm調(diào)用的該子進程,此時去查看源碼可以看出每個請求都會調(diào)用一個stress命令來模擬I/O壓力。之前top顯示的結(jié)果是CPU使用率升高,是否真的是由該stress命令導(dǎo)致的,還需要繼續(xù)分析。代碼中給每個請求加了verbose=1的參數(shù)后可以查看stress命令的輸出,在中斷測試該命令結(jié)果顯示stress命令運行時存在因權(quán)限問題導(dǎo)致的文件創(chuàng)建失敗的bug。
此時依舊只是猜測,下一步繼續(xù)通過perf工具來分析。性能報告顯示確實時stress占用了大量的CPU,通過修復(fù)權(quán)限問題來優(yōu)化解決即可。
系統(tǒng)中出現(xiàn)大量不可中斷進程和僵尸進程怎么辦?
進程狀態(tài)
R Running/Runnable,表示進程在CPU的就緒隊列中,正在運行或者等待運行;
D Disk Sleep,不可中斷狀態(tài)睡眠,一般表示進程正在跟硬件交互,并且交互過程中不允許被其他進程中斷;
Z Zombie,僵尸進程,表示進程實際上已經(jīng)結(jié)束,但是父進程還沒有回收它的資源;
S Interruptible Sleep,可中斷睡眠狀態(tài),表示進程因為等待某個事件而被系統(tǒng)掛起,當(dāng)?shù)却录l(fā)生則會被喚醒并進入R狀態(tài);
I Idle,空閑狀態(tài),用在不可中斷睡眠的內(nèi)核線程上。該狀態(tài)不會導(dǎo)致平均負載升高;
T Stop/Traced,表示進程處于暫?;蚋櫊顟B(tài)(SIGSTOP/SIGCONT, GDB調(diào)試);
X Dead,進程已經(jīng)消亡,不會在top/ps中看到。
對于不可中斷狀態(tài),一般都是在很短時間內(nèi)結(jié)束,可忽略。但是如果系統(tǒng)或硬件發(fā)生故障,進程可能會保持不可中斷狀態(tài)很久,甚至系統(tǒng)中出現(xiàn)大量不可中斷狀態(tài),此時需注意是否出現(xiàn)了I/O性能問題。
僵尸進程一般多進程應(yīng)用容易遇到,父進程來不及處理子進程狀態(tài)時子進程就提前退出,此時子進程就變成了僵尸進程。大量的僵尸進程會用盡PID進程號,導(dǎo)致新進程無法建立。
磁盤O_DIRECT問題
sudo docker run --privileged --name=app -itd feisky/app:iowait
ps aux | grep '/app'
可以看到此時有多個app進程運行,狀態(tài)分別時Ss+和D+。其中后面s表示進程是一個會話的領(lǐng)導(dǎo)進程,+號表示前臺進程組。
其中進程組表示一組相互關(guān)聯(lián)的進程,子進程是父進程所在組的組員。會話指共享同一個控制終端的一個或多個進程組。
用top查看系統(tǒng)資源發(fā)現(xiàn):1)平均負載在逐漸增加,且1分鐘內(nèi)平均負載達到了CPU個數(shù),說明系統(tǒng)可能已經(jīng)有了性能瓶頸;2)僵尸進程比較多且在不停增加;3)us和sys CPU使用率都不高,iowait卻比較高;4)每個進程CPU使用率也不高,但有兩個進程處于D狀態(tài),可能在等待IO。
分析目前數(shù)據(jù)可知:iowait過高導(dǎo)致系統(tǒng)平均負載升高,僵尸進程不斷增長說明有程序沒能正確清理子進程資源。
用dstat來分析,因為它可以同時查看CPU和I/O兩種資源的使用情況,便于對比分析。
dstat 1 10 #間隔1秒輸出10組數(shù)據(jù)
可以看到當(dāng)wai(iowait)升高時磁盤請求read都會很大,說明iowait的升高和磁盤的讀請求有關(guān)。接下來分析到底時哪個進程在讀磁盤。
之前 Top 查看的處于 D 狀態(tài)的進程號,用 pidstat -d -p XXX 展示進程的 I/O 統(tǒng)計數(shù)據(jù)。發(fā)現(xiàn)處于 D 狀態(tài)的進程都沒有任何讀寫操作。在用 pidstat -d 查看所有進程的 I/O統(tǒng)計數(shù)據(jù),看到 app 進程在進行磁盤讀操作,每秒讀取 32MB 的數(shù)據(jù)。進程訪問磁盤必須使用系統(tǒng)調(diào)用處于內(nèi)核態(tài),接下來重點就是找到app進程的系統(tǒng)調(diào)用。
sudo strace -p XXX #對app進程調(diào)用進行跟蹤
報錯沒有權(quán)限,因為已經(jīng)時 root 權(quán)限了。所以遇到這種情況,首先要檢查進程狀態(tài)是否正常。ps 命令查找該進程已經(jīng)處于Z狀態(tài),即僵尸進程。
這種情況下top pidstat之類的工具無法給出更多的信息,此時像第5篇一樣,用 perf record -d
和 perf report
進行分析,查看app進程調(diào)用棧。
看到 app 確實在通過系統(tǒng)調(diào)用 sys_read()
讀取數(shù)據(jù),并且從 new_sync_read
和 blkdev_direct_IO
看出進程時進行直接讀操作,請求直接從磁盤讀,沒有通過緩存導(dǎo)致iowait升高。
通過層層分析后,root cause 是 app 內(nèi)部進行了磁盤的直接I/O。然后定位到具體代碼位置進行優(yōu)化即可。
僵尸進程
上述優(yōu)化后 iowait 顯著下降,但是僵尸進程數(shù)量仍舊在增加。首先要定位僵尸進程的父進程,通過pstree -aps XXX,打印出該僵尸進程的調(diào)用樹,發(fā)現(xiàn)父進程就是app進程。
查看app代碼,看看子進程結(jié)束的處理是否正確(是否調(diào)用wait()/waitpid(),有沒有注冊SIGCHILD信號的處理函數(shù)等)。
碰到iowait升高時,先用dstat pidstat等工具確認是否存在磁盤I/O問題,再找是哪些進程導(dǎo)致I/O,不能用strace直接分析進程調(diào)用時可以通過perf工具分析。
對于僵尸問題,用pstree找到父進程,然后看源碼檢查子進程結(jié)束的處理邏輯即可。
CPU性能指標(biāo)
- CPU使用率
- 用戶CPU使用率, 包括用戶態(tài)(user)和低優(yōu)先級用戶態(tài)(nice). 該指標(biāo)過高說明應(yīng)用程序比較繁忙.
- 系統(tǒng)CPU使用率, CPU在內(nèi)核態(tài)運行的時間百分比(不含中斷). 該指標(biāo)高說明內(nèi)核比較繁忙.
- 等待I/O的CPU使用率, iowait, 該指標(biāo)高說明系統(tǒng)與硬件設(shè)備I/O交互時間比較長.
- 軟/硬中斷CPU使用率, 該指標(biāo)高說明系統(tǒng)中發(fā)生大量中斷.
- steal CPU / guest CPU, 表示虛擬機占用的CPU百分比.
- 平均負載
- 理想情況下平均負載等于邏輯CPU個數(shù),表示每個CPU都被充分利用. 若大于則說明系統(tǒng)負載較重.
- 進程上下文切換
- 包括無法獲取資源的自愿切換和系統(tǒng)強制調(diào)度時的非自愿切換. 上下文切換本身是保證Linux正常運行的一項核心功能. 過多的切換則會將原本運行進程的CPU時間消耗在寄存器,內(nèi)核占及虛擬內(nèi)存等數(shù)據(jù)保存和恢復(fù)上
- CPU緩存命中率
- CPU緩存的復(fù)用情況,命中率越高性能越好. 其中L1/L2常用在單核,L3則用在多核中
性能工具
- 平均負載案例
- 先用uptime查看系統(tǒng)平均負載
- 判斷負載在升高后再用mpstat和pidstat分別查看每個CPU和每個進程CPU使用情況.找出導(dǎo)致平均負載較高的進程.
- 上下文切換案例
- 先用vmstat查看系統(tǒng)上下文切換和中斷次數(shù)
- 再用pidstat觀察進程的自愿和非自愿上下文切換情況
- 最后通過pidstat觀察線程的上下文切換情況
- 進程CPU使用率高案例
- 先用top查看系統(tǒng)和進程的CPU使用情況,定位到進程
- 再用perf top觀察進程調(diào)用鏈,定位到具體函數(shù)
- 系統(tǒng)CPU使用率高案例
- 先用top查看系統(tǒng)和進程的CPU使用情況,top/pidstat都無法找到CPU使用率高的進程
- 重新審視top輸出
- 從CPU使用率不高,但是處于Running狀態(tài)的進程入手
- perf record/report發(fā)現(xiàn)短時進程導(dǎo)致 (execsnoop工具)
- 不可中斷和僵尸進程案例
- 先用top觀察iowait升高,發(fā)現(xiàn)大量不可中斷和僵尸進程
- strace無法跟蹤進程系統(tǒng)調(diào)用
- perf分析調(diào)用鏈發(fā)現(xiàn)根源來自磁盤直接I/O
- 軟中斷案例
- top觀察系統(tǒng)軟中斷CPU使用率高
- 查看/proc/softirqs找到變化速率較快的幾種軟中斷
- sar命令發(fā)現(xiàn)是網(wǎng)絡(luò)小包問題
- tcpdump找出網(wǎng)絡(luò)幀的類型和來源,確定SYN FLOOD攻擊導(dǎo)致
根據(jù)不同的性能指標(biāo)來找合適的工具:
先運行幾個支持指標(biāo)較多的工具,如 top/vmstat/pidstat,根據(jù)它們的輸出可以得出是哪種類型的性能問題。定位到進程后再用 strace/perf 分析調(diào)用情況進一步分析。如果是軟中斷導(dǎo)致用 /proc/softirqs
CPU優(yōu)化
- 應(yīng)用程序優(yōu)化
- 編譯器優(yōu)化:編譯階段開啟優(yōu)化選項,如gcc -O2
- 算法優(yōu)化
- 異步處理:避免程序因為等待某個資源而一直阻塞,提升程序的并發(fā)處理能力。(將輪詢替換為事件通知)
- 多線程代替多進程:減少上下文切換成本
- 善用緩存:加快程序處理速度
- 系統(tǒng)優(yōu)化
- CPU綁定:將進程綁定要1個/多個CPU上,提高CPU緩存命中率,減少CPU調(diào)度帶來的上下文切換
- CPU獨占:CPU親和性機制來分配進程
- 優(yōu)先級調(diào)整:使用nice適當(dāng)降低非核心應(yīng)用的優(yōu)先級
- 為進程設(shè)置資源顯示: cgroups設(shè)置使用上限,防止由某個應(yīng)用自身問題耗盡系統(tǒng)資源
- NUMA優(yōu)化: CPU盡可能訪問本地內(nèi)存
- 中斷負載均衡: irpbalance,將中斷處理過程自動負載均衡到各個CPU上
- TPS、QPS、系統(tǒng)吞吐量的區(qū)別和理解
-
QPS(TPS)
-
并發(fā)數(shù)
-
響應(yīng)時間
-
QPS(TPS)=并發(fā)數(shù)/平均相應(yīng)時間
-
用戶請求服務(wù)器
-
服務(wù)器內(nèi)部處理
-
服務(wù)器返回給客戶
QPS 類似 TPS,但是對于一個頁面的訪問形成一個 TPS,但是一次頁面請求可能包含多次對服務(wù)器的請求,可能計入多次 QPS
-
QPS(Queries Per Second)每秒查詢率,一臺服務(wù)器每秒能夠響應(yīng)的查詢次數(shù).
-
TPS(Transactions Per Second)每秒事務(wù)數(shù),軟件測試的結(jié)果.
-
- 系統(tǒng)吞吐量,包括幾個重要參數(shù):
-
Linux
+關(guān)注
關(guān)注
87文章
11352瀏覽量
210528 -
性能
+關(guān)注
關(guān)注
0文章
271瀏覽量
19047 -
i/o
+關(guān)注
關(guān)注
0文章
33瀏覽量
4619
發(fā)布評論請先 登錄
相關(guān)推薦
HBase性能優(yōu)化方法總結(jié)
Linux系統(tǒng)的性能優(yōu)化策略
如何對嵌入式linux系統(tǒng)快速啟動進行優(yōu)化
基于Linux的Socket網(wǎng)絡(luò)編程的性能優(yōu)化
![基于<b class='flag-5'>Linux</b>的Socket網(wǎng)絡(luò)編程的<b class='flag-5'>性能</b><b class='flag-5'>優(yōu)化</b>](https://file1.elecfans.com//web2/M00/A5/54/wKgZomUMN-yAaps9AAEmhQn-iPM109.jpg)
Linux CPU的性能應(yīng)該如何優(yōu)化
Linux的基礎(chǔ)學(xué)習(xí)筆記資料總結(jié)
Linux下Apache性能分析總結(jié)
![<b class='flag-5'>Linux</b>下Apache<b class='flag-5'>性能</b>分析<b class='flag-5'>總結(jié)</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
Linux 性能優(yōu)化總結(jié)!2
![<b class='flag-5'>Linux</b> <b class='flag-5'>性能</b><b class='flag-5'>優(yōu)化</b><b class='flag-5'>總結(jié)</b>!2](https://file1.elecfans.com/web2/M00/82/B5/wKgaomRd5ymAKifXAALkqOiNRw8784.jpg)
Linux內(nèi)核slab性能優(yōu)化的核心思想
![<b class='flag-5'>Linux</b>內(nèi)核slab<b class='flag-5'>性能</b><b class='flag-5'>優(yōu)化</b>的核心思想](https://file1.elecfans.com/web2/M00/AF/B9/wKgZomVRm7CAZLMyAAIDou_e_HI165.jpg)
評論