Files
geedge-jira/md/OMPUB-1339.md
2025-09-14 21:52:36 +00:00

140 lines
7.4 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 新疆实验局功能端处理100Gbps+流量traffic skech相关接口单核占用超过30%
| ID | Creation Date | Assignee | Status |
|----|----------------|----------|--------|
| OMPUB-1339 | 2024-06-24T18:21:00.000+0800 | 陈子瞻 | 开放 |
---
CPU Intel 6338
MEM 1TB
Worker47 cores
Traffic110~120Gbps
[^traffic_sketch.perf.svg]
单核火焰图如下所示整体占用已经接近100%排名靠前的接口与heavy keeper相关
^!image-2024-06-24-18-18-50-191.png|width=610,height=379!^**gitlab** commented on *2024-10-14T14:40:33.159+0800*:
[陈子瞻|https://git.mesalab.cn/chenzizhan] mentioned this issue in [a commit|https://git.mesalab.cn/tsg/tsg-os-buildimage/-/commit/d9e74a817fe093f682dd836da7c823786169a9b7] of [TSG / tsg-os-buildimage|https://git.mesalab.cn/tsg/tsg-os-buildimage] on branch [fs4.6.7|https://git.mesalab.cn/tsg/tsg-os-buildimage/-/tree/fs4.6.7]:{quote}OMPUB-1339 fs4.6.7{quote}
---
**gitlab** commented on *2024-10-14T14:41:25.405+0800*:
[陈子瞻|https://git.mesalab.cn/chenzizhan] mentioned this issue in [a merge request|https://git.mesalab.cn/tsg/tsg-os-buildimage/-/merge_requests/2760] of [TSG / tsg-os-buildimage|https://git.mesalab.cn/tsg/tsg-os-buildimage] on branch [fs4.6.7|https://git.mesalab.cn/tsg/tsg-os-buildimage/-/tree/fs4.6.7]:{quote}OMPUB-1339 fs4.6.7{quote}
---
**chenzizhan** commented on *2024-10-14T16:33:38.782+0800*:
h2. 优化说明
h2. 版本
在环境中的是4.5.10 版本本次性能优化仅在4.6.7 的更新版本中。在老版本上优化没有太大意义。把版本升级到24.10 以应用性能优化。
h2.  
h2. 分析
h3. 是否对一次操作的反复查找进行优化
注意到“添加非primary 的metric没有找到cell然后添加一个新cell 成功“的cube 操作分支上有冗余的哈希查找操作可以把这个分支上的3次HASH_FIND 调用优化最激进可以优化到1次。
使用模拟生成的流量进行了测试测试环境192.168.40.40使用版本fieldstat4.6.5。分别统计了fieldstat topk cube 上操作的4个分支的总次数所谓总次数就是全部线程、全部cube、全部metric、全部cell 上的次数均在一起统计,使用全局变量实现)。
分别使用1500并发 2G 流量1500并发 5G 流量和2700并发 2G 流量进行了测试。次数占比的定义是操作满100万次后printf 打印运行情况,进入分支个数占统计个数总数的比值。
得到结果是:
"添加非primary 的metric 并找到了cell" 分支: 在测试开始初期占比较少之后迅速稳定到80%~87%之间分别对应3000并发会话和1500并发会话。
"添加primary 的metric"分支:                      占比17%左右
这两个分支占据了几乎全部的分支。添加非primary 的metric且没有找到cell后添加dummy cell{*}成功{*}占比在1%左右,而添加失败的分支则个数非常少,以至于在实验中没有发生过关于它的报警。
 
注意此时TopK 的参数为K=1000理论上应当有更多的cell 作为小流量没有储存在heavy keeper中。我认为这是reset 的作用效果它使得并发的流量个数还不足以在1秒内填满heavy keeper。然而因为测试仪器的性能限制这个流量大小已经是能测试的极限。但是哪怕再增加流量大小添加dummy cell 成功分支的占比只会更小所以我们已经可以通过这样的情况估计“添加非primary 的metric且没有找到cell后添加dummy cell{*}成功{*}”分支的占比很小,没必要对这一分支上的冗余调用做优化。
因为优化会影响函数的调用逻辑,让查找和分配接口的职责不清晰,而另一方面,涉及到的问题分支的占比很小。对代码美观和接口设计的负面影响大于对性能的提高,所以不进行优化。
h3. 是否开启uthash BLOOM filter 功能
按照讨论时的指标在新疆实验局的流量中并发会话数可达10万而调用fieldstat_counter_incrby 的频率是固定每秒一次和会话的流量几乎无关。那么绝大多数调用时在哈希表中查找时应该都是找不到这说明似乎BLOOM FILTER 可以大大加速这个查找不到的分支因为根据火焰图必有一次的hash find 占据了相当大的比重。见下图的get_exdata 部分,这个函数代表了仅查找而不添加的情况的占比。
[^百分比.png]
[^0.svg]
然而BLOOM filter 是不会被清空的而且也不能被清空。因为在reset 的时候heavy keeper 内的元素不是被从哈希表中删除而是被设置为dying 状态所以reset 也不是清除掉uthash table 中内置bloom filter sketch  的时机。一个越填越满的bloom filter 最终会失去效果,成为运行的负担。
因此,结论是不开启。
也许额外自己实现一个可删除的bloom filter它涉及到对ut hash 内部函数的修改工作量较大且风险高。在运行时间较短且流量并发数远大于cube容量的测试程序中开启了BLOOM_FILTER 宏性能仅提高了7% 左右,衡量工作量和优化难度,决定不进行此优化。
h3. 是否解决重复运算哈希值的问题
因为XXhash 类运算占火焰图比重很低只占7%左右实际上多数分支上也只进行了一次哈希值运算所以优化后的性能提升肯定还远小于7%。而为了优化这个问题必将引入一个结构体会破坏heavy keeper 和 spread sketch API定义的美观性所以不进行优化。
h3. 瓶颈究竟在哪?
分析火焰图占比heavy_keeper_add 函数缺乏可以优化的点它单纯是完整的一个算法流程多个函数均占有一定比重没有明显的性能瓶颈。get0_exdata 接口本身就是一个HASH_FIND提高它一次调用的性能无从下手可是也许可以从降低其调用次数触发。
结合https://jira.geedge.net/browse/TSG-22728 中给出的指标一个会话在调用节点居然要针对同一个dimension进行174次fieldstat_counter_incrby 调用做同样的dimension拼接同样的哈希值计算174次这里才是影响性能的关键。这174次的组成是
对于TOPK-METRIC:
     对于24个cube的每个cube
         对于每个cube中的7个metric
                调用fieldstat_counter_incrby
DOS-SKETCH-METRIC同上对2个cube3个metric调用6次。
 
h2. 方案
h3. 暂不修改struct field 定义
如果修改struct field 的定义方式则可以把174次的拼接和哈希值计算缩减为1次。但是这个修改会直接不兼容的改变接口。而且实际上拼接tag 只占了火焰图的14.5%似乎为了这14.5%的性能提升,完全修改接口调用方式也没有太大必要。
h3. 对一个cube 上的重复cell 查找做cache
至少对同一个cube 上若干在产品中是7次次cell 的查找可以缩短为一次。在cube上添加了struct cached_cell每次查找cell时就先寻找是否是上一次传入的dimension如果是就直接使用上一次的cell指针对于primary metric重新得到了新的cell指针的情况会直接清空cache同样的还有merge和reset等影响记录内容的操作
 
 
 
 
 
---
## Attachments
**63509/0.svg**
---
**59292/image-2024-06-24-18-18-50-191.png**
---
**59293/traffic_sketch.perf.svg**
---
**63508/百分比.png**
---