第二周

由于是双周,少了一个周日的时间来看专栏,有点赶,加上 0607 晚上又有一个交流会,这次笔记写得有点匆忙。当然,专栏上的文字内容是早就看完了。

这次的感觉是重新看一遍感觉比上次看要容易很多。果然难的东西要看第二遍、第三遍就比较清晰。

持续在思考的就是怎样把这些东西融汇贯通?

如果能在实践中直接用的话,是比较有成就感的。比如:https://qcrao.com/2020/04/27/codec-accident/

听了大家的分享,赶紧有一群人一起学习还是挺好的。

先完成,再完美。

后面的模式是每周写一些心得感受,然后更新汇总的命令。争取在专栏完成的时候有一个速查手册,遇到性能方面的问题能直接拿出来参考。

all

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# 查看 CPU 核心数
$ grep 'model name' /proc/cpuinfo | wc -l

# 节拍率 HZ
$ grep 'CONFIG_HZ=' /boot/config-$(uname -r)

# 从所有进程中查找PID是24344的进程
$ ps aux | grep 24344

# 用树状形式显示所有进程之间的关系
$ pstree | grep stress

# -a 表示输出命令行选项
# p表PID
# s表示指定进程的父进程
$ pstree -aps 3084

# 查看启动用户
ps aux | grep "nginx: worker process" | awk '{print $1}'

# 下载安装 execsnoop
1 cd /usr/bin
2 wget https://raw.githubusercontent.com/brendangregg/perf-tools/master/execsnoop
3 chmod 755 execsnoop

# 显示none就是物理机,显示 kvm 则是虚拟机
$ systemd-detect-virt

# 内核版本
$ uname -r

# 抓取系统调用次数 /usr/share/bcc/tools
# -p 进程号,-d 取前 10
$ ./syscount -p 1693118 -d 10

ab

ab(apache bench)是一个常用的 HTTP 服务性能测试工具。

1
2
3
4
5
# 并发10个请求测试Nginx性能,总共测试100个请求
$ ab -c 10 -n 100 http://192.168.0.10:10000/

# 并发5个请求测试Nginx性能,总共测试10分钟
$ ab -c 5 -t 600 http://192.168.0.10:10000/

stress

安装:apt install stress

stress 是一个 Linux 系统压力测试工具,这里我们用作异常进程模拟平均负载升高的场景。

  • 模拟一个 CPU 使用率 100% 的场景:
1
stress --cpu 1 --timeout 600
  • 模拟 I/O 压力,即不停地执行 sync

    1
    stress -i 1 --timeout 600
  • 模拟 8 个进程

    1
    stress -c 8 --timeout 600

sysbench

安装:apt install sysbench

sysbench 是一个多线程的基准测试工具,一般用来评估不同系统参数下的数据库负载情况。

1
2
# 以10个线程运行5分钟的基准测试,模拟多线程切换的问题
$ sysbench --threads=10 --max-time=300 threads run

sysstat

安装:apt install sysstat

sysstat 包含了常用的 Linux 性能工具,用来监控和分析系统的性能。案例会用到这个包的两个命令 mpstat 和 pidstat。

mpstat 是一个常用的多核 CPU 性能分析工具,用来实时查看每个 CPU 的性能指标,以及所有 CPU 的平均指标。

pidstat 是一个常用的进程性能分析工具,用来实时查看进程的 CPU、内存、I/O 以及上下文切换等性能指标。pidstat 只是一个进程的性能分析工具,并不提供任何关于中断的详细信息。

  • 查看所有 CPU 的情况:

    1
    2
    # -P ALL 表示监控所有CPU,后面数字5表示间隔5秒后输出一组数据
    $ mpstat -P ALL 5
  • 以进程视角查看 CPU 使用率

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 每间隔5秒输出一组数据,-u表示CPU指标(周期性)
$ pidstat -u 5

# 间隔5秒后输出一组数据,-u表示CPU指标(一次)
$ pidstat -u 5 1

# 每隔5秒输出1组数据。查看每个进程上下文切换的情况
$ pidstat -w 5

# 每隔1秒输出1组数据(需要 Ctrl+C 才结束)
# -w参数表示输出进程切换指标,而-u参数则表示输出CPU使用指标
$ pidstat -w -u 1

# 每隔1秒输出一组数据(需要 Ctrl+C 才结束)
# -wt 参数表示输出线程的上下文切换指标
$ pidstat -wt 1

# 指定进程
pidstat -p 24344

# -d 展示 I/O 统计数据,-p 指定进程号,间隔 1 秒输出 3 组数据
$ pidstat -d -p 4344 1 3

# 间隔 1 秒输出多组数据 (这里是 20 组)
$ pidstat -d 1 20

vmstat

vmstat 是一个常用的系统性能分析工具,主要用来分析系统的内存使用情况,也常用来分析 CPU 上下文切换和中断的次数。

  • 系统整体情况。如系统整体的上下问切换情况
1
2
3
4
5
# 每隔5秒输出1组数据。
$ vmstat 5

# 间隔1秒后输出1组数据
$ vmstat 1 1

dstat

可以同时查看 CPU 和 I/O 这两种资源的使用情况。

1
2
# 间隔1秒输出10组数据
$ dstat 1 10

/proc

/proc 实际上是 Linux 的一个虚拟文件系统,用于内核空间与用户空间之间的通信。/proc/interrupts 就是这种通信机制的一部分,提供了一个只读的中断使用情况。

1
2
3
4
5
6
# -d 参数表示高亮显示变化的区域
$ watch -d cat /proc/interrupts

# 只保留各个CPU的数据。/proc/stat 提供的就是系统的 CPU 和任务统计信息
# 以进程的视角 /proc/[pid]/stat
$ cat /proc/stat | grep ^cpu

重调度中断(RES),这个中断类型表示,唤醒空闲状态的 CPU 来调度新的任务运行。这是多处理器系统(SMP)中,调度器用来分散任务到不同 CPU 的机制,通常也被称为处理器间中断(Inter-Processor Interrupts,IPI)。

perf

perf 是 Linux 2.6.31 以后内置的性能分析工具。它以性能事件采样为基础,不仅可以分析系统的各种事件和内核性能,还可以用来分析指定应用程序的性能问题。

1
2
3
4
5
6
7
8
9
10
11
# 它能够实时显示占用 CPU 时钟最多的函数或者指令,因此可以用来查找热点函数
# 虽然实时展示了系统的性能信息,但它的缺点是并不保存数据,也就无法用于离线或者后续的分析
$ perf top

# perf record 则提供了保存数据的功能
# 加上 -g 参数,开启调用关系的采样
$ perf record # 按Ctrl+C终止采样
$ perf report # 展示类似于perf top的报告

# -g开启调用关系分析,-p指定php-fpm的进程号21515
$ perf top -g -p 21515

strace

strace 正是最常用的跟踪进程系统调用的工具。

1
2
# -p 参数指定 PID 号
$ strace -p 6082