[FR] DeepFlow 内存占用问题
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
ClickHouse
Agent
b. 存储
1.3 Final
这个集群的业务负载为 1c1.5g,Deepflow 的内存占用是业务负载的 3 倍以上
为了节约资源,已经修改 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
b. 存储
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
- [X] I agree to follow this project's Code of Conduct
@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 来看看内存热点。
@lzf575 @taloric 看看 demo 环境下 deepflow-server 和 deepflow-app 的内存是否有优化空间?
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 核数)
@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 来看看内存热点。
- 这个“50-100个业务节点,需要1台server跑deepflow”结论,是基于这些业务节点上运行多少个业务容器副本,所进行的推算呢?
- “50-100个业务节点,需要1台server跑deepflow”,这台server上可以跑deepflow的所有组件吗,比如:同时运行deepflow-server和clickhouse
- 50个业务节点以下的场景,运行deepflow的主机,有配置建议吗?比如:20个节点,deepflow主机8c32G可以吗? 谢谢
关于存储的压缩预估,我通过sql查询到的l7_flow_log_local表压缩前占用187G,如下图:
但为何我去clickhouse容器挂载的pvc所对应的宿主机/var/openebs/local/pvc-cb8b4a7c-a9ec-4c51-8b86-4b06a901ba97下,du看store目录只占用了57G呢
@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 来看看内存热点。
- 这个“50-100个业务节点,需要1台server跑deepflow”结论,是基于这些业务节点上运行多少个业务容器副本,所进行的推算呢?
我们一般看到的是 10~30 个 Pods/Node。不过这里其实和 Pod 的数量没有太大关系,我们的预估方法是「业务节点的规格是 x vcpu y mem」的话,deepflow-server 使用同样规格的节点,此时是 50:1 ~ 100:1。
因此考虑到节点规格的话,pod 数量可能并不关键。
- “50-100个业务节点,需要1台server跑deepflow”,这台server上可以跑deepflow的所有组件吗,比如:同时运行deepflow-server和clickhouse
对,所有组件。
- 50个业务节点以下的场景,运行deepflow的主机,有配置建议吗?比如:20个节点,deepflow主机8c32G可以吗? 谢谢
50 个业务节点的话,我觉得可以用 3 个 node 跑 deepflow server 即可,节点规格稍微可以取业务节点的 1/2。 这样的话算力的比例大概是 50:1.5,当挂掉一个 node 时算力的比例是 50:1。