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


一、什么是CPU的使用率

1、你最常用什么指標來描述系統的CPU性能?

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

CPU使用率到底是怎么算出來的嗎?

1、如何設置節拍率

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

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

USER_HZ=100

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

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

[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的累加

二、CPU使用率公式

我們通常所說的 CPU使用率,就是除了空閑時間外的其他時間占總CPU時間的百分比,用公式來表示就是

 

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

看到這里,你應該想起來了,這是開機以來的節拍數累加值,所以直接算出來的,是開機以來的平均CPU使用率,一般沒啥參考價值

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

事實上,為了計算機CPU使用率,性能能工具一般都會間隔一段時間(比如 3 秒)的兩次值,做差后,再計算出這段時間的平均CPU使用率 
各種性能工具所看到的CPU使用率的實際計算方法如下

 

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

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

三、怎么查看CPU使用率

1、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

...

2、top圖解

 

3、 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

4、pidstat命令圖解

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

四、CPU使用率過高怎么辦?

1、分析思路

1、如何輕松找到CPU使用率過高的進程

通過top、ps 、pidstat等工具

2、占用CPU高的到底是代碼里的那個函數?

perf和GDB

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

perf是Linux 2.6.31 以后內置的性能分析工具,它以性能事件采樣為基礎,不僅可以分析系統的各種事件和內核性能,還可以用來分析制定應用程序的性能問題

2、實時顯示占用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
...

采樣數需要我們特別注意,如果采樣數過少(比如只有十幾個),那下面的排序和百分比就沒什么實際參考價值了

3、perf命令詳解

 

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

則提供了保存數據的功能,保存后的數據,需要你用perf report解析展示

4、離線和后續分析占用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參數,開啟調用關系的采樣,方便我們根據調用鏈分析西能問題


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM