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

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

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

Linux 性能優(yōu)化總結(jié)!3

jf_78858299 ? 來源:Linux技術(shù)迷 ? 作者:Linux技術(shù)迷 ? 2023-05-12 15:17 ? 次閱讀

如何迅速分析內(nèi)存的性能瓶頸

通常先運行幾個覆蓋面比較大的性能工具,如 free,top,vmstat,pidstat 等

  • 先用 free 和 top 查看系統(tǒng)整體內(nèi)存使用情況
  • 再用 vmstat 和 pidstat,查看一段時間的趨勢,從而判斷內(nèi)存問題的類型
  • 最后進行詳細分析,比如內(nèi)存分配分析,緩存/緩沖區(qū)分析,具體進程的內(nèi)存使用分析等

常見的優(yōu)化思路:

  • 最好禁止 Swap,若必須開啟則盡量降低 swappiness 的值
  • 減少內(nèi)存的動態(tài)分配,如可以用內(nèi)存池,HugePage 等
  • 盡量使用緩存和緩沖區(qū)來訪問數(shù)據(jù)。如用堆棧明確聲明內(nèi)存空間來存儲需要緩存的數(shù)據(jù),或者用 Redis 外部緩存組件來優(yōu)化數(shù)據(jù)的訪問
  • cgroups 等方式來限制進程的內(nèi)存使用情況,確保系統(tǒng)內(nèi)存不被異常進程耗盡
  • /proc/pid/oom_adj 調(diào)整核心應(yīng)用的 oom_score,保證即使內(nèi)存緊張核心應(yīng)用也不會被OOM殺死

vmstat 使用詳解

vmstat 命令是最常見的 Linux/Unix 監(jiān)控工具,可以展現(xiàn)給定時間間隔的服務(wù)器的狀態(tài)值,包括服務(wù)器的 CPU 使用率,內(nèi)存使用,虛擬內(nèi)存交換情況,IO讀寫情況??梢钥吹秸麄€機器的 CPU,內(nèi)存,IO 的使用情況,而不是單單看到各個進程的 CPU 使用率和內(nèi)存使用率(使用場景不一樣)。

vmstat 2procs -----------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 1379064 282244 11537528    0    0     3   104    0    0  3  0 97  0  0 0  0      0 1372716 282244 11537544    0    0     0    24 4893 8947  1  0 98  0  0 0  0      0 1373404 282248 11537544    0    0     0    96 5105 9278  2  0 98  0  0 0  0      0 1374168 282248 11537556    0    0     0     0 5001 9208  1  0 99  0  0 0  0      0 1376948 282248 11537564    0    0     0    80 5176 9388  2  0 98  0  0 0  0      0 1379356 282256 11537580    0    0     0   202 5474 9519  2  0 98  0  0 1  0      0 1368376 282256 11543696    0    0     0     0 5894 8940 12  0 88  0  0 1  0      0 1371936 282256 11539240    0    0     0 10554 6176 9481 14  1 85  1  0 1  0      0 1366184 282260 11542292    0    0     0  7456 6102 9983  7  1 91  0  0 1  0      0 1353040 282260 11556176    0    0     0 16924 7233 9578 18  1 80  1  0 0  0      0 1359432 282260 11549124    0    0     0 12576 5495 9271  7  0 92  1  0 0  0      0 1361744 282264 11549132    0    0     0    58 8606 15079  4  2 95  0  0 1  0      0 1367120 282264 11549140    0    0     0     2 5716 9205  8  0 92  0  0 0  0      0 1346580 282264 11562644    0    0     0    70 6416 9944 12  0 88  0  0 0  0      0 1359164 282264 11550108    0    0     0  2922 4941 8969  3  0 97  0  0 1  0      0 1353992 282264 11557044    0    0     0     0 6023 8917 15  0 84  0  0
# 結(jié)果說明- r 表示運行隊列(就是說多少個進程真的分配到CPU),我測試的服務(wù)器目前CPU比較空閑,沒什么程序在跑,當(dāng)這個值超過了CPU數(shù)目,就會出現(xiàn)CPU瓶頸了。這個也和top的負載有關(guān)系,一般負載超過了3就比較高,超過了5就高,超過了10就不正常了,服務(wù)器的狀態(tài)很危險。top的負載類似每秒的運行隊列。如果運行隊列過大,表示你的CPU很繁忙,一般會造成CPU使用率很高。
- b 表示阻塞的進程,這個不多說,進程阻塞,大家懂的。
- swpd 虛擬內(nèi)存已使用的大小,如果大于0,表示你的機器物理內(nèi)存不足了,如果不是程序內(nèi)存泄露的原因,那么你該升級內(nèi)存了或者把耗內(nèi)存的任務(wù)遷移到其他機器。
- free 空閑的物理內(nèi)存的大小,我的機器內(nèi)存總共8G,剩余3415M。
- buff Linux/Unix系統(tǒng)是用來存儲,目錄里面有什么內(nèi)容,權(quán)限等的緩存,我本機大概占用300多M
- cache cache直接用來記憶我們打開的文件,給文件做緩沖,我本機大概占用300多M(這里是Linux/Unix的聰明之處,把空閑的物理內(nèi)存的一部分拿來做文件和目錄的緩存,是為了提高 程序執(zhí)行的性能,當(dāng)程序使用內(nèi)存時,buffer/cached會很快地被使用。)
- si 每秒從磁盤讀入虛擬內(nèi)存的大小,如果這個值大于0,表示物理內(nèi)存不夠用或者內(nèi)存泄露了,要查找耗內(nèi)存進程解決掉。我的機器內(nèi)存充裕,一切正常。
- so 每秒虛擬內(nèi)存寫入磁盤的大小,如果這個值大于0,同上。
- bi 塊設(shè)備每秒接收的塊數(shù)量,這里的塊設(shè)備是指系統(tǒng)上所有的磁盤和其他塊設(shè)備,默認(rèn)塊大小是1024byte,我本機上沒什么IO操作,所以一直是0,但是我曾在處理拷貝大量數(shù)據(jù)(2-3T)的機器上看過可以達到140000/s,磁盤寫入速度差不多140M每秒
- bo 塊設(shè)備每秒發(fā)送的塊數(shù)量,例如我們讀取文件,bo就要大于0。bi和bo一般都要接近0,不然就是IO過于頻繁,需要調(diào)整。
- in 每秒CPU的中斷次數(shù),包括時間中斷
- cs 每秒上下文切換次數(shù),例如我們調(diào)用系統(tǒng)函數(shù),就要進行上下文切換,線程的切換,也要進程上下文切換,這個值要越小越好,太大了,要考慮調(diào)低線程或者進程的數(shù)目,例如在apache和nginx這種web服務(wù)器中,我們一般做性能測試時會進行幾千并發(fā)甚至幾萬并發(fā)的測試,選擇web服務(wù)器的進程可以由進程或者線程的峰值一直下調(diào),壓測,直到cs到一個比較小的值,這個進程和線程數(shù)就是比較合適的值了。系統(tǒng)調(diào)用也是,每次調(diào)用系統(tǒng)函數(shù),我們的代碼就會進入內(nèi)核空間,導(dǎo)致上下文切換,這個是很耗資源,也要盡量避免頻繁調(diào)用系統(tǒng)函數(shù)。上下文切換次數(shù)過多表示你的CPU大部分浪費在上下文切換,導(dǎo)致CPU干正經(jīng)事的時間少了,CPU沒有充分利用,是不可取的。
- us 用戶CPU時間,我曾經(jīng)在一個做加密解密很頻繁的服務(wù)器上,可以看到us接近100,r運行隊列達到80(機器在做壓力測試,性能表現(xiàn)不佳)。
- sy 系統(tǒng)CPU時間,如果太高,表示系統(tǒng)調(diào)用時間長,例如是IO操作頻繁。
- id 空閑CPU時間,一般來說,id + us + sy = 100,一般我認(rèn)為id是空閑CPU使用率,us是用戶CPU使用率,sy是系統(tǒng)CPU使用率。
- wt 等待IO CPU時間

pidstat 使用詳解

pidstat 主要用于監(jiān)控全部或指定進程占用系統(tǒng)資源的情況,如CPU,內(nèi)存、設(shè)備IO、任務(wù)切換、線程等。

使用方法:

  • pidstat –d interval times 統(tǒng)計各個進程的IO使用情況
  • pidstat –u interval times 統(tǒng)計各個進程的CPU統(tǒng)計信息
  • pidstat –r interval times 統(tǒng)計各個進程的內(nèi)存使用信息
  • pidstat -w interval times 統(tǒng)計各個進程的上下文切換
  • p PID 指定PID

1、統(tǒng)計 IO 使用情況

pidstat -d 1 10
03:02:02 PM UID PID kB_rd/s kB_wr/s kB_ccwr/s Command03:02:03 PM 0 816 0.00 918.81 0.00 jbd2/vda1-803:02:03 PM 0 1007 0.00 3.96 0.00 AliYunDun03:02:03 PM 997 7326 0.00 1904.95 918.81 java03:02:03 PM 997 8539 0.00 3.96 0.00 java03:02:03 PM 0 16066 0.00 35.64 0.00 cmagent
03:02:03 PM UID PID kB_rd/s kB_wr/s kB_ccwr/s Command03:02:04 PM 0 816 0.00 1924.00 0.00 jbd2/vda1-803:02:04 PM 997 7326 0.00 11156.00 1888.00 java03:02:04 PM 997 8539 0.00 4.00 0.00 java
  • UID
  • PID
  • kB_rd/s:每秒進程從磁盤讀取的數(shù)據(jù)量 KB 單位 read from disk each second KB
  • kB_wr/s:每秒進程向磁盤寫的數(shù)據(jù)量 KB 單位 write to disk each second KB
  • kB_ccwr/s:每秒進程向磁盤寫入,但是被取消的數(shù)據(jù)量,This may occur when the task truncates some dirty pagecache.
  • iodelay:Block I/O delay,measured in clock ticks
  • Command:進程名 task name

2、統(tǒng)計 CPU 使用情況

# 統(tǒng)計CPUpidstat -u 1 1003:03:33 PM   UID       PID    %usr %system  %guest    %CPU   CPU  Command03:03:34 PM     0      2321    3.96    0.00    0.00    3.96     0  ansible03:03:34 PM     0      7110    0.00    0.99    0.00    0.99     4  pidstat03:03:34 PM   997      8539    0.99    0.00    0.00    0.99     5  java03:03:34 PM   984     15517    0.99    0.00    0.00    0.99     5  java03:03:34 PM     0     24406    0.99    0.00    0.00    0.99     5  java03:03:34 PM     0     32158    3.96    0.00    0.00    3.96     2  ansible
  • UID
  • PID
  • %usr: 進程在用戶空間占用 cpu 的百分比
  • %system: 進程在內(nèi)核空間占用 CPU 百分比
  • %guest: 進程在虛擬機占用 CPU 百分比
  • %wait: 進程等待運行的百分比
  • %CPU: 進程占用 CPU 百分比
  • CPU: 處理進程的 CPU 編號
  • Command: 進程名

3、統(tǒng)計內(nèi)存使用情況

# 統(tǒng)計內(nèi)存pidstat -r 1 10Average:      UID       PID  minflt/s  majflt/s     VSZ    RSS   %MEM  CommandAverage:        0         1      0.20      0.00  191256   3064   0.01  systemdAverage:        0      1007      1.30      0.00  143256  22720   0.07  AliYunDunAverage:        0      6642      0.10      0.00 6301904 107680   0.33  javaAverage:      997      7326     10.89      0.00 13468904 8395848  26.04  javaAverage:        0      7795    348.15      0.00  108376   1233   0.00  pidstatAverage:      997      8539      0.50      0.00 8242256 2062228   6.40  javaAverage:      987      9518      0.20      0.00 6300944 1242924   3.85  javaAverage:        0     10280      3.70      0.00  807372   8344   0.03  aliyun-serviceAverage:      984     15517      0.40      0.00 6386464 1464572   4.54  javaAverage:        0     16066    236.46      0.00 2678332  71020   0.22  cmagentAverage:      995     20955      0.30      0.00 6312520 1408040   4.37  javaAverage:      995     20956      0.20      0.00 6093764 1505028   4.67  javaAverage:        0     23936      0.10      0.00 5302416 110804   0.34  javaAverage:        0     24406      0.70      0.00 10211672 2361304   7.32  javaAverage:        0     26870      1.40      0.00 1470212  36084   0.11  promtail
  • UID
  • PID
  • Minflt/s : 每秒次缺頁錯誤次數(shù) (minor page faults),虛擬內(nèi)存地址映射成物理內(nèi)存地址產(chǎn)生的 page fault 次數(shù)
  • Majflt/s : 每秒主缺頁錯誤次數(shù) (major page faults), 虛擬內(nèi)存地址映射成物理內(nèi)存地址時,相應(yīng) page 在 swap 中
  • VSZ virtual memory usage : 該進程使用的虛擬內(nèi)存 KB 單位
  • RSS : 該進程使用的物理內(nèi)存 KB 單位
  • %MEM : 內(nèi)存使用率
  • Command : 該進程的命令 task name

4、查看具體進程使用情況

pidstat -T ALL -r -p 20955 1 1003:12:16 PM   UID       PID  minflt/s  majflt/s     VSZ    RSS   %MEM  Command03:12:17 PM   995     20955      0.00      0.00 6312520 1408040   4.37  java
03:12:16 PM UID PID minflt-nr majflt-nr Command03:12:17 PM 995 20955 0 0 java
-End-
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 緩沖區(qū)
    +關(guān)注

    關(guān)注

    0

    文章

    32

    瀏覽量

    9073
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    6715

    瀏覽量

    88316
  • SWAP
    +關(guān)注

    關(guān)注

    0

    文章

    50

    瀏覽量

    12704
  • 堆棧
    +關(guān)注

    關(guān)注

    0

    文章

    176

    瀏覽量

    19669
  • Redis
    +關(guān)注

    關(guān)注

    0

    文章

    368

    瀏覽量

    10780
收藏 人收藏

    評論

    相關(guān)推薦

    Linux應(yīng)急響應(yīng)命令總結(jié)

    Linux應(yīng)急響應(yīng)命令總結(jié)
    發(fā)表于 11-17 09:08 ?935次閱讀

    HBase性能優(yōu)化方法總結(jié)

    ,不要滿額配置地使用網(wǎng)絡(luò),否則在高負載時,會影響HBase應(yīng)用系統(tǒng)的性能3. 操作系統(tǒng)操作系統(tǒng)的選擇應(yīng)考慮是否支持HBase,通常情況下選擇Linux操作系統(tǒng)。4. 本地文件系統(tǒng)本地Linu
    發(fā)表于 04-20 17:16

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

    近年來,世界上許多大軟件公司紛紛推出各種Linux服務(wù)器系統(tǒng)及Linux下的應(yīng)用軟件。目前,Linux 已可以與各種傳統(tǒng)的商業(yè)操作系統(tǒng)分庭抗禮,在服務(wù)器市場,占據(jù)了相當(dāng)大的份額。本文分別從磁盤調(diào)優(yōu),文件系統(tǒng),內(nèi)存管理以及編譯
    發(fā)表于 07-16 06:23

    基于Linux的Socket網(wǎng)絡(luò)編程的性能優(yōu)化

    基于Linux的Socket網(wǎng)絡(luò)編程的性能優(yōu)化 隨著Intenet的日益發(fā)展和普及,網(wǎng)絡(luò)在嵌入式系統(tǒng)中應(yīng)用非常廣泛,越來越多的嵌入式設(shè)備采用Linux操作系統(tǒng)。
    發(fā)表于 10-22 20:48 ?1054次閱讀
    基于<b class='flag-5'>Linux</b>的Socket網(wǎng)絡(luò)編程的<b class='flag-5'>性能</b><b class='flag-5'>優(yōu)化</b>

    DSP程序優(yōu)化總結(jié)

    DSP程序優(yōu)化總結(jié)
    發(fā)表于 10-23 14:24 ?2次下載
    DSP程序<b class='flag-5'>優(yōu)化</b><b class='flag-5'>總結(jié)</b>

    linux Android基礎(chǔ)知識總結(jié)

    linux Android基礎(chǔ)知識總結(jié)
    發(fā)表于 10-24 09:00 ?6次下載
    <b class='flag-5'>linux</b> Android基礎(chǔ)知識<b class='flag-5'>總結(jié)</b>

    linux redis基礎(chǔ)命令總結(jié)

    linux redis日常工作命令總結(jié)供大家參考
    發(fā)表于 11-25 18:21 ?1414次閱讀

    Linux CPU的性能應(yīng)該如何優(yōu)化

    Linux系統(tǒng)中,由于成本的限制,往往會存在資源上的不足,例如 CPU、內(nèi)存、網(wǎng)絡(luò)、IO 性能。本文,就對 Linux 進程和 CPU 的原理進行分析,總結(jié)出 CPU
    的頭像 發(fā)表于 01-18 08:52 ?3262次閱讀

    Linux的基礎(chǔ)學(xué)習(xí)筆記資料總結(jié)

    本文檔的主要內(nèi)容詳細介紹的是Linux的基礎(chǔ)學(xué)習(xí)筆記資料總結(jié)包括了:一、 常用命令,二、 磁盤管理,三、 用戶管理,四、 文件權(quán)限,五、 目錄結(jié)構(gòu),六、 軟件安裝,七、 時間管理,八、 啟動引導(dǎo),九
    發(fā)表于 11-13 08:00 ?4次下載

    Linux優(yōu)化Zen3性能高出15%

    Intel、AMD相愛相殺50年,現(xiàn)在兩家是打得不可開交,然后在某些領(lǐng)域兩邊可能還是天作之合。對Linux用戶來說,AMD的Zen3處理器現(xiàn)在是最好的CPU,而最佳系統(tǒng)則是Intel的Clear
    的頭像 發(fā)表于 12-24 11:32 ?2252次閱讀

    Linux下Apache性能分析總結(jié)

    Linux下Apache性能分析總結(jié)(深圳核達中遠通電源技術(shù)有限公司地址)-該文檔為Linux下Apache性能分析
    發(fā)表于 09-24 14:53 ?2次下載
    <b class='flag-5'>Linux</b>下Apache<b class='flag-5'>性能</b>分析<b class='flag-5'>總結(jié)</b>

    Linux 性能優(yōu)化總結(jié)!1

    應(yīng)用負載角度:直接影響了產(chǎn)品終端的用戶體驗 * 系統(tǒng)資源角度:資源使用率、飽和度等 性能問題的本質(zhì)就是系統(tǒng)資源已經(jīng)到達瓶頸,但請求的處理還不夠快,無法支撐更多的請求。性能分析實際上就是找出應(yīng)用或系統(tǒng)的瓶頸,設(shè)法去避免或緩解它們。
    的頭像 發(fā)表于 05-12 15:16 ?537次閱讀
    <b class='flag-5'>Linux</b> <b class='flag-5'>性能</b><b class='flag-5'>優(yōu)化</b><b class='flag-5'>總結(jié)</b>!1

    Linux 性能優(yōu)化總結(jié)!2

    大多數(shù)計算機用的主存都是動態(tài)隨機訪問內(nèi)存(DRAM),只有內(nèi)核才可以直接訪問物理內(nèi)存。Linux內(nèi)核給每個進程提供了一個獨立的虛擬地址空間,并且這個地址空間是連續(xù)的。這樣進程就可以很方便的訪問內(nèi)存(虛擬內(nèi)存)。
    的頭像 發(fā)表于 05-12 15:16 ?427次閱讀
    <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

    Linux內(nèi)核slab性能優(yōu)化的核心思想

    今天分享一篇內(nèi)存性能優(yōu)化的文章,文章用了大量精美的圖深入淺出地分析了Linux內(nèi)核slab性能優(yōu)化的核心思想,slab是
    的頭像 發(fā)表于 11-13 11:45 ?493次閱讀
    <b class='flag-5'>Linux</b>內(nèi)核slab<b class='flag-5'>性能</b><b class='flag-5'>優(yōu)化</b>的核心思想

    性能優(yōu)化之路總結(jié)

    針對老項目,去年做了許多降本增效的事情,其中發(fā)現(xiàn)最多的就是接口耗時過長的問題,就集中搞了一次接口性能優(yōu)化。本文將給小伙伴們分享一下接口優(yōu)化的通用方案。 ? ? 一、接口優(yōu)化方案
    的頭像 發(fā)表于 06-17 15:00 ?197次閱讀