Agent 性能调优

创建时间:2024-04-25 最近修改时间:2024-06-24

本文介绍如何对 DeepFlow Agent 配置以降低 CPU、内存开销,或提升 Agent 的处理能力。其中标记 $ 的配置项一般效果比较显著。

#1. 降低内存开销

#1.1 关闭不需要的数据

配置项 数据 说明
$ obfuscate-enabled-protocols MySQL、PostgreSQL、Redis 数据脱敏 开启脱敏后调用日志中不会包含变量,可减小 request_resource 长度,特别是开启 Redis 脱敏效果显著 (opens new window)
$ tap_interface_regex AF_PACKET/cBPF 数据 默认采集 Pod NIC、Loopback NIC 等,可按需精简,以降低采集流量大小
capture_bpf AF_PACKET/cBPF 数据 默认为空,表示一个网卡的所有流量都采集,支持填写 BPF 表达式 (opens new window)以降低采集流量大小

更多此类配置项请参考:降低存储压力

#1.2 降低原始数据的长度

配置项 作用 说明 调整副作用
$ capture_packet_size AF_PACKET/cBPF 采集包长度 默认 64K,可按需降低为等于 l7_log_packet_size 调小会影响企业版流量分发功能
$ l7_log_packet_size 进行应用协议解析的字节数 对 AF_PACKET/cBPF、eBPF 采集数据均生效,表示截取多少字节进行协议解析 调小可能影响调用日志的 TraceID/SpanID 等字段解析

#1.3 降低内存缓冲区大小

注意:调小此类参数会降低突发流量的缓冲能力。若调小引发了丢数据告警,需要适当增大。

配置项 作用 说明
$ afpacket-blocks AF_PACKET/cBPF 数据缓冲区大小 默认为 max_memory/16 且不超过 128MB,注意此配置项一般要结合 afpacket-blocks-enabled 一起使用
$ ebpf.ring-size eBPF 数据缓冲区大小 默认 64K,每一个为 l7_log_packet_size 字节,即默认 64MB
analyzer-raw-packet-block-size AF_PACKET/cBPF 数据缓冲区大小 仅针对企业版专属采集器
flow-buffer-size PCAP 组装缓冲区大小 仅用于企业版 PCAP 下载功能,每一个需要采集 PCAP 的 l4_flow_log 都会在内存中开辟一个此尺寸的缓冲区
packet-sequence-block-size TCP 包头缓冲区大小 仅用于企业版 TCP 时序图功能,每一个 l4_flow_log 都会在内存中开辟一个此尺寸的缓冲区
grpc-buffer-size gRPC 缓冲区大小 用于 agent 和 server 的控制面通信,调小可能导致调用 server RPC 失败,默认 5MB

#1.4 降低内存队列尺寸

注意:调小此类参数会降低突发流量的缓冲能力。若调小引发了丢数据告警,需要适当增大。

配置项 作用 说明
flow-queue-size 内存缓冲队列大小 默认 64K 长度,队列满时最大可能占用 32MB 内存,用于线程间传递流日志、调用日志
flow-aggr-queue-size 内存缓冲队列大小 默认 64K 长度,队列满时最大可能占用 32MB 内存,用于线程间传递秒粒度流日志
flow-sender-queue-size 内存缓冲队列大小 默认 64K 长度,队列满时最大可能占用 32MB 内存,用于线程间传递流日志、调用日志
flow-sender-queue-count 内存缓冲队列数量 默认 1 个,增大会提升发送观测信号的能力,但会增大内存消耗
quadruple-queue-size 内存缓冲队列大小 默认 64K 长度,队列满时最大可能占用 32MB 内存,用于线程间传递流日志
collector-sender-queue-size 内存缓冲队列大小 默认 64K 长度,用于线程间传递所有待发送的观测信号
collector-sender-queue-count 内存缓冲队列数量 默认 1 个,队列满时最大可能占用 32MB 内存,增大会提升发送观测信号的能力,但会增大内存消耗
toa-sender-queue-size 内存缓冲队列大小 默认 64K 长度,队列满时最大可能占用 4MB 内存,用于线程间传递需要发送给 Server 的 TOA(TCP Option Address)信息
packet-sequence-queue-size 内存缓冲队列大小 仅企业版 TCP 时序图功能,默认 64K 长度,队列满时最大可能占用 128*packet-sequence-block-size 字节内存,用于线程间传递 TCP 包头
$ analyzer-queue-size 内存缓冲队列大小 仅企业版专属采集器,默认 128K 长度,队列满时最大可能占用 128*capture_packet_size 字节内存,用于线程间传递原始流量
$ pcap.queue-size 内存缓冲队列大小 仅用于企业版 PCAP 下载功能,默认 64K 长度,队列满时最大可能占用 128*capture_packet_size 字节内存,用于线程间传递原始流量

#1.5 降低哈希表尺寸

除了 flow.flow-count-limit 以外,其他配置项的收益较低,一般不建议调整。

配置项 作用 说明
$ flow.flow-count-limit l4_flow_log 哈希表的总大小 默认 64Kx2(cBPF 和 eBPF 各一个表),每个条目大约 1500B,即默认最大占用 192MB
flow.flow-slots-size l4_flow_log 哈希表的哈希槽大小 用于网络流聚合
fast-path-map-size AutoTagging 快表尺寸 默认会根据 max_memory 自动调整
toa-lru-cache-size TOA(TCP Option Address)的 LRU 尺寸 默认 64K

#2. 降低 CPU 开销

TODO