Server 性能调优

创建时间:2024-11-05 最近修改时间:2024-11-05

#1. deepflow-server 丢包原因排查

  • 影响因素:

    • server 性能瓶颈

      • 通过 DeepFlow Server Dashboard 查看 CPU、内存 瓶颈,如果为跑满,则说明非 server 瓶颈
    • clickhouse 性能瓶颈

      • 通过如下查询语句,判断 clickhouse 写入性能

        -- 单个 clickhouse 的接收性能:
        -- written_rows / (qurey_duration_ms/1000)* server 写⼊线程数(ingester.flow-ck-writer.queue_count)
        
        SELECT event_time,query_duration_ms,written_rows,written_bytes,query
        FROM system.query_log
        WHERE event_time>now()-1000 AND query LIKE '%INSERT INTO%'
        ORDER BY query_duration_ms
        DESC limit 10
        
        1
        2
        3
        4
        5
        6
        7
        8
        -- server 每秒平均写入 clickhouse 数据
        
        SELECT tag_values[1] AS host, AVG(metrics_float_values[4])/10 AS written_per_s, AVG(metrics_float_values[3])/10 AS drop_per_s
        FROM deepflow_system.deepflow_system
        WHERE virtual_table_name='deepflow_server_ingester_ckwriter'
        GROUP BY host
        ORDER BY written_per_s
        DESC limit 30;
        
        1
        2
        3
        4
        5
        6
        7
        8
        -- server 丢包队列查看方式
        
        SELECT tag_values[1] AS host, tag_values[3] AS queue, AVG(metrics_float_values[1])/10 AS avg_total_per_s, AVG(metrics_float_values[2])/10 AS avg_handled_per_s, AVG(metrics_float_values[3])/10 AS avg_drop_per_s
        FROM deepflow_system.deepflow_system
        WHERE virtual_table_name='deepflow_server_ingester_queue' AND time > now()-900
        GROUP BY host,queue
        ORDER BY avg_drop_per_s,avg_total_per_s
        DESC limit 30;
        
        1
        2
        3
        4
        5
        6
        7
        8
  • 查看 server 向 clickhouse 写入时丢包量:

    |   队列名                                                  |   队列数量配置                        |   队列长度配置                              |   队列说明                |
    |   ---                                                    |   ----                                |          ---                               |    ----                  |
    |   1-recv-unmarshall                                      |   unmarshall-queue-count              |          unmarshall-queue-size             |    指标数据处理队列       |
    |   1-receive-to-decode-l4/l7                              |   flow-log-decoder-queue-count        |          flow-log-decoder-queue-size       |    流日志处理队列         |
    |   1-receive-to-decode-telegraf/prometheus/deepflow_stats |   ext-metrics-decoder-queue-count     |          ext-metrics-decoder-queue-size    |    其他数据处理队列       |
    |   1-receive-to-decode-profile                            |   profile-decoder-queue-count         |          profile-decoder-queue-size        |    性能分析数据处理队列    |
    |   1-receive-to-decode-proc_event                         |   perf-event-decoder-queue-count      |          perf-event-decoder-queue-size     |    IO等事件的处理队列      |
    |   1-receive-to-decode-raw_pcap                           |   pcap-queue-count                    |          pcap-queue-size                   |    pcap包处理队列         |
    |   flow_metrics- 前缀                                     |   metrics-ck-writer->queue-count      |          metrics-ck-writer->queue-size      |    指标数据写入队列       |
    |   flow_log-l7_packet 前缀                                |   pcap-ck-writer->queue-count         |          pcap-ck-writer->queue-size         |    pcap数据写入队列       |
    |   flow_log- 前缀除flow_log-l7_packet                     |   flowlog-ck-writer->queue-count      |          flowlog-ck-writer->queue-size      |    流日志数据写入队列      |
    |   ext_metrics- 前缀                                      |   ext_metrics-ck-writer->queue-count  |          ext_metrics-ck-writer->queue-size  |    其他数据写入队列        |
    |   profile- 前缀                                          |   profile-ck-writer->queue-count      |          profile-ck-writer->queue-size      |    性能分析数据写入队列    |
    
  • 其余类型丢包处理方式:

    类型 指标集 指标
    队列丢包 ingester.queue metrics.overwritten
    流⽇志采样丢包 ingester.decoder metrics.drop_count
    数据写⼊丢包 ingester.ckwriter metrics.write_failed_count
    收到⽆效数据丢包 ingester.recviver metrics.invalid
    • 流⽇志采样丢包处理:
      • 通过 Dashboard: DeepFlow Server - Ingester 中 flow log(throttle-drop) 面板查看相应队列丢包量
      • 默认 l4/l7 流日志处理为 5w/s,若 cpu、内存、磁盘充足,可调大 throttle 增加处理能力
      • 通过调整数据节点 Ingester (opens new window) 模块配置参数,增大处理能力避免丢包
    • 数据写入丢包处理:
      • 过滤 server 日志 write block failed 可查看写入失败原因
      • 如使用 pv,则查看后端存储是否还有可用空间
      • 如使用 hostPath,则查看本地磁盘是否还有可用空间
    • 收到⽆效数据丢包:
      • 过滤 server 日志 TCP client 可以获取⽆效数据发送者的 IP 地址
        • 若是 DeepFlow-Agent 发送,则确认 DeepFlow-Agent 和 DeepFlow-Server 版本是否一致
        • 若⾮ DeepFlow-Agent 发送,则禁⽌该 IP 发送数据到数据节点的监听端⼝ (默认: 30033),也可提⾼该告警阈值,屏蔽此类 IP 发送数据产⽣的告警

#2. 简介

通过 Golang Profile (opens new window),我们可以捕获 DeepFlow Server 的数据写入性能进行分析并优化。

#3. 步骤

  1. 安装 deepflow-ctl 工具。
  2. 找到需要 Profile 分析的 DeepFlow Server Pod IP,如果 DeepFlow Server 的副本数大于 1,从中挑任意一个即可:
deepflow_server_pod_ip=$(kubectl -n deepflow get pods -o wide | grep deepflow-server | awk '{print $6}')
1
  1. 开启 Profile 功能:
deepflow-ctl -i $deepflow_server_pod_ip ingester profiler on
1

#4. 获取 CPU Profile

go tool pprof http://$deepflow_server_pod_ip:9526/debug/pprof/profile
1

执行命令后,默认采样时间为 30s,可通过 http://$deepflow_server_pod_ip:9526/debug/pprof/profile?seconds=60 即带上 seconds=x 参数修改 Profile 时长,Profile 结束后,可输入 svg 命令生成矢量图格式的 Profile 结果图,并复制到本地通过浏览器查看。

#5. 获取 Memory Profile

go tool pprof http://$deepflow_server_pod_ip:9526/debug/pprof/heap
1

执行命令后,会进行实时采样,获取当前的内存快照,然后同样可输入 svg 命令生成矢量图格式的 Profile 结果图,并复制到本地通过浏览器查看。

#6. 其他 Profile 信息

如果还想获取其他 Profile 信息,可在 Golang SourceCode (opens new window) 找到所有可供分析的类型。