Linux性能優化實戰學習筆記:第五講

1、什麼是CPU的使用率

一、你最經常使用什麼指標來描述系統的CPU性能?

我想你的答案,可能不是平均負載,也不是CPU上下文切換,而是另外一個更直觀的指標CPU使用率mysql

CPU使用率究竟是怎麼算出來的嗎?sql

一、如何設置節拍率docker

[root@luoahong ~]# grep 'CONFIG_HZ=' /boot/config-$(uname -r)
CONFIG_HZ=1000

二、內核提供的用戶節拍率是多少?bash

USER_HZ=100

爲了方便用戶控件程序,內核還提供了一個用戶控件的節拍率,它老是固定爲100,也就是1/100秒,這樣,用戶控件程序並須要關係內核中HZ被設置成了多少app

四、如何查看用戶控件系統內部狀態信息函數

[root@luoahong ~]#  cat /proc/stat | grep ^cpu
cpu  62143 14 10857 931923 669 0 3498 0 0 0
cpu0 31506 4 5649 467020 228 0 628 0 0 0
cpu1 30637 10 5207 464903 441 0 2870 0 0 0
[root@luoahong ~]#

這裏的輸出結果是一個表格,其中,第一列表示的是CPU編號,如CPU0、CPU1,而第一行沒有編號的CPU
表示的是全部CPU的累加工具

2、CPU使用率公式

咱們一般所說的 CPU使用率,就是除了空閒時間外的其餘時間佔總CPU時間的百分比,用公式來表示就是性能

 

一、直接用/proc/stat 的數據,算的是什麼時間段的 CPU使用率嗎?spa

看到這裏,你應該想起來了,這是開機以來的節拍數累加值,因此直接算出來的,是開機以來的平均CPU使用率,通常沒啥參考價值rest

二、性能工具是如何計算CPU使用率的

事實上,爲了計算機CPU使用率,性能能工具通常都會間隔一段時間(好比 3 秒)的兩次值,作差後,再計算出這段時間的平均CPU使用率 
各類性能工具所看到的CPU使用率的實際計算方法以下

 

性能分析工具給出的都是間隔一段時間的平均CPU使用率,因此要注意間隔時間的設置,特別是用多個工具對比分析時,

你必定要保證他們用的是相同的間隔時間

3、怎麼查看CPU使用率

一、top顯示系統整體CPU使用狀況

top顯示了系統整體的CPU和內存使用狀況,以及各個進程的資源使用狀況

# 默認每 3 秒刷新一次
$ top
top - 11:00:25 up  1:35,  2 users,  load average: 0.00, 0.01, 0.18
Tasks: 131 total,   1 running, 130 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.2 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.2 si,  0.0 st
KiB Mem :  8056848 total,  5665852 free,   688220 used,  1702776 buff/cache
KiB Swap:  2097148 total,  2097148 free,        0 used.  6945016 avail Mem

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
 10150 polkitd   20   0 1267680 201924   9372 S   1.0  2.5   0:39.33 mysqld
  9906 mysql     20   0 1119708 184904   5824 S   0.7  2.3   0:32.89 mysqld
  8041 root      20   0  300896   6384   4956 S   0.3  0.1   0:28.40 vmtoolsd

...

二、top圖解

 

三、 pidstat分析每一個進程CPU使用狀況

top並無細分進程的用戶態CPU和內核態CPU,那要怎麼查看每一個進程的詳細狀況呢?

# 默認每 3 秒刷新一次
$ top
top - 11:00:25 up  1:35,  2 users,  load average: 0.00, 0.01, 0.18
Tasks: 131 total,   1 running, 130 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.2 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.2 si,  0.0 st
KiB Mem :  8056848 total,  5665852 free,   688220 used,  1702776 buff/cache
KiB Swap:  2097148 total,  2097148 free,        0 used.  6945016 avail Mem

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
 10150 polkitd   20   0 1267680 201924   9372 S   1.0  2.5   0:39.33 mysqld
  9906 mysql     20   0 1119708 184904   5824 S   0.7  2.3   0:32.89 mysqld
  8041 root      20   0  300896   6384   4956 S   0.3  0.1   0:28.40 vmtoolsd

...
Average:      999     10150    0.20    0.40    0.00    0.00    0.60     -  mysqld
Average:        0     11747    0.40    1.59    0.00    0.00    1.98     -  pidstat

四、pidstat命令圖解

最後的Average部分,還計算了5組數據的平均值

4、CPU使用率太高怎麼辦?

一、分析思路

一、如何輕鬆找到CPU使用率太高的進程

經過top、ps 、pidstat等工具

二、佔用CPU高的究竟是代碼裏的那個函數?

perf和GDB

三、那麼哪一種工具適合在第一時間分析進程的 CPU 問題呢?

perf是Linux 2.6.31 之後內置的性能分析工具,它以性能事件採樣爲基礎,不只能夠分析系統的各類事件和內核性能,還能夠用來分析制定應用程序的性能問題

二、實時顯示佔用CPU時鐘最多的函數

實時顯示佔用CPU時鐘最多的函數或者指令,所以能夠用來查找熱點函數

[root@luoahong ~]# perf top

Samples: 724 of event 'cpu-clock', Event count (approx.): 125711088
Overhead Shared Object Symbol
45.11% [kernel] [k] generic_exec_single
...

採樣數須要咱們特別注意,若是採樣數過少(好比只有十幾個),那下面的排序和百分比就沒什麼實際參考價值了

三、perf命令詳解

 

雖然實時展現了系統的性能信息,但它的缺點並不能保存數據,也就沒法離線或者後續的分析,而perf record

則提供了保存數據的功能,保存後的數據,須要你用perf report解析展現

四、離線和後續分析佔用CPU時鐘最多的函數

perf record # 按 Ctrl+C 終止採樣

[root@luoahong ~]# perf report

Samples: 5K of event 'cpu-clock', Event count (approx.): 1332500000
Overhead Command Shared Object Symbol
97.15% swapper [kernel.kallsyms] [k] native_safe_halt
0.49% swapper [kernel.kallsyms] [k] _raw_spin_unlock_irqrestore
0.36% vmtoolsd libvmtools.so.0.0.0 [.] Backdoor_InOut
0.34% swapper [kernel.kallsyms] [k] __do_softirq
0.17% swapper [kernel.kallsyms] [k] tick_nohz_idle_exit
0.13% swapper [kernel.kallsyms] [k] tick_nohz_idle_enter
0.13% vmtoolsd [kernel.kallsyms] [k] _raw_spin_unlock_irqrestore
0.11% kworker/0:1 [kernel.kallsyms] [k] _raw_spin_unlock_irqrestore
0.11% vmtoolsd libvmtools.so.0.0.0 [.] BackdoorHbOut
0.08% dockerd [kernel.kallsyms] [k] _raw_spin_unlock_irqrestore
0.08% vmtoolsd [kernel.kallsyms] [k] __do_softirq
0.06% kworker/1:2 [kernel.kallsyms] [k] queue_delayed_work_on
0.06% vmtoolsd [kernel.kallsyms] [k] format_decode
0.04% irqbalance [kernel.kallsyms] [k] cap_mmap_file
0.04% kworker/0:0 [kernel.kallsyms] [k] ata_sff_pio_task
0.04% kworker/1:2 [kernel.kallsyms] [k] _raw_spin_unlock_irqrestore
0.04% mysqld mysqld [.] fts_optimize_words
0.04% swapper [kernel.kallsyms] [k] rcu_idle_exit
0.04% vmtoolsd libvmtools.so.0.0.0 [.] BackdoorHbIn
0.02% dockerd [kernel.kallsyms] [k] __do_softirq
0.02% in:imjournal rsyslogd [.] 0x0000000000016f90
0.02% irqbalance [kernel.kallsyms] [k] __fsnotify_parent
0.02% irqbalance [kernel.kallsyms] [k] _raw_spin_unlock_irqrestore
0.02% irqbalance [kernel.kallsyms] [k] copy_user_generic_unrolled
0.02% irqbalance [kernel.kallsyms] [k] native_flush_tlb_single
0.02% irqbalance [kernel.kallsyms] [k] unmap_page_range
Tip: For tracepoint events, try: perf report -s trace_fields

在實際使用中,咱們還常常爲perf top和perf record加上-g參數,開啓調用關係的採樣,方便咱們根據調用鏈分析西能問題

相關文章
相關標籤/搜索