日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

系统级性能分析工具perf的介绍与使用

發(fā)布時間:2023/12/13 综合教程 41 生活家
生活随笔 收集整理的這篇文章主要介紹了 系统级性能分析工具perf的介绍与使用 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

測試環(huán)境:Ubuntu16.04 +Kernel:4.4.0-31

系統(tǒng)級性能優(yōu)化通常包括兩個階段:性能剖析(performance profiling)和代碼優(yōu)化。

性能剖析的目標是尋找性能瓶頸,查找引發(fā)性能問題的原因及熱點代碼。

代碼優(yōu)化的目標是針對具體性能問題而優(yōu)化代碼或編譯選項,以改善軟件性能。

在性能剖析階段,需要借助于現(xiàn)有的profiling工具,如perf等。在代碼優(yōu)化階段往往需要借助開發(fā)者的經(jīng)驗,編寫簡潔高效的代碼,甚至在匯編級別合理使用各種指令,合理安排各種指令的執(zhí)行順序。

perf是一款Linux性能分析工具。Linux性能計數(shù)器是一個新的基于內核的子系統(tǒng),它提供一個性能分析框架,比如硬件(CPU、PMU(Performance Monitoring Unit))功能和軟件(軟件計數(shù)器、tracepoint)功能。
通過perf,應用程序可以利用PMU、tracepoint和內核中的計數(shù)器來進行性能統(tǒng)計。它不但可以分析制定應用程序的性能問題(per thread),也可以用來分析內核的性能問題,當然也可以同事分析應用程序和內核,從而全面理解應用程序中的性能瓶頸。

使用perf,可以分析程序運行期間發(fā)生的硬件事件,比如instructions retired、processor clock cycles等;也可以分析軟件時間,比如page fault和進程切換。

perf是一款綜合性分析工具,大到系統(tǒng)全局性性能,再小到進程線程級別,甚至到函數(shù)及匯編級別。

perf提供了十八般武器,可以拿大刀大卸八塊,也可以拿起手術刀細致分析。

1. 背景知識

1.1 tracepoints

tracepoints是散落在內核源碼中的一些hook,它們可以在特定的代碼被執(zhí)行到時觸發(fā),這一特定可以被各種trace/debug工具所使用。

perf將tracepoint產(chǎn)生的時間記錄下來,生成報告,通過分析這些報告,條有人緣便可以了解程序運行期間內核的各種細節(jié),對性能癥狀做出準確的診斷。

這些tracepint的對應的sysfs節(jié)點在/sys/kernel/debug/tracing/events目錄下。

1.2 硬件特性之cache

內存讀寫是很快的,但是還是無法和處理器指令執(zhí)行速度相比。為了從內存中讀取指令和數(shù)據(jù),處理器需要等待,用處理器時間來衡量,這種等待非常漫長。cache是一種SRAM,讀寫速度非常快,能和處理器相匹配。因此將常用的數(shù)據(jù)保存在cache中,處理器便無需等待,從而提高性能。cache的尺寸一般都很小,充分利用cache是軟件調優(yōu)非常重要部分。

2. 主要關注點

基于性能分析,可以進行算法優(yōu)化(空間復雜度和時間復雜度權衡)、代碼優(yōu)化(提高執(zhí)行速度、減少內存占用)。

評估程序對硬件資源的使用情況,例如各級cache的訪問次數(shù)、各級cache的丟失次數(shù)、流水線停頓周期、前端總線訪問次數(shù)等。

評估程序對操作系統(tǒng)資源的使用情況,系統(tǒng)調用次數(shù)、上下文切換次數(shù)、任務遷移次數(shù)。

事件可以分為三種:

Hardware Event由PMU部件產(chǎn)生,在特定的條件下探測性能事件是否發(fā)生以及發(fā)生的次數(shù)。比如cache命中。
Software Event是內核產(chǎn)生的事件,分布在各個功能模塊中,統(tǒng)計和操作系統(tǒng)相關性能事件。比如進程切換,tick數(shù)等。

Tracepoint Event是內核中靜態(tài)tracepoint所觸發(fā)的事件,這些tracepoint用來判斷程序運行期間內核的行為細節(jié),比如slab分配器的分配次數(shù)等。

3. perf的使用

perf --help之后可以看到perf的二級命令。

序號 命令 作用
1 annotate 解析perf record生成的perf.data文件,顯示被注釋的代碼。
2 archive 根據(jù)數(shù)據(jù)文件記錄的build-id,將所有被采樣到的elf文件打包。利用此壓縮包,可以再任何機器上分析數(shù)據(jù)文件中記錄的采樣數(shù)據(jù)。
3 bench perf中內置的benchmark,目前包括兩套針對調度器和內存管理子系統(tǒng)的benchmark。
4 buildid-cache 管理perf的buildid緩存,每個elf文件都有一個獨一無二的buildid。buildid被perf用來關聯(lián)性能數(shù)據(jù)與elf文件。
5 buildid-list 列出數(shù)據(jù)文件中記錄的所有buildid。
6 diff 對比兩個數(shù)據(jù)文件的差異。能夠給出每個符號(函數(shù))在熱點分析上的具體差異。
7 evlist 列出數(shù)據(jù)文件perf.data中所有性能事件。
8 inject 該工具讀取perf record工具記錄的事件流,并將其定向到標準輸出。在被分析代碼中的任何一點,都可以向事件流中注入其它事件。
9 kmem 針對內核內存(slab)子系統(tǒng)進行追蹤測量的工具
10 kvm 用來追蹤測試運行在KVM虛擬機上的Guest OS。
11 list 列出當前系統(tǒng)支持的所有性能事件。包括硬件性能事件、軟件性能事件以及檢查點。
12 lock 分析內核中的鎖信息,包括鎖的爭用情況,等待延遲等。
13 mem 內存存取情況
14 record 收集采樣信息,并將其記錄在數(shù)據(jù)文件中。隨后可通過其它工具對數(shù)據(jù)文件進行分析。
15 report 讀取perf record創(chuàng)建的數(shù)據(jù)文件,并給出熱點分析結果。
16 sched 針對調度器子系統(tǒng)的分析工具。
17 script 執(zhí)行perl或python寫的功能擴展腳本、生成腳本框架、讀取數(shù)據(jù)文件中的數(shù)據(jù)信息等。
18 stat 執(zhí)行某個命令,收集特定進程的性能概況,包括CPI、Cache丟失率等。
19 test perf對當前軟硬件平臺進行健全性測試,可用此工具測試當前的軟硬件平臺是否能支持perf的所有功能。
20 timechart 針對測試期間系統(tǒng)行為進行可視化的工具
21 top 類似于linux的top命令,對系統(tǒng)性能進行實時分析。
22 trace 關于syscall的工具。
23 probe 用于定義動態(tài)檢查點。

全局性概況:

perf list查看當前系統(tǒng)支持的性能事件;

perf bench對系統(tǒng)性能進行摸底;

perf test對系統(tǒng)進行健全性測試;

perf stat對全局性能進行統(tǒng)計;

全局細節(jié):

perf top可以實時查看當前系統(tǒng)進程函數(shù)占用率情況;

perf probe可以自定義動態(tài)事件;

特定功能分析:

perf kmem針對slab子系統(tǒng)性能分析;

perf kvm針對kvm虛擬化分析;

perf lock分析鎖性能;

perf mem分析內存slab性能;

perf sched分析內核調度器性能;

perf trace記錄系統(tǒng)調用軌跡;

最常用功能perf record,可以系統(tǒng)全局,也可以具體到某個進程,更甚具體到某一進程某一事件;可宏觀,也可以很微觀。

pref record記錄信息到perf.data;

perf report生成報告;

perf diff對兩個記錄進行diff;

perf evlist列出記錄的性能事件;

perf annotate顯示perf.data函數(shù)代碼;

perf archive將相關符號打包,方便在其它機器進行分析;

perf script將perf.data輸出可讀性文本;

可視化工具perf timechart

perf timechart record記錄事件;

perf timechart生成output.svg文檔;

3.0 perf引入的overhead

perf測試不可避免的會引入額外負荷,有三種形式:

counting:內核提供計數(shù)總結,多是Hardware Event、Software Events、PMU計數(shù)等。相關命令perf stat。

sampling:perf將事件數(shù)據(jù)緩存到一塊buffer中,然后異步寫入到perf.data文件中。使用perf report等工具進行離線分析。

bpf:Kernel 4.4+新增功能,可以提供更多有效filter和輸出總結。

counting引入的額外負荷最小;sampling在某些情況下會引入非常大的負荷;bpf可以有效縮減負荷。

針對sampling,可以通過掛在建立在RAM上的文件系統(tǒng)來有效降低讀寫I/O引入的負荷。

mkdir /tmpfs

mount -t tmpfs tmpfs /tmpfs

3.1 perf list

perf list不能完全顯示所有支持的事件類型,需要sudo perf list。

同時還可以顯示特定模塊支持的perf事件:hw/cache/pmu都是硬件相關的;tracepoint基于內核的ftrace;sw實際上是內核計數(shù)器。

hw/hardware顯示支持的硬件事件相關,如:

al@al-System-Product-Name:~/perf$ sudo perf list hardware

List of pre-defined events (to be used in -e):

branch-instructions OR branches [Hardware event]
branch-misses [Hardware event]
cache-misses [Hardware event]
cache-references [Hardware event]
cpu-cycles OR cycles [Hardware event]
instructions [Hardware event]
stalled-cycles-backend OR idle-cycles-backend [Hardware event]
stalled-cycles-frontend OR idle-cycles-frontend [Hardware event]

sw/software顯示支持的軟件事件列表:

al@al-System-Product-Name:~/perf$ sudo perf list sw

List of pre-defined events (to be used in -e):

alignment-faults [Software event]
bpf-output [Software event]
context-switches OR cs [Software event]
cpu-clock [Software event]
cpu-migrations OR migrations [Software event]
dummy [Software event]
emulation-faults [Software event]
major-faults [Software event]
minor-faults [Software event]
page-faults OR faults [Software event]
task-clock [Software event]

cache/hwcache顯示硬件cache相關事件列表:

al@al-System-Product-Name:~/perf$ sudo perf list cache

List of pre-defined events (to be used in -e):

L1-dcache-load-misses [Hardware cache event]
L1-dcache-loads [Hardware cache event]
L1-dcache-prefetch-misses [Hardware cache event]
L1-dcache-prefetches [Hardware cache event]
L1-icache-load-misses [Hardware cache event]
L1-icache-loads [Hardware cache event]
L1-icache-prefetches [Hardware cache event]
LLC-load-misses [Hardware cache event]
LLC-loads [Hardware cache event]
LLC-stores [Hardware cache event]
branch-load-misses [Hardware cache event]
branch-loads [Hardware cache event]
dTLB-load-misses [Hardware cache event]
dTLB-loads [Hardware cache event]
iTLB-load-misses [Hardware cache event]
iTLB-loads [Hardware cache event]
node-load-misses [Hardware cache event]
node-loads [Hardware cache event]

pmu顯示支持的PMU事件列表:

al@al-System-Product-Name:~/perf$ sudo perf list pmu

List of pre-defined events (to be used in -e):

branch-instructions OR cpu/branch-instructions/ [Kernel PMU event]
branch-misses OR cpu/branch-misses/ [Kernel PMU event]
cache-misses OR cpu/cache-misses/ [Kernel PMU event]
cache-references OR cpu/cache-references/ [Kernel PMU event]
cpu-cycles OR cpu/cpu-cycles/ [Kernel PMU event]
instructions OR cpu/instructions/ [Kernel PMU event]
msr/aperf/ [Kernel PMU event]
msr/mperf/ [Kernel PMU event]
msr/tsc/ [Kernel PMU event]
stalled-cycles-backend OR cpu/stalled-cycles-backend/ [Kernel PMU event]
stalled-cycles-frontend OR cpu/stalled-cycles-frontend/ [Kernel PMU event]

tracepoint顯示支持的所有tracepoint列表,這個列表就比較龐大:

al@al-System-Product-Name:~/perf$ sudo perf list tracepoint

List of pre-defined events (to be used in -e):

alarmtimer:alarmtimer_cancel [Tracepoint event]
alarmtimer:alarmtimer_fired [Tracepoint event]
alarmtimer:alarmtimer_start [Tracepoint event]
alarmtimer:alarmtimer_suspend [Tracepoint event]
block:block_bio_backmerge [Tracepoint event]
block:block_bio_bounce [Tracepoint event]
block:block_bio_complete [Tracepoint event]
block:block_bio_frontmerge [Tracepoint event]
block:block_bio_queue [Tracepoint event]

3.2 perf top

默認情況下perf top是無法顯示信息的,需要sudo perf top或者echo -1 > /proc/sys/kernel/perf_event_paranoid(在Ubuntu16.04,還需要echo 0 > /proc/sys/kernel/kptr_restrict)。

即可以正常顯示perf top如下:

第一列:符號引發(fā)的性能事件的比例,指占用的cpu周期比例。

第二列:符號所在的DSO(Dynamic Shared Object),可以是應用程序、內核、動態(tài)鏈接庫、模塊。

第三列:DSO的類型。[.]表示此符號屬于用戶態(tài)的ELF文件,包括可執(zhí)行文件與動態(tài)鏈接庫;[k]表述此符號屬于內核或模塊。

第四列:符號名。有些符號不能解析為函數(shù)名,只能用地址表示。

關于perf top界面常用命令如下:

h:顯示幫助,即可顯示詳細的幫助信息。

UP/DOWN/PGUP/PGDN/SPACE:上下和翻頁。

a:annotate current symbol,注解當前符號。能夠給出匯編語言的注解,給出各條指令的采樣率。

d:過濾掉所有不屬于此DSO的符號。非常方便查看同一類別的符號。

P:將當前信息保存到perf.hist.N中。

perf top常用選項有:

-e <event>:指明要分析的性能事件。

-p <pid>:Profile events on existing Process ID (comma sperated list). 僅分析目標進程及其創(chuàng)建的線程。

-k <path>:Path to vmlinux. Required for annotation functionality. 帶符號表的內核映像所在的路徑。

-K:不顯示屬于內核或模塊的符號。

-U:不顯示屬于用戶態(tài)程序的符號。

-d <n>:界面的刷新周期,默認為2s,因為perf top默認每2s從mmap的內存區(qū)域讀取一次性能數(shù)據(jù)。

-g:得到函數(shù)的調用關系圖。

perf top --call-graph [fractal],路徑概率為相對值,加起來為100%,調用順序為從下往上。

perf top --call-graph graph,路徑概率為絕對值,加起來為該函數(shù)的熱度。

3.3 perf stat

perf stat用于運行指令,并分析其統(tǒng)計結果。雖然perf top也可以指定pid,但是必須先啟動應用才能查看信息。

perf stat能完整統(tǒng)計應用整個生命周期的信息。

命令格式為:

perf stat [-e <EVENT> | --event=EVENT] [-a] <command>
perf stat [-e <EVENT> | --event=EVENT] [-a] — <command> [<options>]

下面簡單看一下perf stat 的輸出:

al@al-System-Product-Name:~/perf$ sudo perf stat
^C
Performance counter stats for 'system wide':

40904.820871 cpu-clock (msec) # 5.000 CPUs utilized
18,132 context-switches # 0.443 K/sec
1,053 cpu-migrations # 0.026 K/sec
2,420 page-faults # 0.059 K/sec
3,958,376,712 cycles # 0.097 GHz (49.99%)
574,598,403 stalled-cycles-frontend # 14.52% frontend cycles idle (49.98%)
9,392,982,910 stalled-cycles-backend # 237.29% backend cycles idle (50.00%)
1,653,185,883 instructions # 0.42 insn per cycle
# 5.68 stalled cycles per insn (50.01%)
237,061,366 branches # 5.795 M/sec (50.02%)
18,333,168 branch-misses # 7.73% of all branches (50.00%)

8.181521203 seconds time elapsed

輸出解釋如下:

cpu-clock:任務真正占用的處理器時間,單位為ms。CPUs utilized = task-clock / time elapsed,CPU的占用率。

context-switches:程序在運行過程中上下文的切換次數(shù)。

CPU-migrations:程序在運行過程中發(fā)生的處理器遷移次數(shù)。Linux為了維持多個處理器的負載均衡,在特定條件下會將某個任務從一個CPU遷移到另一個CPU。

CPU遷移和上下文切換:發(fā)生上下文切換不一定會發(fā)生CPU遷移,而發(fā)生CPU遷移時肯定會發(fā)生上下文切換。發(fā)生上下文切換有可能只是把上下文從當前CPU中換出,下一次調度器還是將進程安排在這個CPU上執(zhí)行。

page-faults:缺頁異常的次數(shù)。當應用程序請求的頁面尚未建立、請求的頁面不在內存中,或者請求的頁面雖然在內存中,但物理地址和虛擬地址的映射關系尚未建立時,都會觸發(fā)一次缺頁異常。另外TLB不命中,頁面訪問權限不匹配等情況也會觸發(fā)缺頁異常。

cycles:消耗的處理器周期數(shù)。如果把被ls使用的cpu cycles看成是一個處理器的,那么它的主頻為2.486GHz。可以用cycles / task-clock算出。

stalled-cycles-frontend:指令讀取或解碼的質量步驟,未能按理想狀態(tài)發(fā)揮并行左右,發(fā)生停滯的時鐘周期。

stalled-cycles-backend:指令執(zhí)行步驟,發(fā)生停滯的時鐘周期。

instructions:執(zhí)行了多少條指令。IPC為平均每個cpu cycle執(zhí)行了多少條指令。

branches:遇到的分支指令數(shù)。branch-misses是預測錯誤的分支指令數(shù)。

其他常用參數(shù)

-a, --all-cpus 顯示所有CPU上的統(tǒng)計信息
-C, --cpu <cpu> 顯示指定CPU的統(tǒng)計信息
-c, --scale scale/normalize counters
-D, --delay <n> ms to wait before starting measurement after program start
-d, --detailed detailed run - start a lot of events
-e, --event <event> event selector. use 'perf list' to list available events
-G, --cgroup <name> monitor event in cgroup name only
-g, --group put the counters into a counter group
-I, --interval-print <n>
print counts at regular interval in ms (>= 10)
-i, --no-inherit child tasks do not inherit counters
-n, --null null run - dont start any counters
-o, --output <file> 輸出統(tǒng)計信息到文件
-p, --pid <pid> stat events on existing process id
-r, --repeat <n> repeat command and print average + stddev (max: 100, forever: 0)
-S, --sync call sync() before starting a run
-t, --tid <tid> stat events on existing thread id
...

示例

前面統(tǒng)計程序的示例,下面看一下統(tǒng)計CPU信息的示例:

執(zhí)行sudo perf stat -C 0,統(tǒng)計CPU 0的信息。想要停止后,按下Ctrl+C終止。可以看到統(tǒng)計項一樣,只是統(tǒng)計對象變了。

al@al-System-Product-Name:~/perf$ sudo perf stat -C 0
^C
Performance counter stats for 'CPU(s) 0':

2517.107315 cpu-clock (msec) # 1.000 CPUs utilized
2,941 context-switches # 0.001 M/sec
109 cpu-migrations # 0.043 K/sec
38 page-faults # 0.015 K/sec
644,094,340 cycles # 0.256 GHz (49.94%)
70,425,076 stalled-cycles-frontend # 10.93% frontend cycles idle (49.94%)
965,270,543 stalled-cycles-backend # 149.86% backend cycles idle (49.94%)
623,284,864 instructions # 0.97 insn per cycle
# 1.55 stalled cycles per insn (50.06%)
65,658,190 branches # 26.085 M/sec (50.06%)
3,276,104 branch-misses # 4.99% of all branches (50.06%)

2.516996126 seconds time elapsed

如果需要統(tǒng)計更多的項,需要使用-e,如:

perf stat -e task-clock,context-switches,cpu-migrations,page-faults,cycles,stalled-cycles-frontend,stalled-cycles-backend,instructions,branches,branch-misses,L1-dcache-loads,L1-dcache-load-misses,LLC-loads,LLC-load-misses,dTLB-loads,dTLB-load-misses ls

結果如下,關注的特殊項也納入統(tǒng)計。

al@al-System-Product-Name:~/perf$ sudo perf stat -e task-clock,context-switches,cpu-migrations,page-faults,cycles,stalled-cycles-frontend,stalled-cycles-backend,instructions,branches,branch-misses,L1-dcache-loads,L1-dcache-load-misses,LLC-loads,LLC-load-misses,dTLB-loads,dTLB-load-misses ls

Performance counter stats for 'ls':

2.319422 task-clock (msec) # 0.719 CPUs utilized
0 context-switches # 0.000 K/sec
0 cpu-migrations # 0.000 K/sec
89 page-faults # 0.038 M/sec
2,142,386 cycles # 0.924 GHz
659,800 stalled-cycles-frontend # 30.80% frontend cycles idle
725,343 stalled-cycles-backend # 33.86% backend cycles idle
1,344,518 instructions # 0.63 insn per cycle
# 0.54 stalled cycles per insn
<not counted> branches
<not counted> branch-misses
<not counted> L1-dcache-loads
<not counted> L1-dcache-load-misses
<not counted> LLC-loads
<not counted> LLC-load-misses
<not counted> dTLB-loads
<not counted> dTLB-load-misses

0.003227507 seconds time elapsed

3.4 perf bench

perf bench作為benchmark工具的通用框架,包含sched/mem/numa/futex等子系統(tǒng),all可以指定所有。

perf bench可用于評估系統(tǒng)sched/mem等特定性能。

perf bench sched:調度器和IPC機制。包含messaging和pipe兩個功能。

perf bench mem:內存存取性能。包含memcpy和memset兩個功能。

perf bench numa:NUMA架構的調度和內存處理性能。包含mem功能。

perf bench futex:futex壓力測試。包含hash/wake/wake-parallel/requeue/lock-pi功能。

perf bench all:所有bench測試的集合

3.4.1 perf bench sched all

測試messaging和pipi兩部分性能。

3.4.1.1 sched messaging評估進程調度和核間通信

sched message 是從經(jīng)典的測試程序 hackbench 移植而來,用來衡量調度器的性能,overhead 以及可擴展性。

該 benchmark 啟動 N 個 reader/sender 進程或線程對,通過 IPC(socket 或者 pipe) 進行并發(fā)的讀寫。一般人們將 N 不斷加大來衡量調度器的可擴展性。

sched message 的用法及用途和 hackbench 一樣,可以通過修改參數(shù)進行不同目的測試:

-g, --group <n> Specify number of groups

-l, --nr_loops <n> Specify the number of loops to run (default: 100)

-p, --pipe Use pipe() instead of socketpair()

-t, --thread Be multi thread instead of multi process

測試結果:

al@al-System-Product-Name:~/perf$ perf bench sched all
# Running sched/messaging benchmark...
# 20 sender and receiver processes per group
# 10 groups == 400 processes run

Total time: 0.173 [sec]

# Running sched/pipe benchmark...
# Executed 1000000 pipe operations between two processes

Total time: 12.233 [sec]

12.233170 usecs/op
81744 ops/sec

使用pipe()和socketpair()對測試影響:

1. perf bench sched messaging

# Running 'sched/messaging' benchmark:
# 20 sender and receiver processes per group
# 10 groups == 400 processes run

Total time: 0.176 [sec]

2. perf bench sched messaging -p

# Running 'sched/messaging' benchmark:
# 20 sender and receiver processes per group
# 10 groups == 400 processes run

Total time: 0.093 [sec]

可見socketpair()性能要明顯低于pipe()。

3.4.1.2 sched pipe評估pipe性能

sched pipe 從 Ingo Molnar 的 pipe-test-1m.c 移植而來。當初 Ingo 的原始程序是為了測試不同的調度器的性能和公平性的。

其工作原理很簡單,兩個進程互相通過 pipe 拼命地發(fā) 1000000 個整數(shù),進程 A 發(fā)給 B,同時 B 發(fā)給 A。因為 A 和 B 互相依賴,因此假如調度器不公平,對 A 比 B 好,那么 A 和 B 整體所需要的時間就會更長。

al@al-System-Product-Name:~/perf$ perf bench sched pipe
# Running 'sched/pipe' benchmark:
# Executed 1000000 pipe operations between two processes

Total time: 12.240 [sec]

12.240411 usecs/op
81696 ops/sec

3.4.2 perf bench mem all

該測試衡量 不同版本的memcpy/memset/ 函數(shù)處理一個 1M 數(shù)據(jù)的所花費的時間,轉換成吞吐率。

al@al-System-Product-Name:~/perf$ perf bench mem all
# Running mem/memcpy benchmark...
# function 'default' (Default memcpy() provided by glibc)
# Copying 1MB bytes ...

1.236155 GB/sec.

..

3.4.3 perf bench futex

Futex是一種用戶態(tài)和內核態(tài)混合機制,所以需要兩個部分合作完成,linux上提供了sys_futex系統(tǒng)調用,對進程競爭情況下的同步處理提供支持。

所有的futex同步操作都應該從用戶空間開始,首先創(chuàng)建一個futex同步變量,也就是位于共享內存的一個整型計數(shù)器。

當進程嘗試持有鎖或者要進入互斥區(qū)的時候,對futex執(zhí)行"down"操作,即原子性的給futex同步變量減1。如果同步變量變?yōu)?,則沒有競爭發(fā)生, 進程照常執(zhí)行。

如果同步變量是個負數(shù),則意味著有競爭發(fā)生,需要調用futex系統(tǒng)調用的futex_wait操作休眠當前進程。

當進程釋放鎖或 者要離開互斥區(qū)的時候,對futex進行"up"操作,即原子性的給futex同步變量加1。如果同步變量由0變成1,則沒有競爭發(fā)生,進程照常執(zhí)行。

如果加之前同步變量是負數(shù),則意味著有競爭發(fā)生,需要調用futex系統(tǒng)調用的futex_wake操作喚醒一個或者多個等待進程。

al@al-System-Product-Name:~/perf$ perf bench futex all
# Running futex/hash benchmark...
Run summary [PID 3806]: 5 threads, each operating on 1024 [private] futexes for 10 secs.

[thread 0] futexes: 0x4003d20 ... 0x4004d1c [ 4635648 ops/sec ]
[thread 1] futexes: 0x4004d30 ... 0x4005d2c [ 4611072 ops/sec ]
[thread 2] futexes: 0x4005e70 ... 0x4006e6c [ 4254515 ops/sec ]
[thread 3] futexes: 0x4006fb0 ... 0x4007fac [ 4559360 ops/sec ]
[thread 4] futexes: 0x40080f0 ... 0x40090ec [ 4636262 ops/sec ]

Averaged 4539371 operations/sec (+- 1.60%), total secs = 10

# Running futex/wake benchmark...
Run summary [PID 3806]: blocking on 5 threads (at [private] futex 0x96b52c), waking up 1 at a time.

[Run 1]: Wokeup 5 of 5 threads in 0.0270 ms
[Run 2]: Wokeup 5 of 5 threads in 0.0370 ms

...

3.4 perf record

運行一個命令,并將其數(shù)據(jù)保存到perf.data中。隨后,可以使用perf report進行分析。

perf record和perf report可以更精確的分析一個應用,perf record可以精確到函數(shù)級別。并且在函數(shù)里面混合顯示匯編語言和代碼。

創(chuàng)建一個fork.c文件用于測試:

#include <stdio.h>

void test_little(void)
{
  int i,j;

  for(i = 0; i < 30000000; i++) 
    j=i; 
}

void test_mdedium(void)
{
  int i,j;

  for(i = 0; i < 60000000; i++) 
    j=i; 
}

void test_high(void)
{
  int i,j;

  for(i = 0; i < 90000000; i++) 
    j=i; 
}

void test_hi(void)
{
  int i,j;

  for(i = 0; i < 120000000; i++) 
    j=i; 
}

int main(void)
{
  int i, pid, result;

  for(i = 0; i<2; i++) {
    result = fork();
    if(result>0)
      printf("i=%d parent parent=%d current=%d child=%d
", i, getppid(), getpid(), result);
    else
      printf("i=%d child parent=%d current=%d
", i, getppid(), getpid());

    if(i==0)
    {
      test_little();
      sleep(1);
    } else {
      test_mdedium();
      sleep(1);
    }
  }

  pid = wait(NULL);
  test_high();
  printf("pid=%d wait=%d
", getpid(), pid);
  sleep(1);
  pid = wait(NULL);
  test_hi();
  printf("pid=%d wait=%d
", getpid(), pid);
  return 0;
}

編譯fork.c文件gcc fork.c -o fork-g -O0,同時可以使用此方法分析是否選擇編譯優(yōu)化產(chǎn)生的結果。-g是只能callgraph功能,-O0是關閉優(yōu)化。

常用選項

-e record指定PMU事件
--filter event事件過濾器
-a 錄取所有CPU的事件
-p 錄取指定pid進程的事件
-o 指定錄取保存數(shù)據(jù)的文件名
-g 使能函數(shù)調用圖功能
-C 錄取指定CPU的事件

sudo perf record -a -g ./fork:會在當前目錄生成perf.data文件。

sudo perf report --call-graph none結果如下,后面結合perf timechart分析.

上圖看上去比較亂,如果想只看fork產(chǎn)生的信息:

sudo perf report --call-graph none -c fork

可以看出只顯示了fork程序的相關符號及其占用率。

3.5 perf report

解析perf record產(chǎn)生的數(shù)據(jù),并給出分析結果。

常用參數(shù):

-i 導入的數(shù)據(jù)文件名稱,如果沒有則默認為perf.data

-g 生成函數(shù)調用關系圖,此時內核要打開CONFIG_KALLSYMS;用戶空間庫或者執(zhí)行文件需要帶符號信息(not stripped),編譯選項需要加上-g。

--sort 從更高層面顯示分類統(tǒng)計信息,比如: pid, comm, dso, symbol, parent, cpu,socket, srcline, weight, local_weight.

執(zhí)行sudo perf report -i perf.data,可以看出main函數(shù)所占百分比,以及funcA和funcB分別所占百分比。

在funcB執(zhí)行過程中,還產(chǎn)生了apic timer,占用了一部分cpu資源。除此之外,占比基本上是1:10。

funcA和funcB的占比,基本符合預期。那么進入longa,分析一下熱點。

在C和匯編混合顯示界面,可以看出for循環(huán)占用了69.92%,j=i賦值占用了30.08%。

根據(jù)之上描述,可以看出top適合監(jiān)控整個系統(tǒng)的性能,stat比較適合單個程序的性能分析,record/report更適合對程序進行更細粒度的分析。

注意點:

在使用perf report -g的時候,可能會提示Failed to open /lib/libpthread-0.9.33.2.so, continuing without symbols。

這時候通過file xxx查看,如果提示xxxx stripped表示此文件不包含符號信息,需要xxxx not stripped文件。

3.6 perf timechart

perf timechart是將之前的各種統(tǒng)計信息圖形化的一個工具。

perf timechart record <option> <command>用于記錄整個系統(tǒng)或者一個應用的事件,還可以加option記錄指定類型的事件。

perf timechart用于將perf.data轉換成SVG格式的文件,SVG可以通過Inkscape或者瀏覽器打開。

perf timechart record可以指定特定類型的事件:

-P:記錄power相關事件

-T:記錄任務相關事件

-I:記錄io相關事件

-g:記錄函數(shù)調用關系

perf timechart用于將perf timechart record錄取的perf.data轉換成output.svg。

-w調整輸出的svg文件長度,可以查看更多細節(jié)。

-p可以指定只查看某些進程輸出,使用方式:sudo perf timechart -p test1 -p thermald

-o 指定輸出文件名

-i 指定待解析的文件名

-w 輸出SVG文件寬度

-P 只顯示power相關事件圖標

-T , --tasks-only 顯示task信息,不顯示處理器信息

-p 顯示指定進程名稱或者PID顯示

--symfs=<directory> 指定系統(tǒng)符號表路徑

-t, --topology 根據(jù)拓撲結構對CPU進行分類

--highlight=<duration_nsecs|task_name> 對運行超過特定時間的task高亮

當線程太多影響svg解析速度的時候,可以通過-p指定特定線程進行分析。如果需要幾個線程,每個線程采用-p xxx。

sudo perf timechart record -T ./fork && sudo perf timechart –p fork

結果如下,可以看到相關task的名稱,開始時間/結束時間,每個時間點的狀態(tài)(Running/Idle/Deeper Idle/Deepest Idle/Sleeping/Waiting for Cpu /Blocked on IO)。

3.6.1 結合perf timechart和perf report分析函數(shù)占比

由perf report可知test_little、test_medium、test_high、test_hi四個函數(shù)占比分別為3.84%、12.01%、22.99%、30.43%。

有代碼可知如果以test_little為1單位,那么test_medium就為2單位,test_high為3單位,test_hi為4單位。

四個函數(shù)執(zhí)行次數(shù)分別為2、4、4、4,所以四個函數(shù)每個單位對應CPU占比為:

test_little - 3.84%/2=1.9%

test_medium - 12.01%/4/2=1.5%

test_high - 22.99/4/3=1.9%

test_hi - 30.43%/4/4=1.9%

基本上符合預期。

記錄IO事件,可以看到按應用分類的,Disk/Network/Sync/Poll/Error信息。以及每個應用數(shù)據(jù)吞吐量。

sudo perf timechart record -I && sudo perf timechart -w 1800。

記錄Power狀態(tài)事件,可以看到不同之處在于Idle之類的狀態(tài)里面還有細分C/C2更詳細的顯示Power狀態(tài)。

sudo perf timechart record -I && sudo perf timechart -w 1800

3.7 perf script

用于讀取perf record保存的裸trace數(shù)據(jù)。

使用方法:

perf script [<options>]
perf script [<options>] record <script> [<record-options>] <command>
perf script [<options>] report <script> [script-args]
perf script [<options>] <script> <required-script-args> [<record-options>] <command>
perf script [<options>] <top-script> [script-args]
還可以編寫perl或者python腳本進行數(shù)據(jù)分析。

3.8 perf lock

3.8.1 perf lock內核配置

要使用此功能,內核需要編譯選項的支持:CONFIG_LOCKDEP、CONFIG_LOCK_STAT。

CONFIG_LOCKDEP defines acquired and release events.

CONFIG_LOCK_STAT defines contended and acquired lock events.

CONFIG_LOCKDEP=y

CONFIG_LOCK_STAT=y

3.8.2 perf lock使用

分析內核鎖統(tǒng)計信息。

鎖是內核用于同步的方法,一旦加了鎖,其他加鎖的內核執(zhí)行路徑就必須等待,降低了并行。同時,如果加鎖不正確還會造成死鎖。

因此對于內核鎖進行分析是一項重要的調優(yōu)工作。

perf lock record:抓取執(zhí)行命令的lock事件信息到perf.data中

perf lock report:產(chǎn)生統(tǒng)計報告

perf lock script:顯示原始lock事件

perf lock info:

-k <value>:sorting key,默認為acquired,還可以按contended、wait_total、wait_max和wait_min來排序。

Name:內核鎖的名字。

aquired:該鎖被直接獲得的次數(shù),因為沒有其它內核路徑占用該鎖,此時不用等待。

contended:該鎖等待后獲得的次數(shù),此時被其它內核路徑占用,需要等待。

total wait:為了獲得該鎖,總共的等待時間。

max wait:為了獲得該鎖,最大的等待時間。

min wait:為了獲得該鎖,最小的等待時間。

3.9 perf kmem

3.9.1 perf kmem介紹

perf kmem用于跟蹤測量內核slab分配器事件信息。
比如內存分配/釋放等。可以用來研究程序在哪里分配了大量內存,或者在什么地方產(chǎn)生碎片之類的和內存管理相關的問題。

perf kmem和perf lock實際上都是perf tracepoint的子類,等同于perf record -e kmem:*和perf record -e lock:*。

但是這些工具在內部隊員是數(shù)據(jù)進行了慧聰和分析,因此統(tǒng)計報表更具可讀性。

perf kmem record:抓取命令的內核slab分配器事件

perf kmem stat:生成內核slab分配器統(tǒng)計信息

選項:

--caller 顯示每個調用點統(tǒng)計信息

--alloc 顯示每次內存分配事件

-s <key[,key2...]>, --sort=<key[,key2...]>

Sort the output (default: frag,hit,bytes for slab and bytes,hit for page). Available sort keys are ptr, callsite, bytes, hit, pingpong, frag for slab and page, callsite, bytes, hit, order, migtype, gfp for page.
This option should be preceded by one of the mode selection options - i.e. --slab, --page, --alloc and/or --caller.

-l <num>, 只顯示固定行數(shù)

--raw-ip

Print raw ip instead of symbol

--slab 分析slab分配器事件

--page 分析頁分配事件

--live

Show live page stat. The perf kmem shows total allocation stat by default, but this option shows live (currently allocated) pages instead. (This option works with --page option only)

3.9.2 perf kmem使用

sudo perf kmem record ls

sudo perf kmem stat只顯示概要統(tǒng)計信息:

SUMMARY (SLAB allocator)
========================
Total bytes requested: 368,589
Total bytes allocated: 369,424
Total bytes wasted on internal fragmentation: 835
Internal fragmentation: 0.226028%
Cross CPU allocations: 0/2,256

sudo perf kmem --alloc --caller --slab stat顯示了更加詳細的分類信息:

---------------------------------------------------------------------------------------------------------
Callsite | Total_alloc/Per | Total_req/Per | Hit | Ping-pong | Frag
---------------------------------------------------------------------------------------------------------
proc_reg_open+32 | 64/64 | 40/40 | 1 | 0 | 37.500%
seq_open+34 | 384/192 | 272/136 | 2 | 0 | 29.167%
apparmor_file_alloc_security+5c | 608/32 | 456/24 | 19 | 1 | 25.000%
ext4_readdir+8bd | 64/64 | 48/48 | 1 | 0 | 25.000%
ext4_htree_store_dirent+3e | 896/68 | 770/59 | 13 | 0 | 14.062%
load_elf_phdrs+64 | 1024/512 | 896/448 | 2 | 0 | 12.500%
load_elf_binary+222 | 32/32 | 28/28 | 1 | 0 | 12.500%
anon_vma_prepare+11b | 1280/80 | 1152/72 | 16 | 0 | 10.000%
inotify_handle_event+75 | 73664/64 | 66758/58 | 1151 | 0 | 9.375%
do_execveat_common.isra.33+e5 | 2048/256 | 1920/240 | 8 | 1 | 6.250%
... | ... | ... | ... | ... | ...
---------------------------------------------------------------------------------------------------------

---------------------------------------------------------------------------------------------------------
Alloc Ptr | Total_alloc/Per | Total_req/Per | Hit | Ping-pong | Frag
---------------------------------------------------------------------------------------------------------
0xffff8800ca4d86c0 | 192/192 | 136/136 | 1 | 0 | 29.167%
0xffff8801ea05aa80 | 192/192 | 136/136 | 1 | 0 | 29.167%
0xffff8801f6ad6540 | 96/96 | 68/68 | 1 | 0 | 29.167%
0xffff8801f6ad6f00 | 96/96 | 68/68 | 1 | 0 | 29.167%
0xffff880214e65e80 | 96/32 | 72/24 | 3 | 0 | 25.000%
0xffff8801f45ddac0 | 64/64 | 48/48 | 1 | 0 | 25.000%
0xffff8800ac4093c0 | 32/32 | 24/24 | 1 | 1 | 25.000%
0xffff8800af5a4260 | 32/32 | 24/24 | 1 | 0 | 25.000%
0xffff880214e651e0 | 32/32 | 24/24 | 1 | 0 | 25.000%
0xffff880214e65220 | 32/32 | 24/24 | 1 | 0 | 25.000%
0xffff880214e654e0 | 32/32 | 24/24 | 1 | 0 | 25.000%
---------------------------------------------------------------------------------------------------------

SUMMARY (SLAB allocator)
========================
Total bytes requested: 409,260
Total bytes allocated: 417,008
Total bytes wasted on internal fragmentation: 7,748
Internal fragmentation: 1.857998%
Cross CPU allocations: 0/2,833

該報告有三個部分:根據(jù) Callsite 顯示的部分,所謂 Callsite 即內核代碼中調用 kmalloc 和 kfree 的地方。

比如上圖中的函數(shù)proc_reg_open,Hit 欄為 1,表示該函數(shù)在 record 期間一共調用了 kmalloc 一次。

對于第一行 Total_alloc/Per 顯示為 1024/1024,第一個值 1024 表示函數(shù) proc_reg_open 總共分配的內存大小,Per 表示平均值。

比較有趣的兩個參數(shù)是 Ping-pong 和 Frag。Frag 比較容易理解,即內部碎片。雖然相對于 Buddy System,Slab 正是要解決內部碎片問題,但 slab 依然存在內部碎片,比如一個 cache 的大小為 1024,但需要分配的數(shù)據(jù)結構大小為 1022,那么有 2 個字節(jié)成為碎片。Frag 即碎片的比例。

Ping-pong 是一種現(xiàn)象,在多 CPU 系統(tǒng)中,多個 CPU 共享的內存會出現(xiàn)”乒乓現(xiàn)象”。一個 CPU 分配內存,其他 CPU 可能訪問該內存對象,也可能最終由另外一個 CPU 釋放該內存對象。而在多 CPU 系統(tǒng)中,L1 cache 是 per CPU 的,CPU2 修改了內存,那么其他的 CPU 的 cache 都必須更新,這對于性能是一個損失。Perf kmem 在 kfree 事件中判斷 CPU 號,如果和 kmalloc 時的不同,則視為一次 ping-pong,理想的情況下 ping-pong 越小越好。Ibm developerworks 上有一篇講述 oprofile 的文章,其中關于 cache 的調優(yōu)可以作為很好的參考資料。

Callsite:內核代碼中調用kmalloc和kfree的地方。

Total_alloc/Per:總共分配的內存大小,平均每次分配的內存大小。

Total_req/Per:總共請求的內存大小,平均每次請求的內存大小。

Hit:調用的次數(shù)。

Ping-pong:kmalloc和kfree不被同一個CPU執(zhí)行時的次數(shù),這會導致cache效率降低。

Frag:碎片所占的百分比,碎片 = 分配的內存 - 請求的內存,這部分是浪費的。

有使用--alloc選項,還會看到Alloc Ptr,即所分配內存的地址。

后面則有根據(jù)被調用地點的顯示方式的部分。

最后一個部分是匯總數(shù)據(jù),顯示總的分配的內存和碎片情況,Cross CPU allocation 即 ping-pong 的匯總。

要分析--page事件,需要在record的時候加上--page選項。sudo perf kmem record --page ls,使用sudo perf kmem stat --page查看結果:

0xee318 [0x8]: failed to process type: 68
error during process events: -22

3.10 perf sched

perf sched專門用于跟蹤/測量調度器,包括延時等。

perf sched record <command>:錄制測試過程中的調度事件

perf sched latency:報告線程調度延時和其他調度相關屬性

perf sched script:查看執(zhí)行過程中詳細的trace信息

perf sched replay:回放perf sched record錄制的執(zhí)行過程

perf sched map:用字符表示打印上下文切換

執(zhí)行sudo perf sched record ls后,通過不同方式查看結果。

sudo perf sched latency,可以看到ls進程的Average delay/Maximum delay時間。各個 column 的含義如下: Task: 進程的名字和 pid Runtime: 實際運行時間 Switches: 進程切換的次數(shù) Average delay: 平均的調度延遲 Maximum delay: 最大延遲

這里最值得人們關注的是 Maximum delay,一般從這里可以看到對交互性影響最大的特性:調度延遲,如果調度延遲比較大,那么用戶就會感受到視頻或者音頻斷斷續(xù)續(xù)的。

-----------------------------------------------------------------------------------------------------------------
Task | Runtime ms | Switches | Average delay ms | Maximum delay ms | Maximum delay at |
-----------------------------------------------------------------------------------------------------------------
/usr/bin/termin:2511 | 0.163 ms | 1 | avg: 0.019 ms | max: 0.019 ms | max at: 5398.723467 s
ls:7806 | 1.175 ms | 1 | avg: 0.017 ms | max: 0.017 ms | max at: 5398.722333 s
kworker/u12:3:7064 | 0.029 ms | 1 | avg: 0.011 ms | max: 0.011 ms | max at: 5398.723434 s
migration/4:27 | 0.000 ms | 1 | avg: 0.007 ms | max: 0.007 ms | max at: 5398.722575 s
perf:7801 | 1.256 ms | 1 | avg: 0.002 ms | max: 0.002 ms | max at: 5398.723509 s
-----------------------------------------------------------------------------------------------------------------
TOTAL: | 2.623 ms | 5 |
---------------------------------------------------

sudo perf sched script能看到更詳細的sched信息,包括sched_wakeup/sched_switch等等。每一列的含義依次是:進程名/pid/CPU ID/時間戳。

perf 7801 [002] 5398.722314: sched:sched_stat_sleep: comm=perf pid=7806 delay=110095391 [ns]
perf 7801 [002] 5398.722316: sched:sched_wakeup: comm=perf pid=7806 prio=120 target_cpu=004
swapper 0 [004] 5398.722328: sched:sched_stat_wait: comm=perf pid=7806 delay=0 [ns]
swapper 0 [004] 5398.722333: sched:sched_switch: prev_comm=swapper/4 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=perf next_pid=7806 next_prio=120
perf 7801 [002] 5398.722363: sched:sched_stat_runtime: comm=perf pid=7801 runtime=1255788 [ns] vruntime=3027478102 [ns]
perf 7801 [002] 5398.722364: sched:sched_switch: prev_comm=perf prev_pid=7801 prev_prio=120 prev_state=S ==> next_comm=swapper/2 next_pid=0 next_prio=120
perf 7806 [004] 5398.722568: sched:sched_wakeup: comm=migration/4 pid=27 prio=0 target_cpu=004
perf 7806 [004] 5398.722571: sched:sched_stat_runtime: comm=perf pid=7806 runtime=254732 [ns] vruntime=1979611107 [ns]
perf 7806 [004] 5398.722575: sched:sched_switch: prev_comm=perf prev_pid=7806 prev_prio=120 prev_state=R+ ==> next_comm=migration/4 next_pid=27 next_prio=0
migration/4 27 [004] 5398.722582: sched:sched_stat_wait: comm=perf pid=7806 delay=13914 [ns]
migration/4 27 [004] 5398.722586: sched:sched_migrate_task: comm=perf pid=7806 prio=120 orig_cpu=4 dest_cpu=2
swapper 0 [002] 5398.722595: sched:sched_stat_wait: comm=perf pid=7806 delay=0 [ns]
swapper 0 [002] 5398.722596: sched:sched_switch: prev_comm=swapper/2 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=perf next_pid=7806 next_prio=120
migration/4 27 [004] 5398.722611: sched:sched_switch: prev_comm=migration/4 prev_pid=27 prev_prio=0 prev_state=S ==> next_comm=swapper/4 next_pid=0 next_prio=120
ls 7806 [002] 5398.723421: sched:sched_stat_sleep: comm=kworker/u12:3 pid=7064 delay=1226675 [ns]
ls 7806 [002] 5398.723423: sched:sched_wakeup: comm=kworker/u12:3 pid=7064 prio=120 target_cpu=003
swapper 0 [003] 5398.723432: sched:sched_stat_wait: comm=kworker/u12:3 pid=7064 delay=0 [ns]
swapper 0 [003] 5398.723434: sched:sched_switch: prev_comm=swapper/3 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=kworker/u12:3 next_pid=7064 next_prio=120
kworker/u12:3 7064 [003] 5398.723441: sched:sched_stat_sleep: comm=/usr/bin/termin pid=2511 delay=80833386 [ns]
kworker/u12:3 7064 [003] 5398.723447: sched:sched_wakeup: comm=/usr/bin/termin pid=2511 prio=120 target_cpu=004
kworker/u12:3 7064 [003] 5398.723449: sched:sched_stat_runtime: comm=kworker/u12:3 pid=7064 runtime=29315 [ns] vruntime=846439549943 [ns]
kworker/u12:3 7064 [003] 5398.723451: sched:sched_switch: prev_comm=kworker/u12:3 prev_pid=7064 prev_prio=120 prev_state=S ==> next_comm=swapper/3 next_pid=0 next_prio=120
swapper 0 [004] 5398.723462: sched:sched_stat_wait: comm=/usr/bin/termin pid=2511 delay=0 [ns]
swapper 0 [004] 5398.723466: sched:sched_switch: prev_comm=swapper/4 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=/usr/bin/termin next_pid=2511 next_prio=120
ls 7806 [002] 5398.723503: sched:sched_migrate_task: comm=perf pid=7801 prio=120 orig_cpu=2 dest_cpu=3
ls 7806 [002] 5398.723505: sched:sched_stat_sleep: comm=perf pid=7801 delay=1142537 [ns]
ls 7806 [002] 5398.723506: sched:sched_wakeup: comm=perf pid=7801 prio=120 target_cpu=003
ls 7806 [002] 5398.723508: sched:sched_stat_runtime: comm=ls pid=7806 runtime=920005 [ns] vruntime=3028398107 [ns]
swapper 0 [003] 5398.723508: sched:sched_stat_wait: comm=perf pid=7801 delay=0 [ns]
swapper 0 [003] 5398.723508: sched:sched_switch: prev_comm=swapper/3 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=perf next_pid=7801 next_prio=120
ls 7806 [002] 5398.723510: sched:sched_switch: prev_comm=ls prev_pid=7806 prev_prio=120 prev_state=x ==> next_comm=swapper/2 next_pid=0 next_prio=120
/usr/bin/termin 2511 [004] 5398.723605: sched:sched_stat_runtime: comm=/usr/bin/termin pid=2511 runtime=162720 [ns] vruntime=191386139371 [ns]
/usr/bin/termin 2511 [004] 5398.723611: sched:sched_switch: prev_comm=/usr/bin/termin prev_pid=2511 prev_prio=120 prev_state=S ==> next_comm=swapper/4 next_pid=0 next_prio=120

sudo perf sched map的好處在于提供了一個的總的視圖,將成百上千的調度事件進行總結,顯示了系統(tǒng)任務在 CPU 之間的分布,假如有不好的調度遷移,比如一個任務沒有被及時遷移到 idle 的 CPU 卻被遷移到其他忙碌的 CPU,類似這種調度器的問題可以從 map 的報告中一眼看出來。

星號表示調度事件發(fā)生所在的 CPU。

點號表示該 CPU 正在 IDLE。

*A0 5398.722333 secs A0 => perf:7806
*. A0 5398.722365 secs . => swapper:0
. *B0 5398.722575 secs B0 => migration/4:27
*A0 B0 5398.722597 secs
A0 *. 5398.722611 secs
A0 *C0 . 5398.723434 secs C0 => kworker/u12:3:7064
A0 *. . 5398.723451 secs
A0 . *D0 5398.723467 secs D0 => /usr/bin/termin:2511
A0 *E0 D0 5398.723509 secs E0 => perf:7801
*. E0 D0 5398.723510 secs
. E0 *. 5398.723612 secs

perf sched replay 這個工具更是專門為調度器開發(fā)人員所設計,它試圖重放 perf.data 文件中所記錄的調度場景。很多情況下,一般用戶假如發(fā)現(xiàn)調度器的奇怪行為,他們也無法準確說明發(fā)生該情形的場景,或者一些測試場景不容易再次重現(xiàn),或者僅僅是出于“偷懶”的目的,使用 perf replay,perf 將模擬 perf.data 中的場景,無需開發(fā)人員花費很多的時間去重現(xiàn)過去,這尤其利于調試過程,因為需要一而再,再而三地重復新的修改是否能改善原始的調度場景所發(fā)現(xiàn)的問題。

run measurement overhead: 166 nsecs
sleep measurement overhead: 52177 nsecs
the run test took 999975 nsecs
the sleep test took 1064623 nsecs
nr_run_events: 11
nr_sleep_events: 581
nr_wakeup_events: 5
task 0 ( swapper: 0), nr_events: 11
task 1 ( swapper: 1), nr_events: 1
task 2 ( swapper: 2), nr_events: 1
task 3 ( kthreadd: 3), nr_events: 1
...
task 563 ( kthreadd: 7509), nr_events: 1
task 564 ( bash: 7751), nr_events: 1
task 565 ( man: 7762), nr_events: 1
task 566 ( kthreadd: 7789), nr_events: 1
task 567 ( bash: 7800), nr_events: 1
task 568 ( sudo: 7801), nr_events: 4
task 569 ( perf: 7806), nr_events: 8
------------------------------------------------------------
#1 : 25.887, ravg: 25.89, cpu: 1919.68 / 1919.68
#2 : 27.994, ravg: 26.10, cpu: 2887.76 / 2016.49
#3 : 26.403, ravg: 26.13, cpu: 2976.09 / 2112.45
#4 : 29.400, ravg: 26.46, cpu: 1015.01 / 2002.70
#5 : 26.750, ravg: 26.49, cpu: 2942.80 / 2096.71
#6 : 27.647, ravg: 26.60, cpu: 3087.37 / 2195.78
#7 : 31.405, ravg: 27.08, cpu: 2762.43 / 2252.44
#8 : 23.770, ravg: 26.75, cpu: 2172.55 / 2244.45
#9 : 26.952, ravg: 26.77, cpu: 2794.93 / 2299.50
#10 : 30.904, ravg: 27.18, cpu: 973.26 / 2166.88

3.11 perf probe

Need to find vmlinux XXXXXXXXXXXXXXXXXX

可以自定義探測點。

Define new dynamic tracepoints.

使用例子

(1) Display which lines in schedule() can be probed

# perf probe --line schedule

前面有行號的可以探測,沒有行號的就不行了。

(2) Add a probe on schedule() function 12th line.

# perf probe -a schedule:12

在schedule函數(shù)的12處增加一個探測點。

3.14 perf trace

perf trace類似于strace,但增加了其他系統(tǒng)事件的分析,比如pagefaults、task lifetime事件、scheduling事件等。

下面的命令可以查看系統(tǒng)中已經(jīng)安裝的腳本:

 # perf trace -l 
    List of available trace scripts: 
      syscall-counts [comm]                system-wide syscall counts 
      syscall-counts-by-pid [comm]         system-wide syscall counts, by pid 
      failed-syscalls-by-pid [comm]        system-wide failed syscalls, by pid 

比如 failed-syscalls 腳本,執(zhí)行的效果如下:

 # perf trace record failed-syscalls 
    ^C[ perf record: Woken up 11 times to write data ]                         
    [ perf record: Captured and wrote 1.939 MB perf.data (~84709 samples) ]   

 perf trace report failed-syscalls 
    perf trace started with Perl script  
	 /root/libexec/perf-core/scripts/perl/failed-syscalls.pl 

    failed syscalls, by comm: 

    comm                    # errors 
    --------------------  ---------- 
    firefox                     1721 
    claws-mail                   149 
    konsole                       99 
    X                             77 
    emacs                         56 
    [...] 

    failed syscalls, by syscall: 

    syscall                           # errors 
    ------------------------------  ---------- 
    sys_read                              2042 
    sys_futex                              130 
    sys_mmap_pgoff                          71 
    sys_access                              33 
    sys_stat64                               5 
    sys_inotify_add_watch                    4 
    [...]

該報表分別按進程和按系統(tǒng)調用顯示失敗的次數(shù)。非常簡單明了,而如果通過普通的 perf record 加 perf report 命令,則需要自己手工或者編寫腳本來統(tǒng)計這些數(shù)字。

4. perf擴展應用

4.1 Flame Graph

FlameGraph是

1.抓取perf信息并轉換

perf record -F 99 -a -g -- sleep 60
perf script > out.perf
./stackcollapse-perf.pl out.perf > out.folded
./flamegraph.pl out.kern_folded > kernel.svg

5. 參考資料

系統(tǒng)級性能分析工具 — Perf:http://blog.csdn.net/zhangskd/article/details/37902159/

linux perf - 性能測試和優(yōu)化工具:http://www.cnblogs.com/hushaojun/p/4848269.html

Linux下的內核測試工具——perf使用簡介:http://www.blogjava.net/qileilove/archive/2013/09/04/403646.html

Perf -- Linux下的系統(tǒng)性能調優(yōu)工具,第 1 部分:http://www.ibm.com/developerworks/cn/linux/l-cn-perf1/

Perf -- Linux下的系統(tǒng)性能調優(yōu)工具,第 2 部分:https://www.ibm.com/developerworks/cn/linux/l-cn-perf2/

性能分析工具---Perf簡介匯總整理:http://sanwen.net/a/nzsrvoo.html

總結

以上是生活随笔為你收集整理的系统级性能分析工具perf的介绍与使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。

69精品在线观看 | 狠狠ri| 日韩高清免费无专码区 | 在线视频观看成人 | 婷婷丁香七月 | av在线小说 | 精品国产三级a∨在线欧美 免费一级片在线观看 | 中文在线天堂资源 | 97视频免费在线看 | 黄色免费观看网址 | 一级淫片a| 中文字幕91在线 | 91视频黄色| 91桃色视频| 成人免费在线播放 | 五月婷婷中文 | 黄色片亚洲 | 激情丁香在线 | av不卡中文字幕 | 亚洲精品乱码久久久久久按摩 | 国产日本三级 | 亚洲黄色成人网 | 欧美国产日韩在线视频 | 亚洲欧洲在线视频 | 久久电影日韩 | 久草影视在线 | 一区二区三区在线观看中文字幕 | 在线观看黄网站 | 欧美a级一区二区 | 免费视频xnxx com | 午夜成人免费影院 | 国产精品手机视频 | 91精品国产乱码 | www九九热| 日韩特黄一级欧美毛片特黄 | www激情网| 日韩av网站在线播放 | 青草视频网 | 国产精品大片 | 久久久高清一区二区三区 | 免费看片日韩 | 欧美视频在线观看免费网址 | 伊人天堂久久 | 天天综合人人 | 在线观看免费 | 丁香久久激情 | 久久成人午夜视频 | 国产精品久久久久国产精品日日 | 日日天天狠狠 | 久久久一本精品99久久精品 | 亚洲综合在线视频 | 91九色最新| 中文字幕有码在线观看 | 成人手机在线视频 | 中文字幕视频一区 | 91桃色国产在线播放 | 国产黄在线观看 | 国产欧美中文字幕 | 久久久人| 国产成人无码AⅤ片在线观 日韩av不卡在线 | 国产成人福利在线观看 | 97福利| 麻豆久久久 | 欧美成人亚洲成人 | 久久dvd | 国产91精品看黄网站在线观看动漫 | 久久久高清免费视频 | 久久综合九色综合欧美狠狠 | 国产韩国日本高清视频 | 丝袜少妇在线 | www天天操 | 四虎国产精品免费观看视频优播 | 亚洲第一区精品 | 久久精品这里热有精品 | 久久国产女人 | 超碰在线最新网址 | 久久久久久久久久久国产精品 | 国产亚洲婷婷免费 | 久久久高清视频 | 一级c片| 久久精品看片 | 婷婷六月综合网 | 99爱国产精品 | av高清影院| 一区二区欧美日韩 | 久久99精品久久久久久秒播蜜臀 | 欧美日韩国产色综合一二三四 | 天天综合在线观看 | 国产综合小视频 | 91在线看片 | 中文字幕日韩av | 久久免费精品一区二区三区 | 在线视频黄 | 国产又黄又硬又爽 | 国产五月天婷婷 | 91亚洲精品国产 | 97成人精品视频在线播放 | 91亚洲在线 | 久久午夜精品影院一区 | 人人狠狠综合久久亚洲 | 69亚洲乱| 久草国产在线观看 | 亚洲h在线播放在线观看h | 国产馆在线播放 | 四虎永久免费 | 最近中文字幕第一页 | 久久免费片| 69国产精品视频免费观看 | av在线官网 | 在线 国产 日韩 | 天天操天天干天天玩 | 免费在线观看不卡av | 欧美福利视频 | 成人av电影免费观看 | 久草在线免费看视频 | 六月天综合网 | 久草视频在线看 | 日韩精品一区电影 | 国产精品久久久久免费观看 | 91成人欧美| 久久免费视频这里只有精品 | 久久久久久久国产精品影院 | 狠狠的干狠狠的操 | www.色com| 午夜在线观看影院 | 国产精品理论片在线播放 | 99re在线视频观看 | 狠狠狠色丁香婷婷综合久久88 | 日韩大片免费观看 | 亚a在线 | 国产专区精品视频 | 99热精品免费观看 | 伊人天天综合 | 成人网444ppp | 中文不卡视频在线 | 国产精品一区二区免费 | 色5月婷婷 | 色播六月天 | 欧美最猛性xxx | 亚洲精品字幕在线 | 在线免费观看黄色小说 | 东方av免费在线观看 | 在线97| 国产在线不卡一区 | 久久精品欧美一 | 黄网av在线 | 美女国内精品自产拍在线播放 | 亚洲美女精品视频 | 日韩二区三区在线 | 久久久久麻豆v国产 | 久久国产精品二国产精品中国洋人 | 久草热视频 | 在线亚洲精品 | 五月情婷婷 | 99精品视频在线免费观看 | 91免费视频网站在线观看 | wwxxx日本| 国产精品99久久久久人中文网介绍 | 最新不卡av| 丁香花中文在线免费观看 | 伊人狠狠色 | 国产字幕在线观看 | 国产做a爱一级久久 | 日韩黄色一级电影 | 激情偷乱人伦小说视频在线观看 | 国产在线播放一区二区三区 | 午夜久久久久久久 | 国产午夜精品理论片在线 | 久久亚洲福利 | av免费高清观看 | 午夜精品成人一区二区三区 | 青青久草在线 | 国产精品自拍在线 | 久久久久久久久黄色 | 久久综合精品一区 | 日本中文字幕观看 | 免费a网 | 波多野结衣一区二区三区中文字幕 | 国产三级在线播放 | 天天操比 | 成人亚洲精品国产www | 在线播放一区二区三区 | 911亚洲精品第一 | 亚洲精品乱码久久久久久蜜桃欧美 | 日韩av片无码一区二区不卡电影 | 婷婷六月色 | 国产91亚洲精品 | 久久久麻豆 | 欧美日韩伦理一区 | 亚洲精品国精品久久99热一 | 国产日产精品久久久久快鸭 | 人人干天天射 | 久草视频视频在线播放 | 热久久免费国产视频 | 久久久国产网站 | 日韩一区二区免费视频 | 欧美精品在线观看一区 | 精品婷婷 | 国产剧在线观看片 | 最新真实国产在线视频 | 精品久久久久久久 | 日韩精品视频一二三 | 黄色免费高清视频 | 狠狠色综合网站久久久久久久 | 亚洲成人精品 | 国产中文a | 欧美极品xxx | 视频二区在线 | 深夜男人影院 | 国产精品欧美久久久久无广告 | 中文字幕人成乱码在线观看 | 91天天操| 国产伦精品一区二区三区在线 | 九草在线视频 | 国产精品一区二区你懂的 | 在线观看成人av | 国产成人精品免高潮在线观看 | 在线观看日韩精品视频 | 国产日产精品一区二区三区四区 | 免费av的网站 | 91桃色国产在线播放 | 狠狠插狠狠干 | 九月婷婷综合网 | 在线观看mv的中文字幕网站 | 美女av电影 | 福利片免费看 | 久久久久福利视频 | 国产精品一区二区三区免费视频 | 免费男女网站 | 美女视频国产 | 亚洲日本va中文字幕 | 九九精品视频在线观看 | 999成人精品 | 久草在在线视频 | 久久精品视频在线播放 | 日韩在线精品一区 | 亚洲国产精品99久久久久久久久 | 蜜桃视频在线观看一区 | 人人爽爽人人 | 91看片在线观看 | 免费a视频 | 亚洲综合一区二区精品导航 | 欧产日产国产69 | 亚洲精品美女久久久久网站 | 国产精品18videosex性欧美 | 欧美日韩免费观看一区=区三区 | 国产福利免费在线观看 | 激情欧美一区二区免费视频 | 久草在线免费资源站 | 一区二区在线影院 | 九九久久电影 | 黄色a一级视频 | 亚洲一区二区三区精品在线观看 | 免费在线观看成人 | 成人中文字幕在线观看 | 国产一区二区在线精品 | 久久色网站 | 在线观看黄色的网站 | 99久久这里只有精品 | 麻豆高清免费国产一区 | 99免在线观看免费视频高清 | 久久女教师| 欧美大片在线观看一区 | 日韩免费观看高清 | 天天综合天天做 | 亚洲在线激情 | 久久久综合九色合综国产精品 | 色噜噜狠狠狠狠色综合久不 | 美女福利视频网 | 一区二区影视 | 国产一区成人 | 精品国产乱子伦一区二区 | 精品专区一区二区 | 麻豆视传媒官网免费观看 | 亚洲视频分类 | 国产美女主播精品一区二区三区 | 黄色av网站在线观看免费 | 国产视频在线一区二区 | 日韩电影中文字幕 | 日韩av高清 | 亚洲另类xxxx | 99精品欧美一区二区三区黑人哦 | 国产成人61精品免费看片 | 国产无套精品久久久久久 | 九色最新网址 | 91欧美精品 | www.久久免费 | 中文字幕在线看人 | 五月天婷婷在线观看视频 | 国产一级片一区二区三区 | 人人爽人人爱 | 久久久www免费电影网 | 久精品在线观看 | 日日躁天天躁 | 91chinese在线 | 国产成人三级三级三级97 | 美女精品网站 | 亚洲精品在线观看中文字幕 | 国产在线视频导航 | 午夜久久影视 | 午夜12点 | 久久夜色精品亚洲噜噜国4 午夜视频在线观看欧美 | 懂色av懂色av粉嫩av分享吧 | 公开超碰在线 | 最新日韩精品 | 欧美 激情 国产 91 在线 | 免费视频一区二区 | 九色琪琪久久综合网天天 | 黄色网址在线播放 | 中文字幕在线视频国产 | 日本在线视频一区二区三区 | 亚洲精品在线资源 | 久久av网 | 国产又粗又硬又爽的视频 | 国产精品麻豆免费版 | 色五月情| 久久久久久久久免费视频 | 亚洲欧美精品一区二区 | 人人爱人人爽 | 久久国产精品免费 | 91中文字幕在线 | 国内精品久久久久影院优 | 日韩av在线看 | 中文字幕一区二 | 天天干人人 | 狠狠色综合欧美激情 | 国产精品aⅴ | a黄色一级片| 久久久久综合精品福利啪啪 | www.狠狠 | 亚洲狠狠操 | 成年人免费看片网站 | 国产无遮挡猛进猛出免费软件 | 国外调教视频网站 | 超级碰碰免费视频 | 久久成电影 | 99久久久久久久久 | 国产精品区免费视频 | 免费成视频 | 久久精品中文字幕免费mv | 91精品国产99久久久久久红楼 | 在线观看岛国片 | a级片在线播放 | 麻豆视频国产在线观看 | 日日摸日日爽 | 久久久亚洲国产精品麻豆综合天堂 | 色99导航| 久草在线久草在线2 | 亚洲综合色网站 | 成年人网站免费在线观看 | 国内久久久久久 | 欧美日韩视频一区二区 | 日韩电影久久 | 午夜三级影院 | 亚洲永久精品国产 | 99视频精品免费观看, | 夜夜躁日日躁狠狠久久88av | 久久精品xxx| www.日韩免费 | 久久久久久看片 | 美女视频久久黄 | 日韩精品视频在线免费观看 | 久久99婷婷 | 国产 日韩 欧美 在线 | 国产精品男女 | 久久激情精品 | 久久99精品久久久久婷婷 | 国产一级91 | 欧美淫视频 | 人人看看人人 | 亚洲精品小视频在线观看 | 激情综合网五月激情 | 在线看国产日韩 | 人人超碰人人 | 精品欧美一区二区在线观看 | 免费观看日韩 | 国产xvideos免费视频播放 | 亚洲成av人片 | 国产成人在线精品 | 在线免费视频你懂的 | 337p西西人体大胆瓣开下部 | 综合婷婷 | 91一区啪爱嗯打偷拍欧美 | 探花视频免费观看 | 在线免费黄色片 | 免费午夜av | 成人免费观看网站 | 欧女人精69xxxxxx | 国产成人精品一区二区 | 久久蜜臀一区二区三区av | 99精品欧美一区二区 | 日韩免费不卡av | 黄色免费看片网站 | 久久99精品久久久久婷婷 | 又黄又爽又色无遮挡免费 | 日韩欧美精品在线观看视频 | 91九色老| 五月天久久精品 | 日日夜夜人人精品 | 狠狠成人| 园产精品久久久久久久7电影 | 久精品视频| 一区二区三区免费看 | 久久99国产精品自在自在app | 国产精品久久久久久久久久久久久久 | 色婷婷久久 | 天天摸天天舔 | 亚洲二区精品 | 美国av片在线观看 | 在线不卡中文字幕播放 | 日韩免费电影 | 日韩精品一区二区三区免费视频观看 | 夜夜狠狠 | 夜夜操综合网 | 黄色大全在线观看 | 日韩大片在线播放 | 精品久久亚洲 | 99久热在线精品视频观看 | 成人午夜在线观看 | 亚洲人成精品久久久久 | 久久一线| 亚州精品天堂中文字幕 | 亚洲国产日本 | 久久综合五月天 | 丁香激情综合国产 | av一区二区三区在线 | 国产麻豆果冻传媒在线观看 | 黄色亚洲大片免费在线观看 | 久久久久久久电影 | 国产精品va在线观看入 | 成人av电影免费在线播放 | 亚洲黄色成人 | 91在线精品一区二区 | 国产一区在线视频播放 | 欧美性色综合 | 亚洲精品成人在线 | 亚洲女人天堂成人av在线 | 久色免费视频 | 日日草视频 | 黄色小网站在线观看 | 五月天.com| 探花视频在线观看+在线播放 | 久久久久久久久久久久久影院 | 在线观看亚洲精品视频 | 久久99视频精品 | 91漂亮少妇露脸在线播放 | 右手影院亚洲欧美 | 午夜精品久久久久久久久久 | 91久久国产自产拍夜夜嗨 | 久久精品国产亚洲精品 | 国产精品久久伊人 | 国产成人在线精品 | 成人av教育 | 国产一卡二卡在线 | 91禁在线看 | 综合色综合色 | 婷婷色综合 | 一区二区三区福利 | 久久人人爽人人片 | 91av在线免费看 | 成人免费观看大片 | 在线 视频 一区二区 | 亚洲五月婷 | 日韩在线中文字幕视频 | av在线看网站| 免费中文字幕在线观看 | 二区视频在线观看 | 成人影片免费 | 奇米影视四色8888 | 精品久久电影 | 婷婷色综合色 | 日韩精品一区二区在线观看视频 | 国产三级视频 | 国产69久久 | 天天操欧美 | 国产精品久久久久久久免费 | 久久99精品久久久久久秒播蜜臀 | 激情久久久久久久久久久久久久久久 | 日韩午夜剧场 | 成 人 黄 色 免费播放 | 国产精品va在线观看入 | 欧美韩国日本在线 | 在线观看国产成人av片 | 亚洲天堂网视频在线观看 | 欧美另类xxx | 成人av片在线观看 | 成人一区二区三区在线 | 欧美日韩在线视频观看 | 免费看片在线观看 | 国产精品一区二区久久精品爱微奶 | 亚洲伦理电影在线 | 久久久久久久免费观看 | 日韩午夜三级 | 国产 一区二区三区 在线 | 亚洲一区二区三区91 | av在线影视 | 欧洲精品视频一区二区 | a黄色一级| 国产第一页在线播放 | 国产精品一二 | 久久国产免 | 色av男人的天堂免费在线 | 久久精品99国产精品酒店日本 | 成人午夜影院在线观看 | 国产色拍拍拍拍在线精品 | 四虎成人精品永久免费av | 国产一区免费在线 | 国产香蕉久久精品综合网 | 日韩免费一区二区 | 久久激情五月婷婷 | 一区二区视频在线看 | 国语精品免费视频 | 国产精品亚洲片在线播放 | www.av免费观看 | 欧美在线视频二区 | av高清一区二区三区 | 久久久久亚洲精品男人的天堂 | 日本一区二区高清不卡 | 久久久亚洲网站 | 日韩免费网址 | 91视频xxxx| 亚洲精品免费在线观看 | 色网站中文字幕 | 久久五月婷婷丁香社区 | 中国一级片在线观看 | 91精品久久香蕉国产线看观看 | 日韩精品免费一区 | 成人av影院在线观看 | 国产一区二区手机在线观看 | 久久av福利 | 六月久久婷婷 | 99r精品视频在线观看 | 在线观看v片 | 最近乱久中文字幕 | 狠狠的日日| 国产精品wwwwww | 亚洲午夜精品电影 | 亚洲 成人 欧美 | 99热国内精品 | 香蕉久久久久久av成人 | 九色porny真实丨国产18 | 色先锋av资源中文字幕 | 国产成人精品一区在线 | 欧美日韩国产在线观看 | av观看在线观看 | 国产精品美女久久久久久2018 | 国产精品久久99综合免费观看尤物 | 免费在线观看av片 | 国产99区 | 亚洲免费专区 | 性色视频在线 | 亚洲精品美女在线 | 91九色精品 | 人人搞人人搞 | 日韩中文字幕国产精品 | 午夜精品一区二区三区在线播放 | 粉嫩av一区二区三区免费 | 一区二区三区视频网站 | 激情一区二区三区欧美 | 国产精品一区二区 91 | 一区二区视频免费在线观看 | 黄色成年 | wwwwww国产 | 色欧美88888久久久久久影院 | 国产又粗又猛又色 | 国产日韩欧美视频在线观看 | 国产精品 中文字幕 亚洲 欧美 | 超碰精品在线 | 一区二区三区日韩视频在线观看 | 国产高清在线a视频大全 | 天天操天天色天天 | 亚洲伦理一区二区 | 99综合久久 | 91精品黄色| 久久草在线精品 | 免费色视频网址 | 夜夜视频 | 在线天堂中文www视软件 | 青青草国产精品视频 | 中文字幕av在线 | 欧美另类亚洲 | 成人wwwxxx视频| 国产精品69av | 97国产情侣爱久久免费观看 | 久久不射电影院 | 一区二区三区在线观看中文字幕 | 在线欧美日韩 | 日韩在线精品一区 | 一级大片在线观看 | 999久久久| 婷婷激情久久 | 久久激情视频 久久 | 国产女做a爱免费视频 | 激情视频一区二区 | 中文字幕精品三级久久久 | 国产流白浆高潮在线观看 | 亚洲永久精品国产 | 黄色特一级片 | a久久久久久 | 久久久久成 | 麻豆国产露脸在线观看 | 精品久久片 | 亚洲视频 一区 | 国产美女久久久 | 日韩av在线资源 | 成人h视频在线 | av网站免费线看精品 | 国产精品久久久久久久久久免费看 | 亚洲理论在线观看 | 欧美成人亚洲 | 99爱在线观看 | 久久久黄色免费网站 | 久久露脸国产精品 | 天天射色综合 | 中文字幕一区二区三区久久蜜桃 | 91天堂在线观看 | 婷婷色网视频在线播放 | 成人免费看片网址 | 99精品国产视频 | 免费三及片 | 婷婷五月色综合 | 日韩色在线观看 | 国产一区精品在线观看 | 麻豆一区在线观看 | 国产精品高清一区二区三区 | 又黄又爽又无遮挡的视频 | 国产免费三级在线观看 | 亚洲第一区在线播放 | 免费av网址在线观看 | 久草视频在线新免费 | 2021av在线 | 久草在线资源免费 | 久久精品999| 久艹在线免费观看 | 久久久久久国产一区二区三区 | 国产小视频在线免费观看 | 手机在线欧美 | av久久在线 | 美女在线观看网站 | 久久人人爽人人爽人人片av软件 | 国产一级一片免费播放放a 一区二区三区国产欧美 | 中文字幕在线有码 | 亚洲精品成人在线 | 狠狠干狠狠艹 | 欧美色黄 | 欧美a级在线 | 尤物九九久久国产精品的分类 | 亚洲人在线视频 | 狠狠色噜噜狠狠狠合久 | 奇米网8888| 99久久精品免费视频 | 91精品对白一区国产伦 | 午夜精品久久久久 | 国产精品网站一区二区三区 | 黄色三级久久 | 国产人免费人成免费视频 | 久久97久久 | 亚洲综合在线五月天 | 五月天激情综合网 | 天天插天天操天天干 | 婷婷六月天综合 | 麻豆成人在线观看 | 91久久国产综合精品女同国语 | 成人黄色在线播放 | 国产五月 | 五月婷婷丁香六月 | 国产精品不卡在线播放 | 久久高清精品 | 99久久免费看 | 麻豆免费视频网站 | 国产精品18久久久久久久网站 | 91精品电影 | 久久久鲁| 91看片看淫黄大片 | 午夜视频不卡 | 国产高清视频在线免费观看 | 免费毛片一区二区三区久久久 | 精品久久久久久久久久久院品网 | 精品国产理论片 | 亚洲国产精品视频 | 中文字幕在线观看第二页 | 日本不卡一区二区三区在线观看 | 国产精品久久久久一区 | 毛片网站在线 | 99国内精品久久久久久久 | 中文字幕成人网 | 91成年视频 | 日操操 | wwwwww黄| 久久夜视频 | 日韩中文字幕在线不卡 | 蜜臀久久99精品久久久久久网站 | 精品国产伦一区二区三区免费 | 日韩欧美国产精品 | 日韩欧美网址 | 久久99国产精品二区护士 | 久久黄色片 | 九九热免费视频在线观看 | 日韩激情三级 | 成人在线免费看 | 久久久这里有精品 | 中文字幕永久 | 国产清纯在线 | 欧美少妇的秘密 | 五月天亚洲综合 | 操久久网| 黄色在线免费观看网址 | 98超碰在线 | www.com操| av观看免费在线 | 国产精久久 | 伊人影院99 | 久久国产精品一二三区 | av 一区二区三区四区 | av网站在线观看免费 | 婷婷视频在线观看 | 国产精品亚洲精品 | 日韩一二三 | 国产破处视频在线播放 | 综合网中文字幕 | 黄色一级片视频 | 国产成人99久久亚洲综合精品 | 久久99亚洲网美利坚合众国 | 亚洲久草网 | 一级α片| 精品国产成人av | 日韩小视频网站 | 日韩欧美高清在线 | 久久综合免费视频 | 开心激情网五月天 | 欧美一区二区视频97 | 久久久久久久久黄色 | 中文字幕一区二区三区四区视频 | 五月天久久久 | 日韩国产精品一区 | 亚洲午夜精品在线观看 | 在线观看 国产 | 日韩欧美精品在线观看视频 | av福利电影 | 狠狠狠狠狠狠干 | 超碰在线最新网址 | 欧美日韩高清在线观看 | 亚洲理论在线 | 精品二区久久 | 日韩在线高清视频 | 国产成人精品一区二区三区在线观看 | 国产精品久久艹 | 免费看一级特黄a大片 | 高清在线一区二区 | 日本中文字幕在线播放 | 国产一级免费在线 | 夜夜爽88888免费视频4848 | 免费日韩 精品中文字幕视频在线 | 中文字幕不卡在线88 | 欧美午夜a| 激情网在线视频 | 国产一级大片在线观看 | 91在线精品一区二区 | 午夜视频亚洲 | 日日躁你夜夜躁你av蜜 | 不卡的av在线播放 | 成人xxxx| 伊人va| 在线免费观看视频一区 | 久草新在线 | 亚洲视频专区在线 | a视频在线观看免费 | 午夜123| 成年人在线免费看 | 久久精彩视频 | 99久久精品国产欧美主题曲 | 国产高清成人av | 欧美性生活免费看 | 欧美日韩精品在线播放 | 在线亚洲成人 | 国产a视频免费观看 | 一级黄色大片 | 久草新在线 | 成人在线网站观看 | 碰超在线观看 | 欧美激情视频一区二区三区免费 | 亚洲精品视频在线观看免费视频 | 久久久久久国产精品亚洲78 | 欧美黑人性猛交 | 三上悠亚一区二区在线观看 | 欧美一级淫片videoshd | 天堂av在线中文在线 | 亚洲国产成人久久 | 天天操夜夜想 | 国产资源中文字幕 | 9ⅰ精品久久久久久久久中文字幕 | 日韩av在线资源 | 黄色精品网站 | 在线视频观看亚洲 | 欧洲性视频 | 国产精品一区在线播放 | 91超国产| 一区二区三区四区五区在线 | 日韩精品综合在线 | 伊人官网 | 亚洲精品一区二区久 | 81精品国产乱码久久久久久 | 日韩精品一区二区三区免费观看视频 | 亚洲精品一区二区三区新线路 | 国产精品嫩草影院9 | 国产一区精品在线 | a黄色片 | 国产精品二区在线观看 | 国产免费观看av | 在线观看网站你懂的 | 91精品国| 婷婷色六月天 | 在线三级av| 国产黄色免费 | 中文字幕日韩精品有码视频 | 国产精品久久久 | 免费观看黄| 日本高清中文字幕有码在线 | 国产精品大片免费观看 | 国产精品刺激对白麻豆99 | 国产精品久久久久久久久免费看 | www.综合网.com| 免费国产在线观看 | 黄色的网站免费看 | 丁五月婷婷 | 日日日干| 日韩精品免费一区二区在线观看 | 麻豆免费视频网站 | 日韩视频a| 亚洲在线观看av | 热99久久精品 | 欧美大片第1页 | 国产精品久久电影观看 | 免费观看不卡av | 久久观看 | 99精品视频在线观看 | 日日碰狠狠添天天爽超碰97久久 | 91av在线免费看 | 美女黄频免费 | 精壮的侍卫呻吟h | 国产精品麻豆一区二区三区 | 亚洲色图美腿丝袜 | 日韩三级精品 | 波多野结衣视频一区二区 | 欧美日韩不卡在线观看 | 国产日女人 | 91九色蝌蚪国产 | 成人h视频 | 色综合久久五月 | 最新黄色av网址 | 亚洲mv大片欧洲mv大片免费 | 国产黄色大片免费看 | 二区三区在线观看 | 国产午夜三级一二三区 | 国产精品综合av一区二区国产馆 | 久热超碰 | 一区二区三区在线播放 | 91九色在线观看视频 | 香蕉视频免费在线播放 | 日韩精品高清不卡 | 成人在线免费av | 成人日批视频 | 99久久久国产精品免费99 | 日韩av在线资源 | 欧美日韩免费观看一区=区三区 | 97av在线 | 日韩理论电影网 | 97免费公开视频 | 91资源在线视频 | 九九九视频精品 | 国产成人精品亚洲a | 一区二区三区精品在线视频 | 国产美女无遮挡永久免费 | 99在线国产 | 波多在线视频 | 黄在线| 国产福利91精品一区二区三区 | av在线播放一区二区三区 | 亚洲精品国产片 | 超碰午夜 | 中文字幕电影一区 | 尤物九九久久国产精品的分类 | 麻豆传媒视频在线播放 | 日韩国产精品久久久久久亚洲 | 国产精品一区二区久久久 | 日韩免费中文 | 久久国产香蕉视频 | 久草国产在线观看 | 久久精品中文字幕少妇 | 日韩极品在线 | 久久丁香 | 伊人中文在线 | 欧美激情视频三区 | 免费在线观看av网站 | 在线观看视频 | 欧美成年网站 | 丁香九月婷婷综合 | 人人澡人人澡人人 | 天天摸天天干天天操天天射 | 中文字幕a在线 | 欧美大片www | 久久久久久久久毛片精品 | 欧美污在线观看 | 成年人视频在线免费播放 | 中文字幕在线观看网址 | 欧美日韩免费在线观看视频 | 不卡av免费在线观看 | 精品久久片 | 99热在线观看 | 欧美国产日韩激情 | 高清一区二区三区av | 欧美在线观看视频一区二区 | 欧美性粗大hdvideo | 丁香六月婷婷激情 | japanesexxxxfreehd乱熟 | 美女又爽又黄 | 亚州精品天堂中文字幕 | 蜜臀av性久久久久蜜臀aⅴ四虎 | 狠狠色狠狠色综合系列 | 日本三级中文字幕在线观看 | 国产专区在线视频 | 久久尤物电影视频在线观看 | 18性欧美xxxⅹ性满足 | 午夜影院在线观看18 | 精品福利视频在线观看 | 97激情影院 | 天天干,天天射,天天操,天天摸 | 91高清视频免费 | 欧美日韩中文国产一区发布 | 日韩区欠美精品av视频 | 精品久久九九 | 免费情趣视频 | 在线观看色网站 | 国产九色91 | 亚洲天天做 | 深夜免费小视频 | 91 中文字幕| 欧美午夜剧场 | 99久久99久久精品免费 | 日本中文字幕在线观看 | 亚洲japanese制服美女 | 婷婷新五月 | 国产在线观看你懂的 | 日韩a在线看| 国产精品久久久久永久免费看 | 国产小视频免费观看 | 在线亚洲欧美视频 | 国语精品免费视频 | 最近免费中文字幕大全高清10 | 免费av观看| 亚洲精品欧美专区 | 五月天综合激情网 | 国产亚洲成av人片在线观看桃 | 91香蕉国产在线观看软件 | 99热最新 | 成人黄色在线观看视频 | 久久精品草 | 国产精品九九久久久久久久 | 久久久精品福利视频 | 91精品国产电影 | 日韩网站免费观看 | 日韩欧美一区二区不卡 | 色天天 | 天天久久综合 | 天天色天天射天天干 | 在线免费观看麻豆 | 亚洲一区二区三区在线看 | 韩国av免费看 | 手机av在线免费观看 | 天天插一插| 欧美日本一区 | 少妇18xxxx性xxxx片 | 久久综合免费视频影院 | 伊人黄 | 激情黄色av | 免费人成在线观看 | 亚洲人成网站精品片在线观看 | 九九在线播放 | 香蕉影视在线观看 | 91丨九色丨丝袜 | 成人毛片在线观看视频 | 麻花豆传媒mv在线观看网站 | 视频91在线 | 日韩国产精品毛片 | 国色天香在线观看 | 久久激情综合 | 深爱激情五月综合 | 精品国产福利在线 | 成人影视免费看 | 久久综合成人 | 成人黄色av免费在线观看 | 天天操天天插 | 色狠狠一区二区 | 成人中文字幕在线观看 | 二区三区在线 | 精品国产成人 | 日韩精品中文字幕在线 | 日韩有码在线观看视频 |