deepflow icon indicating copy to clipboard operation
deepflow copied to clipboard

[FR] DeepFlow 内存占用问题

Open ZhuoZhuoCrayon opened this issue 1 year ago • 6 comments

Search before asking

  • [X] I had searched in the issues and found no similar feature requirement.

Description

1. 某业务环境

1.1. 环境信息

  • 两个节点(共 16c24g)
  • 每分钟 20w gPRC 请求

1.2 资源占用情况

a. CPU / MEM

Total: 1.5c5g(只算了 Server / Agent / CK)

Server image

ClickHouse image

Agent image

b. 存储

image

image

1.3 Final

这个集群的业务负载为 1c1.5g,Deepflow 的内存占用是业务负载的 3 倍以上

image

为了节约资源,已经修改 Agent 配置,尽可能不采不关注的数据,但最后依然占用整个集群近 25% 的内存。

vtap_group_id: xxx
vtap_flow_1s_enabled: 0
capture_bpf: "not (tcp port 4317 or tcp port 12520)"
static_config:
  ebpf:
    # 关闭 Profiling
    on-cpu-profile:
      disabled: true
  l7-protocol-enabled:
    - HTTP2
    - MySQL
    - Redis
    - Kafka
    - MQTT
    - DNS
    - TLS
  # 仅针对指定端口解析指定协议,此处主要是为了过滤掉 Deepflow MySQL 的请求
  l7-protocol-ports:
    "MySQL": "3306"
    "DNS": "53,5353"

2. demo 环境

2.1 资源占用情况

a. CPU / MEM

Total: 0.6c5g

image

b. 存储

image

image

2.2 Final

看起来一个一天记录几个 G 的环境,也需要 5g 左右的内存

Use case

3. 问题

  • Agent 的内存消耗是否有优化空间?:看起来 Agent 至少需要 200~300M 的内存
  • 是否有性能分析文档,内存占用分布情况如何,要怎么针对性优化?

Related issues

No response

Are you willing to submit a PR?

  • [X] Yes I am willing to submit a PR!

Code of Conduct

ZhuoZhuoCrayon avatar Jul 08 '24 02:07 ZhuoZhuoCrayon

@ZhuoZhuoCrayon 从你的描述来看,我感觉资源的大头在 server 端(deepflow-server、clickhouse-server)。

我们的经验值是,平均监控 50~100 个单位(50~100 x 16c64g)的业务节点需要 1 个单位的 server(1 x 16c64g)节点。当业务开销很小时,一些 deepflow-server 和 clickhouse-server 的基础开销会显得资源占用过多。

对于 deepflow-server,可以使用 https://github.com/deepflowio/deepflow/blob/main/docs/how-to-profile-server.md#go-pprof-tool-is-used-to-profile-deepflow-server-once 里提到的 go pprof tool 来看看内存热点。

sharang avatar Jul 08 '24 04:07 sharang

@lzf575 @taloric 看看 demo 环境下 deepflow-server 和 deepflow-app 的内存是否有优化空间?

sharang avatar Jul 08 '24 04:07 sharang

deepflow-app 在 v6.5 版本后可以在 config map 里加上 worker_numbers 配置来限制启动的子进程数,配置修改位置和具体配置形如:

kubectl get cm -n deepflow deepflow
app:
  worker_numbers: 4

此配置默认值是10,可根据实际环境中分配的 cpu 数来配置。在 6.5 性能优化期间发现相当大的内存占用是由于创建了太多子进程,但在并发吞吐上这些子进程并没有贡献太大的收益。所以可以先降低创建的工作进程数,按需分配(1<=worker_numbers<= 分配的 cpu 核数)

taloric avatar Jul 08 '24 05:07 taloric

@ZhuoZhuoCrayon 从你的描述来看,我感觉资源的大头在 server 端(deepflow-server、clickhouse-server)。

我们的经验值是,平均监控 50~100 个单位(50~100 x 16c64g)的业务节点需要 1 个单位的 server(1 x 16c64g)节点。当业务开销很小时,一些 deepflow-server 和 clickhouse-server 的基础开销会显得资源占用过多。

对于 deepflow-server,可以使用 https://github.com/deepflowio/deepflow/blob/main/docs/how-to-profile-server.md#go-pprof-tool-is-used-to-profile-deepflow-server-once 里提到的 go pprof tool 来看看内存热点。

  1. 这个“50-100个业务节点,需要1台server跑deepflow”结论,是基于这些业务节点上运行多少个业务容器副本,所进行的推算呢?
  2. “50-100个业务节点,需要1台server跑deepflow”,这台server上可以跑deepflow的所有组件吗,比如:同时运行deepflow-server和clickhouse
  3. 50个业务节点以下的场景,运行deepflow的主机,有配置建议吗?比如:20个节点,deepflow主机8c32G可以吗? 谢谢

yujianweilai avatar Aug 16 '24 04:08 yujianweilai

关于存储的压缩预估,我通过sql查询到的l7_flow_log_local表压缩前占用187G,如下图: image 但为何我去clickhouse容器挂载的pvc所对应的宿主机/var/openebs/local/pvc-cb8b4a7c-a9ec-4c51-8b86-4b06a901ba97下,du看store目录只占用了57G呢 image

yujianweilai avatar Aug 16 '24 06:08 yujianweilai

@ZhuoZhuoCrayon 从你的描述来看,我感觉资源的大头在 server 端(deepflow-server、clickhouse-server)。 我们的经验值是,平均监控 50~100 个单位(50~100 x 16c64g)的业务节点需要 1 个单位的 server(1 x 16c64g)节点。当业务开销很小时,一些 deepflow-server 和 clickhouse-server 的基础开销会显得资源占用过多。 对于 deepflow-server,可以使用 https://github.com/deepflowio/deepflow/blob/main/docs/how-to-profile-server.md#go-pprof-tool-is-used-to-profile-deepflow-server-once 里提到的 go pprof tool 来看看内存热点。

  1. 这个“50-100个业务节点,需要1台server跑deepflow”结论,是基于这些业务节点上运行多少个业务容器副本,所进行的推算呢?

我们一般看到的是 10~30 个 Pods/Node。不过这里其实和 Pod 的数量没有太大关系,我们的预估方法是「业务节点的规格是 x vcpu y mem」的话,deepflow-server 使用同样规格的节点,此时是 50:1 ~ 100:1。

因此考虑到节点规格的话,pod 数量可能并不关键。

  1. “50-100个业务节点,需要1台server跑deepflow”,这台server上可以跑deepflow的所有组件吗,比如:同时运行deepflow-server和clickhouse

对,所有组件。

  1. 50个业务节点以下的场景,运行deepflow的主机,有配置建议吗?比如:20个节点,deepflow主机8c32G可以吗? 谢谢

50 个业务节点的话,我觉得可以用 3 个 node 跑 deepflow server 即可,节点规格稍微可以取业务节点的 1/2。 这样的话算力的比例大概是 50:1.5,当挂掉一个 node 时算力的比例是 50:1。

sharang avatar Aug 21 '24 10:08 sharang