实用工具集索引

一些工具和小技巧,有时候要去翻历史博客或者重新搜索,此处进行归档索引,便于随时查找和使用。

1. Wireshark

1.1. 协议包示意图(Packet Diagram)

设置路径:在Wireshark中对照查看(设置->Appearance->Layout->Pane3 选 Packet Diagram)

使用示例,看协议代码时head和图印证:TCP半连接全连接(一) -- 全连接队列相关过程

1.2. TCP流统计图(TCP Stream Graphs)

几个图的说明示例可见:TCP发送接收过程(一) -- Wireshark跟踪TCP流统计图

示意图:

1.3. 新增实用列(Apply as Column)

在协议帧详情中,选中需要的列,右键 -> Apply as Column 即可加入到抓包列表进行显示。

可以加上下面几个字段:

  • The RTT to ACK the segment
    • 当前 TCP 数据段被确认(ACK)所需的时间,即"往返时间"(Round-Trip Time, RTT)
    • 通过该值可了解网络路径上的延迟情况,以及网络性能是否正常。如果 RTT 值显著增加,可能表明网络中存在拥塞、丢包或其他问题
  • Time since first frame in this TCP stream
    • 当前帧与该 TCP 流中第一个帧之间的时间差
    • 跟踪整个 TCP 流的时间跨度,帮助分析流的持续时间和行为
  • Time since previous frame in this TCP stream
    • 当前帧与同一 TCP 流中前一帧之间的时间差
    • 用于分析帧之间的间隔时间,帮助判断数据传输是否均匀
  • iRTT
    • TCP 连接建立时的初始往返时间(Initial RTT)
    • 是网络路径上首次测量的延迟,用于评估网络连接的初始状态,作为估算后续 RTT 的基准值
  • Bytes in flight
    • 当前在网络中未被确认的数据量(单位为字节)
    • 指发送方已经发送但尚未接收到 ACK 确认的数据量,反映了网络中正在传输的未确认数据量,是衡量 TCP 拥塞控制的重要指标

2. gperftools、火焰图

各类火焰图:On-CPU、Off-CPU、Wakeup、Off-Wake。

使用示例可见:并发与异步编程(三) -- 性能分析工具:gperftools和火焰图

火焰图还有下面介绍的 [Memory Leak and Growth火焰图](#Memory Leak and Growth火焰图 "#33-memory-leak-and-growth%E7%81%AB%E7%84%B0%E5%9B%BE")。

3. 内存相关profile

3.1. Valgrind Massif

使用实验可参考:CPU及内存调度(三) -- 内存问题定位工具和实验

3.2. AddressSanitizer 和 其他 Sanitizer工具

使用实验可参考:CPU及内存调度(三) -- 内存问题定位工具和实验

3.3. Memory Leak and Growth火焰图

Memory Leak and Growth火焰图

使用实验可参考:CPU及内存调度(三) -- 内存问题定位工具和实验

4. eBPF:bcc tools、bpftrace

当前几个工具集里有些功能是重复的:bcc tools(也包括支持CO-RE的libbpf版本)、bpftrace tools,以平时使用的情况来看,原生安装的bcc tools/bpftrace tools通用性更好。自己归档了一份工具便于统一使用(tools),是基于较新的版本,里面有些实现要求更高的内核版本。

1)较高版本内核(比如5.10),可以用新工具:libbpf版本更小、更快

2)较低版本内核,用默认安装版本(比如yum install),或者去github仓库下载对应版本

{: .prompt-tip }

比如bitesize的使用对比:

ruby 复制代码
# 1、自行编译的bcc tools libbpf版本,提示内核要求>=5.11.0(自己环境只是4.18.0-348.7.1.el8_5.x86_64)
[CentOS-root@xdlinux ➜ ~ ]$ which bitesize 
/home/workspace/bcc_20250315/libbpf-tools/bcc_libbpf-tools_bin_db5b63f/bitesize
[CentOS-root@xdlinux ➜ ~ ]$ bitesize
libbpf: prog 'block_rq_issue': BPF program load failed: -EACCES
libbpf: prog 'block_rq_issue': -- BEGIN PROG LOAD LOG --
arg#0 type is not a struct
Unrecognized arg#0 type PTR
; if (LINUX_KERNEL_VERSION >= KERNEL_VERSION(5, 11, 0))
...

# 2、自己基于github最近release的归档,也报错了。/home/workspace/prog-playground/tools/bpftrace-tools_v0.23.1
[CentOS-root@xdlinux ➜ bpftrace-tools_v0.23.1 git:(main) ✗ ]$ ./bitesize.bt 
./bitesize.bt:23:2-9: ERROR: Can not access field 'comm' on type '(ctx) struct _tracepoint_block_block_rq_issue *'. Try dereferencing it first, or using '->'
    @[args.comm] = hist(args.bytes);
    ~~~~~~~

# 3、yum安装的bcc tools则可运行
[CentOS-root@xdlinux ➜ bpftrace-tools_v0.23.1 git:(main) ✗ ]$ /usr/share/bcc/tools/bitesize
Tracing block I/O... Hit Ctrl-C to end.
^C
Process Name = kworker/11:1H
     Kbytes              : count     distribution
         0 -> 1          : 1        |****************************************|
         2 -> 3          : 1        |****************************************|
# 4、yum安装的bpftrace tools也可运行
[CentOS-root@xdlinux ➜ bpftrace-tools_v0.23.1 git:(main) ✗ ]$ /usr/share/bpftrace/tools/bitesize.bt 
Attaching 3 probes...
Tracing block device I/O... Hit Ctrl-C to end.
^C
I/O size (bytes) histograms by process name:

@[kworker/11:1H]: 
[0]                    1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@|
[1]                    0 |                                                    |
[2, 4)                 0 |                                                    |

4.1. Linux内核版本对BPF的支持情况

eBPF学习实践系列(一) -- 初识eBPF 里简要说明了下。

4.2. bcc tools

下面几篇博客做了一些介绍和实验:

自行编译了bcc libbpf版本,工具归档在:tools,其中的 bcc_libbpf-tools_bin_db5b63f.tar.xz 压缩包。基于 x86_64,gcc8.5.0,bcc commitid:db5b63ff876d3346021871e2189a354bfc6d510e,20250315才提交的,项目一直在更新,后续按需编译。

4.3. bpftrace

bpftrace提供的追踪类型:

介绍和工具使用,可见:eBPF学习实践系列(六) -- bpftrace学习和使用

bpftrace-tools 自己也归档了一份便于统一使用:tools,其中的bpftrace-tools_v0.23.1。

4.4. 60s系列BPF版本

4.5. 60s系列Linux命令版本

css 复制代码
uptime
dmesg | tail
vmstat 1
mpstat -P ALL 1
pidstat 1
iostat -xz 1
free -m
sar -n DEV 1
sar -n TCP,ETCP 1
top

4.6. 查看eBPF自身的资源消耗

发现一个有意思的工具:bpftop,可以查看eBPF自身的消耗,还能够在时间序列图中显示统计数据。

工具由Netflix的工程师Jose Fernandez开源,基于Rust开发。作者对工具的介绍:Announcing bpftop: Streamlining eBPF performance optimization

使用方式 :项目地址中有已经打包好的release二进制文件,下载即可使用,依赖glibc版本 >= GLIBC_2.29

直接执行,会展示当前生效的监测点列表和资源消耗总览;可选择某个监测点后回车,会用图表形式显示eBPF程序在该样本周期内的平均执行时间、每秒事件数和估算的CPU利用率。

也可参考:eBPF实战教程七 -- 性能监控工具---bpftop

5. perf-tools(ftrace和perf写的工具集)

可了解:eBPF学习实践系列(一) -- 初识eBPF

5.1. perf使用示例

perf的使用,可以见Brendan Gregg大佬的网站:perf Examples

5.2. funcgraph实践使用

追踪调用栈经验:结合bpftracefuncgraph跟踪前后调用栈。

可见:

6. 源码阅读分析:calltree.plcpptree.pl

追踪静态代码效果有点像用户态的bpftrace+funcgraph(追踪调用栈场景),可以通过mode:0还是1控制查看的调用栈方向。

示例:

使用到该工具:

7. 命令和小技巧

7.1. ss 查看TCP信息、过滤端口

注意:需要依赖tcp_diag模块,缺少该模块会退化成netstat一样的方式读取/proc文件。lsmod没有则可modprobe tcp_diag加载。

{: .prompt-warning }

实用选项:

  • -o:显示keepalive定时器
  • -i:显示TCP信息详情,选项、拥塞算法、拥塞窗口、各类超时时间等
  • state xxx:过滤TCP状态
  • dst :8008 过滤目的端口(src则过滤源端口)
  • 要过滤ip则要通过grep/awk匹配,ss里不支持选项过滤ip
ini 复制代码
# ss -o -i state established dst :8008  (-o显示keepalive定时器;-i展示tcp信息;state xxx不要放后面去了)
# 过滤目的端口8008的established连接
[root@localhost qxd]# ss -o -intp dst :8008|grep -v TIME-WAIT
State Recv-Q Send-Q         Local Address:Port            Peer Address:Port Process
ESTAB 0      0      [::ffff:192.168.1.62]:45038 [::ffff:192.168.1.220]:8008 users:(("java",pid=7870,fd=274))
         ts sack cubic wscale:7,7 rto:201 rtt:0.958/0.075 ato:40 mss:1448 pmtu:1500 rcvmss:536 advmss:1448 cwnd:185 ssthresh:132 bytes_sent:71412318 bytes_retrans:73848 bytes_acked:71338471 bytes_received:14550 segs_out:49431 segs_in:5428 data_segs_out:49428 data_segs_in:66 send 2236993737bps lastsnd:9 lastrcv:4 lastack:9 pacing_rate 2683692144bps delivery_rate 2122156352bps delivered:49429 busy:311ms retrans:0/51 dsack_dups:51 reordering:300 reord_seen:156 rcv_space:14480 rcv_ssthresh:64088 minrtt:0.047                                     
ESTAB 0      266148 [::ffff:192.168.1.62]:59606 [::ffff:10.12.152.253]:8008 users:(("java",pid=7870,fd=254)) timer:(on,004ms,0)
         ts sack cubic wscale:7,7 rto:201 rtt:0.889/0.061 ato:40 mss:1448 pmtu:1500 rcvmss:536 advmss:1448 cwnd:291 ssthresh:217 bytes_sent:201549420 bytes_retrans:503904 bytes_acked:200779369 bytes_received:40824 segs_out:139531 segs_in:36139 data_segs_out:139525 data_segs_in:185 send 3791838020bps lastrcv:3 pacing_rate 4547647888bps delivery_rate 3241453728bps delivered:139299 busy:964ms unacked:184 retrans:0/348 dsack_dups:305 reordering:300 reord_seen:13051 rcv_space:14480 rcv_ssthresh:64088 minrtt:0.044   

7.2. 硬盘相关工具命令

下面工具只是主要关注了2个硬盘相关字段,还有很多其他信息。工具放在这里备用,用的时候能第一时间想起来。

lsblk、fdisk、smarctl、/sys/block文件系统、blockdev、lshw、hdparm

1、查看扇区:

yaml 复制代码
# 1、lsblk
[root@localhost test]# lsblk /dev/sda -d -o NAME,PHY-SEC,LOG-SEC
NAME PHY-SEC LOG-SEC
sda     4096     512

# 2、fdisk -l
[root@localhost test]# fdisk -l /dev/sda | grep "Sector size"
Sector size (logical/physical): 512 bytes / 4096 bytes

# 3、smartctl
[root@localhost Service]# smartctl -a /dev/sda | grep "Sector Size"
Sector Sizes:     512 bytes logical, 4096 bytes physical

# 4、hdparm(不适用于NVME接口)
[root@localhost test]# hdparm -I /dev/sda | grep "Sector size"
        Logical  Sector size:                   512 bytes
        Physical Sector size:                  4096 bytes

# 5、/sys/block查看逻辑扇区大小(通常与文件系统相关)
[root@localhost test]# cat /sys/block/sda/queue/logical_block_size
512
# /sys/block查看物理扇区大小(磁盘硬件实际扇区)
[root@localhost test]# cat /sys/block/sda/queue/physical_block_size
4096

# 6、blockdev 查看逻辑扇区大小
[root@localhost test]# blockdev --getss /dev/sda
512
# blockdev 查看物理扇区大小
[root@localhost test]# blockdev --getpbsz /dev/sda
4096

2、是否SSD:

bash 复制代码
# 1、lsblk,ROTA 或者 MODEL型号判断
[root@localhost test]# lsblk -d -o NAME,ROTA,SIZE,MODEL
NAME    ROTA   SIZE MODEL
sda        1  18.2T xx20000NM002H-xxxx33
sdb        1  18.2T xx20000NM002H-xxxx33
sdy        0 476.9G xx512Gxxxxxx
nvme1n1    0 953.9G xx1Txxxxxxxx

# 2、/sys/block文件系统
[root@localhost test]# cat /sys/block/sda/queue/rotational
1

# 3、smartctl 有转速则为HDD
[root@localhost test]# smartctl -a /dev/sda | grep "Rotation Rate"
Rotation Rate:    7200 rpm

# 4、lshw
[root@localhost test]# lshw -class disk -short
H/W path             Device        Class          Description
=============================================================
/0/100/11.5/0.0.0    /dev/sdy      disk           512GB xx512Gxxxxxx
/0/100/1b/0/1        /dev/nvme0n1  disk           960GB NVMe disk
/0/100/1d/0/1        /dev/nvme1n1  disk           1024GB NVMe disk
/0/101/0/0.0.0       /dev/sdb      disk           20TB xx20000xxxxxx-3K
/0/101/0/0.1.0       /dev/sda      disk           20TB xx20000xxxxxx-3K

7.3. 网卡相关工具命令

1、ethtool -S查看统计信息,快速查看是否有网络瓶颈:ethtool -S eth1 | grep -E "discard|error|drop"

下面的网卡队列数和ring buffer数都会影响性能

2、ethtool -l eth1查看网卡队列数(每个队列都是缓存和管理网络数据包的独立通道),ethtool -L设置

多队列支持并发处理数据包,每个队列产生独立的中断(IRQ),可通过中断绑定(smp_affinity)分配到不同CPU核心。

yaml 复制代码
[root@store test]# ethtool -l eth1
Channel parameters for eth1:
Pre-set maximums:
RX:             n/a
TX:             n/a
Other:          1
# 硬件支持的最大队列数(总队列数)(通常与CPU核心数相关)
Combined:       63
Current hardware settings:
RX:             n/a
TX:             n/a
Other:          1
# 当前启用的队列数
# 最佳实践:队列数应与处理网络中断的CPU核心数一致(例如:8队列绑定8个CPU)
Combined:       40

3、检查中断分配:cat /proc/interrupts | grep eth1,中断计数是否均衡在各个CPU上

bash 复制代码
# 设置网卡中断负载均衡。启用irqbalance服务 或者 手动绑定
# 在高吞吐量网络环境中,irqbalance可能会频繁调整中断分配,导致额外的开销,反而影响性能(NUMA、虚拟化环境、低延迟场景建议手动)
1. 遍历/sys/class/net/确定网卡
2. /proc/interrupts里是每个CPU的中断情况,grep网卡查看该网卡对应的中断
3. 从/proc/interrupts里过滤出该网卡对应的中断号列表
(中断号, CPU核心中断计数, 中断控制器类型, 中断触发方式, 设备或中断源名称)(类型列举:timer-系统定时器、rtc0-实时时钟、eth0-网卡、nvme0q0-NVMe硬盘队列、ahci-SATA控制器)
           CPU0       CPU1       CPU2       CPU3   ...   CPU14      CPU15
   0:         64          0          0          0  ...       0          0   PCI-MSI 12582912-edge      eth0
   8:          0          0          0          0  ...       0          0   PCI-MSI 12582913-edge      eth0-TxRx-0
4. 将中断号均衡绑定CPU。可每个中断号依次绑定不同CPU(比如:echo 1、echo 2、echo 4、echo 8到该网卡中断号列表,以达到均衡)
    将中断号为 100 的中断绑定到 CPU0 和 CPU1
    支持中断号绑定多个CPU,示例:echo 3 > /proc/irq/100/smp_affinity  # 3 = 二进制 00000011(CPU0 和 CPU1)

5、ethtool -g eth1 查看网卡环形缓冲区(ring buffer)大小(条目数),-G设置

yaml 复制代码
# 环缓冲区过小会导致在高流量下数据包被丢弃,因为网卡来不及处理。
# 开销:每个缓冲区条目占用约 2KB 内存;增大缓冲区会轻微增加网络延迟,需权衡缓冲区大小与延迟
[root@store test]# ethtool -g eth1
Ring parameters for eth1:
Pre-set maximums:
RX:             4096
RX Mini:        n/a
RX Jumbo:       n/a
TX:             4096
Current hardware settings:
# RX 接收ring buffer数
RX:             512
RX Mini:        n/a
RX Jumbo:       n/a
# TX 发送ring buffer数
TX:             512
RX Buf Len:             n/a
TX Push:        n/a

6、ethtool -k eth1 查看网卡的卸载功能状态,包括RSS是否启用等

8. 扩展工具

8.1. C工具:Compiler Explorer 和 C Insights

1、Compiler ExplorerCompiler Explorer

  • 支持各类语言的编译(C++、go、rust...),选择不同编译器,设置不同选项,进行快速验证
  • 还可以查看汇编输出

2、C++ InsightsC++ Insights

  • 理解编译器怎么处理代码的

8.2. 在线看内核代码:elixir.bootlin

elixir.bootlin

支持函数及变量跳转,支持引用搜索,可灵活选择不同内核版本。

可避免需要查看内核代码时,每次要去打开工程的麻烦。用VS Code的话挺耗资源的,而且每次打开还要等加载代码目录。

8.3. gdb工具:pwndbg

梳理内存分配器时了解到的工具,试了下功能,效果很好。除了覆盖原有的gdb命令,还会显示对应的汇编,配色效果很炫,后续若学习汇编可以用起来。

pwndbg(/paʊnˈdiˌbʌɡ/)是一款基于 GDB 的 Python 调试工具,专为二进制漏洞利用和分析而设计,在 CTF(Capture The Flag)竞赛、漏洞研究以及二进制安全领域应用广泛。

项目仓库:pwndbg

使用方式 :下载项目中打包好的release文件即可使用,如:pwndbg_2025.02.19_x86_64-portable.tar.xz

和gdb一样使用,展示的信息很丰富,还有一些特定功能命令,比如arena查看堆区结构。各个部分可以和tmux配置结合,在不同的窗口展示。

8.4. 画图:draw.io 和 Excalidraw

1、记录下draw.io常用组件的快捷键,用起来也比较丝滑,不过快捷键体验感比较好的还得是Excalidraw。

makefile 复制代码
a: 文本
d: 方框
c: 箭头
f: 圆
r: 菱形
x: 自由绘制

2、draw.io 的几个亮点

  • 动态流图,即文章开头的动图效果
  • 设置默认样式
  • 配色比较美观

本文使用 文章同步助手 同步

相关推荐
未完结小说22 分钟前
服务注册与发现(nacos)
后端
AI智能科技用户79463297828 分钟前
okcc呼叫中心两个sip对接线路外呼任务怎么设置才能一个任务对应yigesip中继?
人工智能·后端
懒虫虫~40 分钟前
Spring源码中关于抽象方法且是个空实现这样设计的思考
java·后端·spring
雷渊1 小时前
DDD的分层架构是怎么样的?
后端
会有猫1 小时前
阿里云OSS挂载到Linux
后端
雷渊1 小时前
聊一聊贫血模型和充血模型区别
后端
瀚海澜生1 小时前
NSQ 深入剖析(一):架构原理与安装实战
后端
大鹏dapeng1 小时前
Gone 框架的服务注册与发现:打造高效微服务架构
后端·go·github
LemonDu1 小时前
线上救急-AWS限频
后端·算法·架构
AronTing2 小时前
装饰模式:动态扩展对象功能的优雅设计
java·后端·设计模式