Diagnostic Tools

基础

查看cpu:

cat /proc/cpuinfo
lscpu
cpuid

查看系统负载:

uptime

// output: 当前时间,系统运行时间,1、3、15 分钟的平均负载
17:44:09 up  1:58,  3 users,  load average: 0.00, 0.00, 0.00

观察某个命令输出的变化:

watch -d uptime
// -d, --differences 高亮变化的部分

/proc

/proc 是 linux 提供的一种特殊的文件系统,是用户与内核交互的接口。可以从 /proc 中查询运行状态和配置选项,也可以修改 /proc 来修改内核的配置。

/proc/softirqs # 软中断
/proc/interrupts # 硬中断

/proc/stat # CPU 和任务统计信息 
/proc/[pid]/stat # 进程的 CPU 和任务统计信息

/proc/meminfo # 内存信息

/proc/slabinfo # 查看 slab 信息

/proc/zoneinfo # NUMA 架构中每个 node 的信息

/proc/diskstats # 查看磁盘统计信息
# 配置 pages_min 值,控制 kswapd0 的行为
/proc/sys/vm/min_free_kbytes

# 配置 oom_score
/proc/[pid]/oom_adj 

# 清理文件页、目录项、Inodes 等各种缓存
echo 3 > /proc/sys/vm/drop_caches 

# NUMA 架构下,节点回收内存的方式,具体查看内存一节。
/proc/sys/vm/zone_reclaim_mode

# 配置系统使用 swap 的积极程度,具体查看内存一节。
/proc/sys/vm/swappiness

ps

线程名字有中括号,表示无法获取它们的命令行参数,一般都是内核线程。

ps -ef
# -T 展示线程

# 查看所有内核线程
ps -f --ppid 2 -p 2
ps -ef | grep "\[.*\]"

top

常用查看系统负载、进程状态的工具。

S(Status) 列表示进程状态:

  • R:Running or Runnable,正在运行或正在等待运行。

  • D:Disk Sleep,不可中断睡眠(Uninterruptible Sleep),一般表示正在和硬件交互,且交互过程不允许被其它进程中断或打断。

  • Z:Zombie,僵尸进程,进程实际上已经结束,但是父进程还没有回收它的资源。

  • S:Interruptible Sleep,可中断睡眠,进程等待某个事件而被系统挂起,唤醒后会进入 R 状态。

  • I:Idle,空闲状态,不可中断的内核线程。D 会导致平均负载升高,但是 I 不会。

内存相关的列:

  • VIRT:进程的虚拟内存大小。只要申请过,就算没有分配物理内存,也会计算在内。

  • RES:常驻内存大小,实际使用的物理内存,不包括 swap 和共享内存。

  • SHR:共享内存,不一定全部共享,程序代码段、非共享的动态链接库也计算在 SHR 内;不过真正共享的内存,共享的动态链接库自然也计算在内。

  • %MEM:进程使用的物理内存占系统内存的百分比。

sysstat

系统压力测试工具:apt install sysstat

mpstat

CPU 性能分析工具

  • -P ALL,输出所有 CPU 的统计

pidstat

进程性能分析工具

  • -u,输出 CPU 使用率

  • -d,输出 I/O 统计

  • -w,输出任务切换

    • cswch:每秒自愿上下文切换数。进程无法获取资源(IO、内存)导致上下文切换。

    • nvcswch:每秒非自愿上下文切换数。进程的时间片已到,系统强制调度。

  • -p,指定某个进程

sar

系统活动报告工具,可以实时查看系统当前的活动,也可以配置保存和报告历史统计数据。

# -n 查看网络统计信息。DEV(网络接口)、EDEV(网络接口错误)、TCP、UDP、ICMP
sar -n DEV 1

# -r 显示内存使用情况,-S 显示 Swap 使用情况
sar -r -S 1
# kbcommit, %commit: 对内存需求的预估
# kbactive: 活跃内存
# kbinact: 非活跃内存
  • rxpck/s, txpck/s:PPS,包/秒。

  • rxKB/s, txKB/s:吞吐量。

  • rxcmp/s, tcxmp/s:压缩包数据包数。

  • %ifutil:网络接口使用率。半双工模式下为 (rxkB/s+txkB/s)/Bandwidth,而全双工模式下为 max(rxkB/s, txkB/s)/Bandwidth。Bandwidth 可用ethtool 查看。

iostat

数据来自 /proc/diskstats。

iostat -d -x 1
# -d 展示设备使用率
# -x 展示扩展统计信息
  • r/s + w/s 就是 IOPS

  • rKB/s + wKB/s 就是吞吐量

  • r_await + w_await 就是响应时间

饱和度一般无法直接获取,可通过与基础测试结果(fio)比较来评估饱和度。

dstat

新的性能工具,吸收了 vmstat、iostat、ifstat 等工具的优点。

yum install dstat

dstat 1 10

vmstat

系统性能分析工具,主要用于分析系统内存使用情况、CPU 上下文切换、中断次数等。

vmstat [options] [delay [count]]

// 每隔 5 秒输出一次
  ~ vmstat 5
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0      0 1719840  17412 151560    0    0     1     0   24   31  0  0 100  0  0
 0  0      0 1719808  17420 151560    0    0     0     6   59   66  0  0 100  0  0
  • cs(context switch):每秒上下文切换次数。

  • in(interrupt):每秒中断次数。

  • r(runnable):正在运行和等待 CPU 的进程数。

  • b(uninterruptible):不可中断睡眠状态的进程数。

strace

跟踪进程的系统调用。

yum install -y strace

strace -p ${pid} -f
# -f 跟踪多线程。
# -T 系统调用时长
# -tt 跟踪时间
# -e expr 跟踪特定的系统调用

perf

利用动态追踪技术

// 按方向键可定位对象,按回车可展开
$ perf top [-g]
Samples: 833  of event 'cpu-clock', Event count (approx.): 97742399
Overhead  Shared Object       Symbol
   7.28%  perf                [.] 0x00000000001f78a4
   4.72%  [kernel]            [k] vsnprintf
   4.32%  [kernel]            [k] module_get_kallsym
   3.65%  [kernel]            [k] _raw_spin_unlock_irqrestore
  • Overhead: 比例

  • Shard:动态共享对象

  • Object:[.] 表示用户空间可以执行程序,[k] 表示内核空间。

  • Symbol:函数名

还有perf record [-g]perf report [-g] 等。

可以追踪内核线程。可以通过其它工具把输出结果以火焰图的方式展示。

pstree

用树型显示所有进程之间的关系。

yum install psmisc

pstress -aps ${pid}

pgrep

根据进程名查找进程号。

execsnoop

专为短时进程设计的工具。它通过 ftrace 实时监控进程的 exec() 行为,并输出短时进程的基本信息。

cd /usr/bin
wget https://raw.githubusercontent.com/brendangregg/perf-tools/master/execsnoop
chmod 755 execsnoop

numactl

查看、控制 NUMA 中的 node 信息。

numactl --hardware

bcc

基于 Linux 内核的 eBPF 机制。

CentOS Install

CentOS 7

升级内核

# 升级系统
yum update -y

# 安装ELRepo
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh https://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm

# 安装新内核
yum remove -y kernel-headers kernel-tools kernel-tools-libs
yum --enablerepo="elrepo-kernel" install -y kernel-ml kernel-ml-devel kernel-ml-headers kernel-ml-tools kernel-ml-tools-libs kernel-ml-tools-libs-devel

# 更新Grub后重启
grub2-mkconfig -o /boot/grub2/grub.cfg
grub2-set-default 0
reboot

# 重启后确认内核版本已升级为4.20.0-1.el7.elrepo.x86_64
uname -r

安装 bcc-tools

# 安装bcc-tools
yum install -y bcc-tools

# 配置PATH路径
export PATH=$PATH:/usr/share/bcc/tools

# 验证安装成功
cachestat 

cachestat

提供整个操作系统缓存的读写命中情况。

$ cachestat 1 3
   TOTAL   MISSES     HITS  DIRTIES   BUFFERS_MB  CACHED_MB
       2        0        2        1           17        279
       2        0        2        1           17        279
       2        0        2        1           17        279 
  • TOTAL: 总 IO 次数。一次代表一页,为 4KB。

  • MISSES: 未命中缓存次数

  • HITS: 命中缓存次数

  • DIRTIES: 新增到缓存中的脏页数

  • BUFFERS_MB: Buffer的大小

  • CACHED_MB: Cache 的大小

cachetop

提供每个进程的缓存命中情况。

$ cachetop
11:58:50 Buffers MB: 258 / Cached MB: 347 / Sort: HITS / Order: ascending
PID      UID      CMD              HITS     MISSES   DIRTIES  READ_HIT%  WRITE_HIT%
13029 root     python                  1        0        0     100.0%       0.0%

不会吧 Direct IO 算进来。

memleak

可以跟踪系统或指定进程的内存分配、释放请求,然后定期输出一个未释放内存和相应调用栈的汇总情况。

filetop

跟踪内核中文件的读写情况。

opensnoop

动态跟踪内核中 open 系统调用。

内存相关

free

  ~ free
              total        used        free      shared  buff/cache   available
Mem:         810492      323488      125568        1848      361436      360564
Swap:       2097148        5408     2091740
  • total:

  • used: 包含了共享内存

  • free:

  • shared:

  • buff/cache: 并不是所有的缓存都可以回收。

  • available: 新进程可用的内存大小。不仅包含未使用内存,还包括了可回收的缓存。

slabtop

查看 slab 信息。

pcstat

Go 开发的。查看文件在内存中的缓存大小及缓存比例。

$ pcstat /bin/ls
+---------+----------------+------------+-----------+---------+
| Name    | Size (bytes)   | Pages      | Cached    | Percent |
|---------+----------------+------------+-----------+---------|
| /bin/ls | 133792         | 33         | 0         | 000.000 |
+---------+----------------+------------+-----------+---------+

磁盘相关

dd

转换和复制磁盘和文件的工具。

# 从随机设备读取,写入文件
dd if=/dev/urandom of=/tmp/file bs=1M count=500

# 从随机设备数据,直接写入磁盘
dd if=/dev/urandom of=/dev/sdb1 bs=1M count=2048

# 从文件读取,写入空设备
dd if=/tmp/file of=/dev/null

# 从磁盘读取,写入空设备
dd if=/dev/sda1 of=/dev/null bs=1M count=1024

如果把 dd 当做测试文件系统性能的工具,由于缓存的存在,会导致测试结果严重失真。

df

查看文件系统的磁盘使用情况。

df -h

# 查看索引节点(inode)
df -i

iotop

yum install -y iotop

lsof

查看进程打开的文件列表,文件包括普通文件、目录、块设备、动态库、网络套接字等。

yum install -y lsof

lsof -p ${pid}

网络相关

net-tools

yum install -y net-tools

ifconfig

ifconfig [$interface]
  • RUNNING:同 ip 的 LOWER_UP。

iproute

yum install -y iproute

net-tools 的下一代,建议使用这个。

ip

ip -s addr show dev $interface
# -s, -stats:显示一些统计信息
  • LOWER_UP:物理网络连通,网卡已经连到交换机或路由器。

  • MTU:默认 1500。

  • errors:校验错误、帧同步错误等。

  • dropped:丢弃的数据包数。如内存不足。

  • overruns:超限的数据包数。如网络 IO 过快,Ring Buffer 来不及处理。

  • carrier:发生 carrier 错误的数据包数。如双工模式不匹配、物理电缆出问题等。

  • collisions:碰撞数据包数。

netstat

查看套接字、网络栈、网络接口以及路由表的信息。

netstat -nlp
# -n 显示数字地址和端口,而不是名字
# -p 显示进程信息
# -l 只显示监听的套接字

netstat -s
# -s, 协议的收发汇总情况及错误

netstat -i
# -i, 查看网卡,比如丢包等信息

ss

与 netstat 类似,但是性能更好。

ss -nplt
# -n 显示数字地址和端口,而不是名字
# -p 显示进程
# -l 只显示监听的套接字
# -t 只显示 tcp 套接字

ss -s
# -s 统计信息

接收队列(Recv-Q)和发送队列(Send-Q)通常应该是 0。若不是 0 时,说明有网络包的堆积发生。

若 Socket 处于 Established 状态时:

  • Recv-Q:Socket 缓冲区还未被应用程序取走的字节数(接收队列长度)。

  • Send-Q:还未被远端主机确认的字节数(发送队列长度)。

若 Socket 处于 Listen 状态:

  • Recv-Q:全连接队列的长度。

  • Send-Q:全连接队列的最大长度。

全连接指完成了三次 TCP 握手。需要被 accept() 系统调用取走。半连接指还未完成 TCP 三次握手,服务器收到客户端 SYN 后,会把连接放到半连接队列中,再向客户端发送 SYN+ACK。

ethtool

ethtool $interface

ping

测试主机连通性和延时。

ping -c3 $ip

tcpdump

常用的网络抓包工具。基于 libpcap。

yum install -y tcpdump
tcpdump [option] [filter-expression]

# -i 网卡
tcpdump -i ens33 -n tcp port 80

tcpdump -i any -nn udp port 53 or host 35.190.27.188
# -i any 所有网卡
# -nn 不解析抓包中的域名、协议、端口号
# udp port 53 仅显示 udp 协议的 53 端口
# host 35.190.27.188 只显示特定 IP(包括源地址和目的地址)

基本输出格式:时间戳 协议 源地址.源端口 > 目的地址.目的端口 网络包详细信息。可以通过选项增加其它字段。

Wireshark

抓包和分析工具,提供图形界面和汇总分析工具。

yum install -y wireshark

tcpdump 通过 -w 选项保持抓包文件,可通过 wireshark 图形界面打开,以更加友好的方式展示。

比如 Statistics -> Flow Graph 可以查看整个 TCP 的流程。推荐书籍 《Wireshark网络分析就这么简单》、《Wireshark网络分析的艺术》

hping3

可以构造 TCP/IP 协议数据包的工具。

yum install -y epel-release
yum install -y hping3

brew install hping
# -S tcp 协议的 SYN
# -p 目标端口哦
# -i u100 发送间隔为 100 微秒
hping3 -S -p 80 -i u100 10.93.245.152

traceroute

yum install -y "traceroute"

traceroute --tcp -p 80 -n baidu.com
# -n 不对结果中的 IP 进行反向域名解析

bind-utils

yum install -y bind-utils

nslookup

nslookup $domain
# -debug 开启调试模式

# 通过 ip 查找域名
nslookup -type=PTR 35.190.27.188 8.8.8.8

dig

dig +trace +nodnssec baidu.com
# +trace 开启跟踪查询
# +nodnssec 禁止 DNS 安全扩展

dig trace 的输出主要有四部分:

  • 一:查到根域名服务器 (.) 的 NS 记录。

  • 二:从 NS 中选一个,查询顶级域名 com. 的 NS 记录。

  • 三:从 com. 的 NS 记录中选一个,查找二级域名 baidu.com. 的 NS 记录。

  • 四:从 baidu.com. 的 NS 记录中选一个,查询 baidu.com. 的 A 记录。

dnsmasq

最常用的 DNS 缓存服务器,还可作为 DHCP 服务器使用。

/etc/init.d/dnsmasq start

echo nameserver 127.0.0.1 > /etc/resolv.conf

测试相关

sysbench

多线程基准测试工具。

  • --thread: 线程数

  • --time: 执行多少秒

apt-get install sysbench

sysbench --num-threads=8 --max-requests=100000 --test=cpu run

sysbench --test=memory --memory-oper=read --memory-access-mode=seq run
sysbench --test=memory --memory-oper=write --memory-access-mode=seq run
sysbench --test=memory --memory-oper=read --memory-access-mode=rnd run
sysbench --test=memory --memory-oper=write --memory-access-mode=rnd run

stress

系统压力测试工具:apt install stress,重要的参数有:

  • -i, --io 模拟 N 个进程执行 sync()

  • -c,--cpu 模拟 N 个进程执行 sqrt()

  • -t,--timeout 执行 N 秒

ab

HTTP 服务性能测试工具。

yum install -y httpd-tools

# 并发 10 个请求,总共测试 10000 个请求
$ ab -c 10 -n 10000 http://192.168.0.10:10000/

测试结果分为请求汇总、连接时间汇总、请求延时汇总三部分。

fio

磁盘性能测试工具。

yum install -y fio


# 随机读
fio -name=randread -direct=1 -iodepth=64 -rw=randread -ioengine=libaio -bs=4k -size=1G -numjobs=1 -runtime=1000 -group_reporting -filename=/dev/sdb

# 随机写
fio -name=randwrite -direct=1 -iodepth=64 -rw=randwrite -ioengine=libaio -bs=4k -size=1G -numjobs=1 -runtime=1000 -group_reporting -filename=/dev/sdb

# 顺序读
fio -name=read -direct=1 -iodepth=64 -rw=read -ioengine=libaio -bs=4k -size=1G -numjobs=1 -runtime=1000 -group_reporting -filename=/dev/sdb

# 顺序写
fio -name=write -direct=1 -iodepth=64 -rw=write -ioengine=libaio -bs=4k -size=1G -numjobs=1 -runtime=1000 -group_reporting -filename=/dev/sdb 

# direct,是否跳过系统缓存
# iodepth,使用异步 io 时,同时发出 io 请求的上限
# rw,io 模式
# ioengine,io 引擎
# bs,io 大小
# filename,文件或磁盘路径
  • slat,从 io 提交到实际执行 io 的时长。

  • clat,从 io 提交到完成 io 的时长。

  • lat,fio 创建 io 到 io 完成的时长。

  • bw,吞吐量。

  • iops,每秒 io 次数。

对于同步 IO,clat = 0;对于异步 IO,lat ≈ slat + clat。

### fio 还支持重放

# 使用blktrace跟踪磁盘I/O,注意指定应用程序正在操作的磁盘
$ blktrace /dev/sdb

# 查看blktrace记录的结果
$ ls
sdb.blktrace.0  sdb.blktrace.1

# 将结果转化为二进制文件
$ blkparse sdb -d sdb.bin

# 使用fio重放日志
$ fio --name=replay --filename=/dev/sdb --direct=1 --read_iolog=sdb.bin 

iperf

TCP、UDP 性能测试工具。

yum install -y iperf3

## 服务端(被测试端)启动服务
iperf3 -s -i 1 -p 10000
# -s 启动服务端
# -i 汇报时间间隔
# -p 监听端口

## 客户端运行测试
iperf3 -c 192.168.0.30 -b 1G -t 15 -P 2 -p 10000
# -c 启动客户端,后面为目标服务器 IP
# -b 目标带宽
# -t 测试时间
# -P 并发数
# -p 服务端端口

SUM 行就是测试汇总结果。包括测试时间、数据传输量、带宽等。又分为 sender 和 receiver 两行。

netperf

TCP、UDP 性能测试工具。

wrk

网络性能测试工具。

wrk --latency -c 100 -t 2 --timeout 2 http://192.168.0.30/

Last updated