当前位置:首页 >> 资讯

系统性能数据分析从入门到进阶

来源:资讯   2023年03月05日 12:15

le 护航有数 blk - 相同到/proc/stat 外头的 procs_blocked, 阻塞在 I/O 的护航有数

实际上和 loadavg 无法事物分野, 只是 load 狭隘了 runnable 和 D 状激发态, 同时 load 运用于 1/5/15 分钟的针对性, 而 dstat 可以运用于更加缘组织内, 如果只看某一时长点用 load, 如果要推论长时长的变动运用于 dstat (/proc/stat)。

#dstat -tp

--system-- ---procs---

time |run blk new

07-03 17:56:50|204 1.0 202

07-03 17:56:51|212 0 238

07-03 17:56:52|346 1.0 266

07-03 17:56:53|279 5.0 262

07-03 17:56:54|435 7.0 177

07-03 17:56:55|442 3.0 251

07-03 17:56:56|792 8.0 419

07-03 17:56:57|504 16 152

07-03 17:56:58|547 3.0 156

07-03 17:56:59|606 2.0 212

07-03 17:57:00|770 0 186

线程

这里主要注意线程容量上都, 不注意访存的稳定性。

Utilization. 线程运用于量 Saturation. 这里主要考察线程重复运用于迭代的效率

简单的线程运用于量用 free 下达:

total - MemTotal + SwapTotal, 一般来时说 MemTotal 不会略少于真实的电学线程 free - 未运用于的线程. Linux 排斥于内存更加多多肽接以降高于稳定性, 所以不用简通过 free 来判断线程确实欠缺 buff/cache - 系统不会内存, 一般不只能严密区分 buffer 和 cache available - 估计的可用电学线程一般来说 used - 等于 total - free - buffers - cache Swap - 该本微电脑上未配置

#free -g

total used free shared buff/cache available

Mem: 503 193 7 2 301 301

Swap: 0 0 0

更加详缘的文档可以必要去读过/proc/meminfo:

#cat /proc/meminfo

MemTotal: 527624224 kB

MemFree: 8177852 kB

MemAvailable: 316023388 kB

Buffers: 23920716 kB

Cached: 275403332 kB

SwapCached: 0 kB

Active: 59079772 kB

Inactive: 431064908 kB

Active(anon): 1593580 kB

Inactive(anon): 191649352 kB

Active(file): 57486192 kB

Inactive(file): 239415556 kB

Unevictable: 249700 kB

Mlocked: 249700 kB

SwapTotal: 0 kB

SwapFree: 0 kB

[...]

再之后来看下线程重复运用于方面的文档, sar 的有数据资料主要从/proc/vmstat 挖掘造出, 主要注意:

pgscank/pgscand - 分别相同 kswapd/direct 线程重复运用于时追踪的 page 有数 pgsteal - 重复运用于的 page 有数 %vmeff - pgsteal/(pgscank+pgscand)

要明白这些有数据资料的具体章节含义, 只能对线程行政迭代有一定知晓, 比如这里的 pgscan/pgsteal 只是针对inactive list而言的, 在线程重复运用于的时候可能不会还只能再之后行把多肽接从 active list 搬家到 inactive list 等. 如果这里有精神长时间, 我们可以再之后行把这想到为入口, 再之后慢慢有系统不会, 具体章节到这里的%vmeff, 最好上述情况就是每个追踪的 page 都能重复运用于, 也就是 vmeff 越好高越好好。

#sar -B 1

11:00:16 AM pgscank/s pgscand/s pgsteal/s %vmeff

11:00:17 AM 0.00 0.00 3591.00 0.00

11:00:18 AM 0.00 0.00 10313.00 0.00

11:00:19 AM 0.00 0.00 8452.00 0.00

I/O

存储 I/O 的 USE 模型:

Utilization. SRAM的运用于量, 单位时长内装置在两解决问题 I/O 劝告的时长 Saturation. 缓冲区弧度

我们一般注意这些均:

%util - 运用于量. 注意即使达到 100%的 util, 也不代表装置无法稳定性余量了, 数值得注意地以前的 SSD 盘在表面上都赞成并发. 打个比方, 一家旅馆有 10 间房, 每天只要有 1 个小房间搬进, util 就是 100%。 svctm - 上新版 iostat 早已删掉 await/r_await/w_await - I/O 推迟, 则有搭车时长 avgrq-sz - 平均 request size, 劝告两解决问题时长和一般来说有一定亲密关系, 也就是时说线性 argqu-sz - 评估 queue size, 可以用来判断确实有积压 rMB/s, wMB/s, r/s, w/s - 大体上语句

人力组织内

当我们判断人力确实是瓶颈的时候, 只看系统不会层次的人力是实在的, 比如可以用 htop 看下每个 CPU 的运用于量, 再之后度目标护航直通在多种不同 CPU 上的稳定性可能不会相比之下不小。

线程也有完全相同上述情况, 直通 numastat -m

Node 0 Node 1 Node 2 Node 3

--------- --------- --------- ---------

MemTotal 31511.92 32255.18 32255.18 32255.18

MemFree 2738.79 131.89 806.50 10352.02

MemUsed 28773.12 32123.29 31448.69 21903.16

Active 7580.58 419.80 9597.45 5780.64

Inactive 17081.27 26844.28 19806.99 13504.79

Active(anon) 6.63 0.93 2.08 5.64

Inactive(anon) 12635.75 25560.53 12754.29 9053.80

Active(file) 7573.95 418.87 9595.37 5775.00

Inactive(file) 4445.52 1283.75 7052.70 4450.98

系统不会也就是时说就是电学本机, 如果电子产品飞驰在 cgroup, 那么这个 cgroup 是更加只能注意的系统不会, 比如在空闲系统不会上制订如下下达:

#mkdir /sys/fs/cgroup/cpuset/overloaded

#echo 0-1> /sys/fs/cgroup/cpuset/cpuset.cpus

#echo 0> /sys/fs/cgroup/cpuset/cpuset.mems

#echo $$

#for i in {0..1023}; do /tmp/busy Company done

此时从电学本机层次看, 系统不会的 load 较低, 但是因为 cpuset 的限制, 竞争者制约在 cpu 0 和 1 上, 对直通在其他 cpu 上的电子产品受到影响并不大。

#uptime

14:10:54 up 6 days, 18:52, 10 users, load average: 920.92, 411.61, 166.95

系统设计角度看

系统不会人力和系统设计的稳定性不必要有某种关连, 但是也可以更加必要地从系统设计的角度看造出发定位难题:

系统设计能运用于多少人力, 而不是系统不会借助了多少人力, 这外头不必要有gap, 系统不会是个狭隘的术语, 而系统设计本身却一般来时说具体章节. 以右边cpuset为例, 电学本机是个系统不会, cpuset行政的人力也可以成为系统不会, 但是系统设计在cpuset外头还是外头是明确的。 系统设计对人力的效益, 即使系统不会人力再之后多, 系统设计用不上稳定性也上不去, 也就是系统不会可能不会打趣, 而是系统设计本身的可能。

以请注意的myserv为例, 它的4个线程%cpu都达到了100, 这个时候再之后去分析分析方法整个系统不会的load什么用两处不大, 系统不会有再之后多的空闲cpu对myserv来时说早已无法含义。

#pidstat -p 在在pgrep myserv在在 -t 1

15:47:05 UID TGID TID %usr %system %guest %CPU CPU Command

15:47:06 0 71942 - 415.00 0.00 0.00 415.00 22 myserv

15:47:06 0 - 71942 0.00 0.00 0.00 0.00 22 |_myserv

15:47:06 0 - 72079 7.00 94.00 0.00 101.00 21 |_myserv

15:47:06 0 - 72080 10.00 90.00 0.00 100.00 19 |_myserv

15:47:06 0 - 72081 9.00 91.00 0.00 100.00 35 |_myserv

15:47:06 0 - 72082 5.00 95.00 0.00 100.00 29 |_myserv

完全相同于下达

大体上下达

大体上下达一般用来读过取内核里记录的各种粗略估计文档, 数值得注意是/proc请注意的各种档案, 这里简单列举均:

top - 借助了交互种系统不会和batch种系统不会, 不带参有数进入交互种系统不会, 按下h键可以碰到各种功能 ps - 借助了各种参有数查阅系统不会里护航的状激发态, 比如ps aux或者ps -eLf, 很多参有数可以在只能的时候查阅双摘要 free - 线程文档 iostat - I/O稳定性 pidstat - 查阅发挥作用方面的文档, 右边早已解说过 mpstat - 可以查阅单独cpu的运用于量, softirq, hardirq个有数等 vmstat - 可以查阅虚拟线程及各种系统不会文档 netstat - 互联方面 dstat - 可以查阅cpu/disk/mem/net等各种文档, 这些stat下达哪个不便用哪个 htop - 右边解说过 irqstat - 不便推论里断文档 sar/tsar/ssar - 搜罗和查阅系统不会直通的各种发展史文档, 也借助可视种系统不会

这里举个ps的举例来时说, 我们监视mysqld增值, 当该发挥作用运用于的线程最多系统不会线程70%的时候, 通过gdb初始化jemalloc的malloc_stats_print函有数来分析分析方法可能不会的线程销毁。

largest=70

while :; do

mem=$(ps -p 在在pidof mysqld在在 -o %mem | tail -1)

imem=$(printf %.0f $mem)

if [ $imem -gt $largest ]; then

echo 'p malloc_stats_print(0,0,0)' | gdb --quiet -nx -p 在在pidof mysqld在在

fi

sleep 10

done

perf

perf是稳定性分析分析方法的必备大体上功能, 它最核心的能力是能会面显卡上的Performance Monitor Unit (PMU), 对分析分析方法CPU bound的难题很有努力, 当然perf也赞成各种软件event. perf的主要能力则有:

通过抽样找到两解决问题程序热点 通过显卡PMU有系统不会分析分析方法难题的因由, 数值得注意是配合显卡上的最佳化

perf list可以列造出赞成的event, 我们可以通过perf来借助cache misses, cycles等等。

#perf list | grep Hardware

branch-misses [Hardware event]

bus-cycles [Hardware event]

cache-misses [Hardware event]

cache-references [Hardware event]

cpu-cycles OR cycles [Hardware event]

instructions [Hardware event]

L1-dcache-load-misses [Hardware cache event]

L1-dcache-loads [Hardware cache event]

L1-dcache-store-misses [Hardware cache event]

L1-dcache-stores [Hardware cache event]

L1-icache-load-misses [Hardware cache event]

L1-icache-loads [Hardware cache event]

branch-load-misses [Hardware cache event]

branch-loads [Hardware cache event]

dTLB-load-misses [Hardware cache event]

iTLB-load-misses [Hardware cache event]

mem:[/len][:access] [Hardware breakpoint]

perf运用于的时候一般不会传入不限参有数:

通过-e原则上感兴趣的一个或多个event 原则上抽样的适用范围, 比如发挥作用层次 (-p), 线程层次 (-t), cpu层次 (-C), 系统不会层次 (-a)

这里运用于普通用户的event看下发挥作用31925的制订上述情况. 一个相当重要的文档是insns per cycle (IPC), 也就是每个cycle能制订多少指令, 其他pmu event像cache misses, branch misses如果有难题再之后度都不会再现到IPC上. 虽然无法一个明确的规格, 但是请注意0.09的IPC是相当高于的, 有必要之后有系统不会。

#perf stat -p 31925 sleep 1

Performance counter stats for process id '31925':

2184.986720 task-clock (msec) # 2.180 CPUs utilized

3,210 context-switches # 0.001 M/sec

345 cpu-migrations # 0.158 K/sec

0 page-faults # 0.000 K/sec

4,311,798,055 cycles # 1.973 GHz

stalled-cycles-frontend

stalled-cycles-backend

409,465,681 instructions # 0.09 insns per cycle

branches

8,680,257 branch-misses # 0.00% of all branches

1.002506001 seconds time elapsed

除了stat外, perf另一个可能不会更加完全相同于的方式将是抽样来明确两解决问题程序的热点, 以前有如下两解决问题程序:

void busy(long us) {

struct timeval tv1, tv2;

long delta = 0;

gettimeofday(Companytv1, NULL);

do {

gettimeofday(Companytv2, NULL);

delta = (tv2.tv_sec - tv1.tv_sec) * 1000000 + tv2.tv_usec - tv1.tv_usec;

} while (delta

}

void A() { busy(2000); }

void B() { busy(8000); }

int main() {

while (1) {

A(); B();

}

return 0;

}

函有数A和B制订时长的%, perf的抽样结果和我们期望的2:8大体上一致。

#perf record -g -e cycles ./a.out

#perf report

Samples: 27K of event 'cycles', Event count (approx.): 14381317911

Children Self Command Shared Object Symbol

+ 99.99% 0.00% a.out [unknown] [.] 0x0000fffffb925137

+ 99.99% 0.00% a.out a.out [.] _start

+ 99.99% 0.00% a.out libc-2.17.so [.] _libc_start_main

+ 99.99% 0.00% a.out a.out [.] main

+ 99.06% 25.95% a.out a.out [.] busy

+ 79.98% 0.00% a.out a.out [.] B

- 71.31% 71.31% a.out [vdso] [.] _kernel_gettimeofday

_kernel_gettimeofday

- busy

+ 79.84% B

+ 20.16% A

+ 20.01% 0.00% a.out a.out [.] A

strace

trace一般来时说于抽样最大的战术上在于精度, trace能抓住每次操控, 这给有数据资料两解决问题和明白加剧不小不便. strace专供用来trace系统不会初始化。

strace通过猎捕所有的系统不会初始化能短时间内努力明白系统设计的某些行为, 这里运用于strace来看下右边时说明的perf-record的构建, 很较易找到系统不会初始化perf_event_open以及它的参有数, 因为有128个cpu, 针对每个cpu都不会初始化一次该系统不会初始化。

#strace -v perf record -g -e cycles ./a.out

perf_event_open({type=PERF_TYPE_HARDWARE, size=PERF_ATTR_SIZE_VER5, config=PERF_COUNT_HW_CPU_CYCLES, sample_freq=4000, sample_type=PERF_SAMPLE_IP|PERF_SAMPLE_TID|PERF_SAMPLE_TIME|PERF_SAMPLE_CALLCHAIN|PERF_SAMPLE_PERIOD, read_format=0, disabled=1, inherit=1, pinned=0, exclusive=0, exclusive_user=0, exclude_kernel=0, exclude_hv=0, exclude_idle=0, mmap=1, comm=1, freq=1, inherit_stat=0, enable_on_exec=1, task=1, watermark=0, precise_ip=0 /* arbitrary skid */, mmap_data=0, sample_id_all=1, exclude_host=0, exclude_guest=1, exclude_callchain_kernel=0, exclude_callchain_user=0, mmap2=1, comm_exec=1, use_clockid=0, context_switch=0, write_backward=0, namespaces=0, wakeup_events=0, config1=0, config2=0, sample_regs_user=0, sample_regs_intr=0, aux_watermark=0, sample_max_stack=0}, 51876, 25, -1, PERF_FLAG_FD_CLOEXEC) = 30

blktrace

iostat因为组织内太粗有的时候并不用很好地定位难题, blktrace通过跟踪每个I/O, 并在I/O的关键逆时针施工现场, 可以获得更加精确的文档, 从而找来分析分析方法难题. blktrace封装了几个下达:

blktrace: 搜罗 blkparse: 两解决问题 btt: 强劲大的分析分析方法大体上功能 btrace: blktrace/blkparse的一个简单封装, 约等于blktrace -d /dev/sda -o - | blkparse -i -

简单看下blktrace的可用, 外头记录了I/O逆时针上的关键文档, 数值得注意地:

时长碰, 稳定性分析分析方法的关键文档之一 event, 第6列, 相同到I/O逆时针上的举例来时说, 具体章节相同亲密关系可以搜索相应双摘要或GCC, 明白这些举例来时说是有数据资料两解决问题I/O稳定性的必要精神力 I/O sector. I/O劝告相同的扇区和一般来说

$ sudo btrace /dev/sda

8,0 0 1 0.000000000 1024 A WS 302266328 + 8

8,0 0 2 0.000001654 1024 Q WS 302266328 + 8 [jbd2/sda5-8]

8,0 0 3 0.000010042 1024 G WS 302266328 + 8 [jbd2/sda5-8]

8,0 0 4 0.000011605 1024 P N [jbd2/sda5-8]

8,0 0 5 0.000014993 1024 I WS 302266328 + 8 [jbd2/sda5-8]

8,0 0 0 0.000018026 0 m N cfq1024SN / insert_request

8,0 0 0 0.000019598 0 m N cfq1024SN / add_to_rr

8,0 0 6 0.000022546 1024 U N [jbd2/sda5-8] 1

这是btt的一个可用, 可以碰到S2G的个有数和推迟, 正常上述情况不应该再之后次造出现这个难题, 这样就找到了一条可以有系统不会的下落。

$ sudo blktrace -d /dev/sdb -w 5

$ blkparse sdb -d sdb.bin

$ btt -i sdb.bin

==================== All Devices ====================

ALL MIN AVG MAX N

--------- ------- ------- ------- -------

Q2Q 0.000000001 0.000014397 0.008275391 347303

Q2G 0.000000499 0.000071615 0.010518692 347298

S2G 0.000128160 0.002107990 0.010517875 11512

G2I 0.000000600 0.000001570 0.000040010 347298

I2D 0.000000395 0.000000929 0.000003743 347298

D2C 0.000116199 0.000144157 0.008443855 347288

Q2C 0.000118211 0.000218273 0.010678657 347288

==================== Device Overhead ====================

DEV | Q2G G2I Q2M I2D D2C

------ | ----- ----- ----- ----- -----

( 8, 16) | 32.8106% 0.7191% 0.0000% 0.4256% 66.0447%

------ | ----- ----- ----- ----- -----

Overall | 32.8106% 0.7191% 0.0000% 0.4256% 66.0447%

进阶篇

的大学教材

通过入门能够系统不会地知晓一门课的全貌, 网上搜到的大均稳定性分析分析方法的入门都是基于Raj Jain的The Art of Computer Systems Performance Analysis, 这本文中外头主要则有几个均:

Part I: AN OVERVIEW OF PERFORMANCE EVALUATION Part II: MEASUREMENT TECHNIQUES AND TOOLS Part III: PROBABILITY THEORY AND STATISTICS Part IV: EXPERIMENTAL DESIGN AND ANALYSIS Part V: SIMULATION Part VI: QUEUEING MODELS

文中的重心放在performance analysis右边, 涉及并不多概率和粗略估计的算造出, 另外rice的大学的这个入门写得挺极好[1]。

关键技术博客

参考;也[2]有时长可以都过一遍, 总的来时说主要则有3个均: 稳定性分析分析方法的分析方法集. 经典之作 USE分析方法 稳定性有数据资料的搜集. 经典之作 "大体上功能大平面图" 稳定性有数据资料的数据解决问题. 经典之作 火焰平面图 ;也多肽接[3] ;也多肽接[4] ;也多肽接[5]

知识结构

系统不会稳定性分析分析方法在极深度和体悟上都有决定, 对中下层则有OS和显卡, 以及一些通用能力要想到充分极深, 对最上层电子产品的明白又只能有充分的体悟, 据统计一年在混阳亲双手摸过的电子产品估计不出二十款, 当然课题分析分析方法过的只有几个。

内核不会

内核不会是系统不会分析分析方法的基础, 不管是I/O, 线程, 互联, 配置, docker等等都离不开内核不会, 内核不会知识可以从Understanding the Linux Kernel开始, 这本文中虽然据闻了但不妨碍明白OS的大体上术语, 慢慢想到能阅读过内核文档和GCC。

在适配某款armSDK的时候找到, 在numa off的上述意味着:

ecs绑上在socket 0上稳定性好 mysql绑上在socket 1上稳定性好

能明确的是, 该SDK横跨socket稳定性会面不管是latency还是throughput和本地会面都有更大差距, 所以一个恰当的正向是横跨socket的线程会面, 如果有完全相同x86 pcm的话不会相当必要, 但是该SDK上欠缺该类pmu来查阅横跨socket的文档, 我们想法从OS的角度看来问到这个难题。

首再之后行通过将线程压测大体上功能飞驰在多种不同的socket/node上, 找到numa off平庸造出了和numa on相同的稳定性特征, 和显卡造成核实该SDKnuma off和on的实以前显卡上并无法分野, 只是bios不传递numa文档给内核不会, 这样是可以真的电学地址在哪个socket/node上的。

接下来只要明确ecs/mysql的电学线程左边, 就可以用于判断稳定性和横跨socket的方面性. Linux在使用者激发态可以通过pagemap将虚拟地址相同到电学地址, 只只能稍加重写tools/vm/page-types.c就能拿到发挥作用相同的所有电学地址. 经核实, 确实ecs/mysql的稳定性和它们运用于的电学线程的左边强劲方面。就此要问到的是为什么ecs和mysql平庸恰好相反, 注意到ecs运用于hugepage而mysql运用于normal page, 有如下举例, 具体章节示例这里不再之后列造出。

系统不会启动的时候, 电学线程加到伙伴系统不会是再之后行socket 0后socket 1 socket 1上的线程不会被再之后行分造出来, 所以mysql分摊的线程在socket 1. 特定战略性的本微电脑不一切都是胡乱飞驰其他发挥作用 在ecs的host上, 因为要分摊的hugepage早已最多了socket 1上的所有线程, 所以后面分摊的hugepage早已落到了socket 0 hugepage的分摊是后进再之后行造出, 意味着ecs一开始分摊到的hugepage在socket 0, 而该本微电脑人力并没有人全部用完, 检验用的几个ecs线程全落到了socket 0上, 所以将ecs发挥作用绑上到socket 0的稳定性更加多

显卡知识

如果以前是x86架构, 事情不会简单很多, 一是x86的知识大家小时候从前了, 多多少少都知晓一些, 二是架构变动一般来时说比更大, 各种系统设计都适配较好, 只能调优的用例较少. 随着各种上新SDK的霸主, 它们稳定性各异, 对整个系统不会稳定性加剧的震荡是不小的, 这不是受到影响某个电子产品, 这受到影响的完全是所有电子产品. 最大体上地, 我们要两解决问题不限难题:

原先SDK上, 系统设计原有的很多举例被打破, 只能重上新适配, 否则稳定性可能不会不及预期. 比如在Intel右边, 开关numa的稳定性差距不大, 在其他SDK上可能不会就不一样 原先SDK要代替据闻的SDK, 就共存稳定性的相当. 由于SDK稳定性差异大并且差异点多, 虽然speccpu之类的benchmark能一定相对重排SDK整体的算造出稳定性, 但很多时候还只能联结多种不同故事情节分别展开稳定性调优 不排除上新SDK共存某种bug或者未知的feature, 都只能我们去摸索解决的必要

有数据资料分析分析方法

在搜罗了大量有数据资料后, 经过有数据资料分析分析方法可以可视有数据资料的实用性

有数据资料提炼造出. 借助各种大体上功能比如awk/sed/perl等脚本语言提炼造出所需的有数据资料 有数据资料抽象. 从多种不同角度看原材料有数据资料, 识别精神长时间, 比如单本机/战略性分别是什么平庸, 粗略估计哪些数值 数据解决问题. 数据解决问题是有数据资料两解决问题十分重要的能力, 一平面图负千言, 火焰平面图就是最好的举例来时说. 完全相同于画平面图大体上功能有gnuplot, excel等

比如分析分析方法MapReduce护航在10台本微电脑的战略性上的稳定性, 即使每台本微电脑都体现造出一定的共性, 但是如果从战略性大不相同的话则愈发数值得注意, 也很较易的测试这种共性。

换种显示方式将则愈发数值得注意, 很较易真的在多种不同阶段性的平庸, 比如正常Map和Reduce阶段性cpu运用于量也只有80%, 这个确实符合预期, 另外在Map和Reduce切换的时候, 系统不会idle很数值得注意, 不会不一切都是是潜在最佳化点。

如果有对照的话, 可以准确地看得只见多种不同平庸, 数值得注意是不小的长尾时长有进一步最佳化的密闭。

Benchmarking

Benchmarking是借助稳定性指标最大体上的双手段, 也是检验完全相同于的分析方法, 每个教育领域完全都有自己的一套检验用例. 对于benchmarking, 首再之后行只能真的它测的是什么. 以spec cpu2017为例, 它主要检验的是里央两解决问题器, 线程子系统不会以及编译器的稳定性, 那么在检验的时候我们除了注意CPU改型, 还要考虑线程一般来说插法改型, 以及编译器及其参有数等等, 在想到稳定性比对时也能相符它的运用于适用范围。

Benchmark的一个表现形式是可重复性, spec.org想到得很好的一点是右边有大量公布的检验结果, 可以参考这些检验结果来的测试我们自己的检验分析方法参有数确实恰当. 如果一切都是检验cpu2017, 第一件事就是再之后行重想到别人的检验, 直到能复现别人的有数据资料, 这个全过程不必要有很多收获, 对benchmark也不会有更加多知晓. 以intel 8160为例, 在显卡大体上一致的上述意味着, 不经额外的配置自己生存环境cpu2017 integer rate只能飞驰到140, 而spec.org右边的检验用例能达到240, 稳定性逐步退却240的全过程, 也是有系统不会明白cpu2017的全过程。

关于稳定性有数据资料, 首再之后行一切都是要强劲调的是有有数据资料并也就是时说比没有人有数据资料强劲, 只有解释过的有数据资料才是有效性有数据资料, 没有人解释过的有数据资料反而不会引起不必要的疏忽, 比如右边cpu2017的举例来时说, 在想到多种不同SDK稳定性对比的时候, 8160到底用140还是240呢, 结论的论据不会十万八千里. 再之后比如运用于请注意的下达检验某上新SDK的线程推迟:

lat_mem_rd -P 1 -N 1 10240 512

检验造出的推迟是7.4ns, 不加分析分析方法采用该结果就可能不会结论上新SDK推迟太好的错误论据. 所以对待有数据资料要充分认真, 一般不会有几个阶段性:

在重用亲密关系成立当年, 对别人的有数据资料保持认真. 一是有可能不会自己对这块还无法充分明白, 二是只能检验报告借助充分的文档供他人想到判断。 极深信自己的有数据资料. 需极深信自己, 但是为了让极深信自己的有数据资料, 是因为有过详缘恰当的分析分析方法。 极深信别人的有数据资料. 重用多肽成立此后, 以及自己有了充分明白后, 为了让极深信.

更加多大体上功能

ftrace

一切都是要短时间内明白示例构建, 无法什么比打印初始化逆时针更加必要了. ftrace可以用来解决2个难题:

谁初始化了我. 这个只要在制订相同函有数的时候拿到相同的栈就可以, 多种大体上功能可以构建 我初始化了谁. 这个是ftrace相当unique的功能

为了不便我们运用于ftrace的wrapper trace-cmd, 举例我们早已真的I/O逆时针不会经过generic_make_request, 为了查阅清晰的逆时针我们可以这样:

#trace-cmd record -p function --func-stack -l generic_make_request dd if=/dev/zero of=file bs=4k count=1 oflag=direct

通过report来查阅就一目了然了:

#trace-cmd report

cpus=128

dd-11344 [104] 4148325.319997: function: generic_make_request

dd-11344 [104] 4148325.320002: kernel_stack:

=> ftrace_graph_call (ffff00000809849c)

=> generic_make_request (ffff000008445b80)

=> submit_bio (ffff000008445f00)

=> _blockdev_direct_IO (ffff00000835a0a8)

=> ext4_direct_IO_write (ffff000001615ff8)

=> ext4_direct_IO (ffff0000016164c4)

=> generic_file_direct_write (ffff00000825c4e0)

=> _generic_file_write_iter (ffff00000825c684)

=> ext4_file_write_iter (ffff0000016013b8)

=> _vfs_write (ffff00000830c308)

=> vfs_write (ffff00000830c564)

=> ksys_write (ffff00000830c884)

=> _arm64_sys_write (ffff00000830c918)

=> el0_svc_common (ffff000008095f38)

=> el0_svc_handler (ffff0000080960b0)

=> el0_svc (ffff000008084088)

以前如果我们一切都是之后有系统不会generic_make_request, 运用于function_graph plugin:

$ sudo trace-cmd record -p function_graph -g generic_make_request dd if=/dev/zero of=file bs=4k count=1 oflag=direct

这样就可以拿到整个初始化全过程 (report结果稍微整理过):

$ trace-cmd report

dd-22961 | generic_make_request() {

dd-22961 | generic_make_request_checks() {

dd-22961 0.080 us | _cond_resched();

dd-22961 | create_task_io_context() {

dd-22961 0.485 us | kmem_cache_alloc_node();

dd-22961 0.042 us | _raw_spin_lock();

dd-22961 0.039 us | _raw_spin_unlock();

dd-22961 1.820 us | }

dd-22961 | blk_throtl_bio() {

dd-22961 0.302 us | throtl_update_dispatch_stats();

dd-22961 1.748 us | }

dd-22961 6.110 us | }

dd-22961 | blk_queue_bio() {

dd-22961 0.491 us | blk_queue_split();

dd-22961 0.299 us | blk_queue_bounce();

dd-22961 0.200 us | bio_integrity_enabled();

dd-22961 0.183 us | blk_attempt_plug_merge();

dd-22961 0.042 us | _raw_spin_lock_irq();

dd-22961 | elv_merge() {

dd-22961 0.176 us | elv_rqhash_find.isra.9();

dd-22961 | deadline_merge() {

dd-22961 0.108 us | elv_rb_find();

dd-22961 0.852 us | }

dd-22961 2.229 us | }

dd-22961 | get_request() {

dd-22961 0.130 us | elv_may_queue();

dd-22961 | mempool_alloc() {

dd-22961 0.040 us | _cond_resched();

dd-22961 | mempool_alloc_slab() {

dd-22961 0.395 us | kmem_cache_alloc();

dd-22961 0.744 us | }

dd-22961 1.650 us | }

dd-22961 0.334 us | blk_rq_init();

dd-22961 0.055 us | elv_set_request();

dd-22961 4.565 us | }

dd-22961 | init_request_from_bio() {

dd-22961 | blk_rq_bio_prep() {

dd-22961 | blk_recount_segments() {

dd-22961 0.222 us | _blk_recalc_rq_segments();

dd-22961 0.653 us | }

dd-22961 1.141 us | }

dd-22961 1.620 us | }

dd-22961 | blk_account_io_start() {

dd-22961 0.137 us | disk_map_sector_rcu();

dd-22961 | part_round_stats() {

dd-22961 0.195 us | part_round_stats_single();

dd-22961 0.054 us | part_round_stats_single();

dd-22961 0.955 us | }

dd-22961 2.148 us | }

dd-22961 + 15.847 us | }

dd-22961 + 23.642 us | }

uftrace

uftrace在使用者激发态构建了一个完全相同ftrace的功能, 对只能短时间内明白使用者激发态的语义不会有努力, 但是只能加上-pg重上新编译GCC, 的资讯只见[6]。

#gcc -pg a.c

#uftrace ./a.out

# DURATION TID FUNCTION

[ 69439] | main() {

[ 69439] | A() {

0.160 us [ 69439] | busy();

1.080 us [ 69439] | } /* A */

[ 69439] | B() {

0.050 us [ 69439] | busy();

0.240 us [ 69439] | } /* B */

1.720 us [ 69439] | } /* main */

BPF

BPF (eBPF) 是这几年的热点, 通过BPF完全可以看清系统不会的各个角落, 给病人加剧了极大的不便. BPF不是一个大体上功能, BPF是生产大体上功能的大体上功能, BPF大体上功能编写是稳定性分析分析方法需掌握的精神力之一。

这里举个运用于BPF来分析分析方法QEMU I/O推迟的举例来时说. 为了简化难题, 再之后行确保vm外头的块装置只有fio在运用于, fio管控装置只有一个并发I/O, 这样我们在host上为了让2个推论点:

tracepoint:kvm:kvm_mmio. host猎捕guest mmio操控, guest外头再之后度通过写该mmio发送劝告给host kprobe:kvm_set_msi. 因为guest外头vdb运用于msi里断, 里断再之后度通过该函有数汇流

因为host上有多个vm和虚拟盘只能区分, 运用于不限文档猎捕并且只猎捕我们注意的这个装置:

只注意该qemu-kvm pid vbd mmio相同的gpa, 这个可以在guest外头通过lspci获得

对于kvm_set_msi, 运用于如下文档:

struct kvm的userspace_pid, struct kvm相同的qemu-kvm发挥作用 struct kvm_kernel_irq_routing_entry的msi.devid, 相同到pci装置id

#include

BEGIN {

@qemu_pid = $1;

@mmio_start = 0 00a00000;

@mmio_end = 0 00a00000 + 16384;

@devid = 1536;

}

tracepoint:kvm:kvm_mmio /pid == @qemu_pid/ {

if (args->gpa>= @mmio_start CompanyCompany args->gpa

@start = nsecs;

}

}

kprobe:kvm_set_msi {

$e = (struct kvm_kernel_irq_routing_entry *)arg0;

$kvm = (struct kvm *)arg1;

if (@start> 0 CompanyCompany $kvm->userspace_pid == @qemu_pid CompanyCompany $e->msi.devid == @devid) {

@dur = stats(nsecs - @start);

@start = 0;

}

}

interval:s:1 {

print(@dur); clear(@dur);

}

制订结果如下:

@dur: count 598, average 1606320, total 960579533

@dur: count 543, average 1785906, total 969747196

@dur: count 644, average 1495419, total 963049914

@dur: count 624, average 1546575, total 965062935

@dur: count 645, average 1495250, total 964436299

更加极深明白

很多关键技术只能反复去明白的测试, 而不会可能不会都有多种不同的收获, 这里举个loadavg的举例来时说. 引用kernel/sched/loadavg.c最开始的一段译文:

5 * This file contains the magic bits required to compute the global loadavg

6 * figure. Its a silly number but people think its important. We go through

7 * great pains to make it work on big machines and tickless kernels.

这里的silly我一切都是时说的是loadavg有一定的普遍性, 总的来时说loadavg是有一定语句和实用性的, 毕竟它来作了3个有二进制描绘了过去一段时长的"load", 反过来时说如果loadavg is silly, 那么有无法更加多的为了让?

如果是可视推论的话, vmstat/dstat可用的runnable和I/O blocked的文档是种更加多的为了让, 因为一般来时说于loadavg每5秒的抽样, vmstat可以想到组织内更加缘, 而且loadavg的迭代某种相对可以明白为有损的。 如果是sar/tsar的话, 举例搜罗等长是10min的话, loadavg因为能覆盖更加大的适用范围, 确实比10min一个的有二进制包含更加多的文档, 但我们只能理性它对有数据资料两解决问题的根本实用性.

另外, 5秒钟的抽样等长是相当大的, 我们可以本体个检验用例制订了大量时长但省去抽样

借助load抽样点的时长 检验用例碰巧省去该抽样点

查阅calc_load_fold_active在cpu 0上的初始化时长:

kprobe:calc_load_fold_active /cpu == 0/ {

printf("%ld", nsecs / 1000000000);

}

直通无法可用, 监视上一层函有数:

#include "kernel/sched/sched.h"

kprobe:calc_global_load_tick /cpu == 0/ {

$rq = (struct rq *)arg0;

@[$rq->calc_load_update] = count();

}

interval:s:5 {

print(@); clear(@);

}

制订结果符合预期:

#./calc_load.bt -I /kernel-source

@[4465886482]: 61

@[4465887733]: 1189

@[4465887733]: 62

@[4465888984]: 1188

查阅汇编找到这里示例被最佳化, 但是碰巧id_nr_invalid初始化没有人最佳化, 当然最不便的是能够必要在函有数翻转两处必要打的:

kprobe:id_nr_invalid /cpu == 0/ {

printf("%ld", nsecs / 1000000000);

}

根据这个时长碰, 可以很较易省去load的粗略估计:

while :; do

sec=$(awk -F. '{print $1}' /proc/uptime)

rem=$((sec % 5))

if [ $rem -eq 2 ]; then # 1s after updating load

break;

fi

sleep 0.1

done

for i in {0..63}; do

./busy 3 Company # run 3s

done

大量busy发挥作用成功省去load的粗略估计, 可以设一切都是像cron制订的护航也是有这个可能不会的. 虽然不用回应loadavg的实用性, 但总的来时说load有不限缺陷:

系统不会层次的粗略估计, 和具体章节系统设计造成的关联实在必要 运用于抽样的方式将并且抽样等长 (5s) 更大, 有的故事情节不用真实再现系统不会 粗略估计的等长更大(1/5/15分钟), 不利于适时再现当时的上述情况 语句稍微实在清晰, 不只则有cpu的load, 还则有D状激发态的护航, 这个本身不是大难题, 更加多可以并不认为是feature

Linux增加了Pressure Stall Information (PSI), PSI从护航的角度看分别粗略估计了10/60/300s内因为cpu/io/memory等人力欠缺而不用直通的时长, 并按照受到影响适用范围分成2类:

some - 因为欠缺人力加剧均护航不用制订 full - 因为欠缺人力加剧所有护航不用制订, cpu不共存这种上述情况

我们在一台96c的arm本微电脑上追踪所有cgroup的cpu.pressure:

这里不会引造出几个难题, 百字可能这里不再之后揭开。

父cgroup的avg为什么比子cgroup还小? 是构建难题还是有额外的配置参有数? avg10等于33, 也就是1/3的时长有task因为无法cpu而不能接受制订, 考虑到系统不会cpu运用于量在40%大概并即使如此高, 我们怎么恰当看待和运用于这个数值

top - 09:55:41 up 127 days, 1:44, 1 user, load average: 111.70, 87.08, 79.41

Tasks: 3685 total, 21 running, 2977 sleeping, 1 stopped, 8 zombie

%Cpu(s): 27.3 us, 8.9 sy, 0.0 ni, 59.8 id, 0.1 wa, 0.0 hi, 4.0 si, 0.0 st

RTFSC

有的时候RTFM早已实在了, 双摘要则有大体上功能本身的更加上新没有人对上内核的节奏, 我们送回右边多肽接重复运用于的举例来时说, 估计有的同班同学之当年就有疑问, 无法scan哪里来的steal。

#sar -B 1

11:00:16 AM pgscank/s pgscand/s pgsteal/s %vmeff

11:00:17 AM 0.00 0.00 3591.00 0.00

11:00:18 AM 0.00 0.00 10313.00 0.00

11:00:19 AM 0.00 0.00 8452.00 0.00

再之后行看sysstat (sar) 外头的构建, 主要是读过取分析分析方法/proc/vmstat:

pgscand: 相同到pgscan_direct域 pgscank: 相同到pgscan_kswapd域 pgsteal: 相同到pgsteal_开头的域

#gdb --args ./sar -B 1

(gdb) b read_vmstat_paging

(gdb) set follow-fork-mode child

(gdb) r

Breakpoint 1, read_vmstat_paging (st_paging=0x424f40) at rd_stats.c:751

751 if ((fp = fopen(VMSTAT, "r")) == NULL)

(gdb) n

754 st_paging->pgsteal = 0;

(gdb)

757 while (fgets(line, sizeof(line), fp) != NULL) {

(gdb)

759 if (!strncmp(line, "pgpgin ", 7)) {

(gdb)

763 else if (!strncmp(line, "pgpgout ", 8)) {

(gdb)

767 else if (!strncmp(line, "pgfault ", 8)) {

(gdb)

771 else if (!strncmp(line, "pgmajfault ", 11)) {

(gdb)

775 else if (!strncmp(line, "pgfree ", 7)) {

(gdb)

779 else if (!strncmp(line, "pgsteal_", 8)) {

(gdb)

784 else if (!strncmp(line, "pgscan_kswapd", 13)) {

(gdb)

789 else if (!strncmp(line, "pgscan_direct", 13)) {

(gdb)

757 while (fgets(line, sizeof(line), fp) != NULL) {

(gdb)

看下/proc/vmstat都有什么:

#grep pgsteal_ /proc/vmstat

pgsteal_kswapd 168563

pgsteal_direct 0

pgsteal_anon 0

pgsteal_file 978205

#grep pgscan_ /proc/vmstat

pgscan_kswapd 204242

pgscan_direct 0

pgscan_direct_throttle 0

pgscan_anon 0

pgscan_file 50583828

就此是不是内核的构建, pgsteal和pgscan的语义是一样, 除了nr_scanned换成了nr_reclaimed:

if (current_is_kswapd()) {

if (!cgroup_reclaim(sc))

_count_vm_events(PGSCAN_KSWAPD, nr_scanned);

count_memcg_events(lruvec_memcg(lruvec), PGSCAN_KSWAPD,

nr_scanned);

} else {

if (!cgroup_reclaim(sc))

_count_vm_events(PGSCAN_DIRECT, nr_scanned);

count_memcg_events(lruvec_memcg(lruvec), PGSCAN_DIRECT,

nr_scanned);

}

_count_vm_events(PGSCAN_ANON + file, nr_scanned);

以前难题很清晰了:

这里sar取得是系统不会的/proc/vmstat, 而cgroup外头pgscan_kswapd和pgscan_direct只不会加到cgroup的粗略估计, 不一切都是加到系统不会级的粗略估计 cgroup外头pgsteal_kswapd和pgsteal_direct同样只不会加到cgroup自己的粗略估计 但是主要pgscan_anon, pgscan_file和pgsteal_anon, pgsteal_file都只加到系统不会级的粗略估计 sar读过取了pgscan_kswapd, pgscan_direct, 以及pgsteal_*, 这里*还则有了pgsteal_anon和pgsteal_file

这整个语义都乱了, 我们有必要解决这个bug让sar的可用变得愈发决含义. 那么在cgroup内是不是打趣?

#df -h .

Filesystem Size Used Avail Use% Mounted on

cgroup 0 0 0 - /sys/fs/cgroup/memory

#grep -c 'pgscan|pgsteal' memory.stat

0

这些粗略估计文档在cgroup v1上完全无法可用, 而只在v2版本有可用. 在以当年内核无法专供LRU_UNEVICTABLE的时候, 如果有很多比如mlock page的时候, 碰到过好像追踪却不用重复运用于线程的上述情况, 这个粗略估计不会十分简单于, 即使是以前我极深信这个粗略估计还是简单于的, 只是大均时候还不必碰到这么缘。

多上双手

纸上得来终觉浅, 自己动双手去想到加剧很多坏两处:

问到自订难题. 有数据资料两解决问题分析分析方法就是不断提造出难题和的测试的全过程, 无法上双手的话就不会以前停留时间在第一个难题上. 比如我一切都是知晓某SDK上电学线程是怎么编址的, 无法文档的话只能自己去试验 提造出原先难题. 有数据资料两解决问题分析分析方法里不怕有难题, 怕的是提不造出难题 不会决意外收获. 很多时候并不是决意为之, 比如准备好的是分析分析方法cpu短波能否降功耗, 上去却找到系统不会以前直通在最高于频率 懂得. 懂得就是效率 改进型电子产品. 可以试一切都是下在整个阳生存环境所有本微电脑上追踪 (完全相同下半年健康检查) 不会找到多少潜在难题

概要

[1]~johnmc/comp528/lecture-notes/

[2]

[3]

[4]

[5]

[6]

[7][8]The Art of Computer Systems Performance Analysis

本文为阿里阳原创章节,未经而无须不得转载。

昆明妇科哪家医院最好
西宁看妇科哪里最好
北京妇科检查多少钱
济南哪家医院治疗皮肤病好
成都白癜风专科医院哪家好
友情链接