资讯动态

NAT网关异步日志优化:DPDK无锁队列性能实测

发布时间:2026/9/24 20:36:37 来源:尧图企业网站定制
背景ops的nat网关需要保存每次连接建立的日志记录在ops的部署环境下连接并发量比较大如果由转发core直接进行io操作会明显降低系统的转发性能。因此需要考虑将这个压力转移到非转发core上减少转发core的io操作这样就需要异步日志。aisa需要收集流量日志也需要相同的方法量更大压力更大同样需要交给别的core进行io。dpdk无锁队列是基于大页内存设计的具有比较好的性能dpvs利用无锁队列实现了异步日志。由于io操作变为了内存读写因此会提高转发core的性能。但是这种异步操作存在读写差异的速率差转发core是内存写但处理日志的core则是内存读然后io操作很显然处理日志的core会比转发core要慢。测试方案模拟最极端的情形由master向无锁队列不断的写入数据队列满了就等等然后日志处理的core进行消费保证写入不丢然后看每秒究竟可以处理多少日志每次写入的日志长度都差不多格式相同符合ops新建日志的场景。由于dpdk无锁队列分为四种单生产者单消费者sc|sp多生产者单消费者sc单生产者多消费者sp多消费者多生产者其中单生产者单消费者理论上没有资源竞争是性能最高的模式以它作为基准而单生产者多消费者模式因为转发core是多个所以不会用到这种模式。同时我们也针对gcc的优化选项进行一个测试比较结果如下|编译方式|单生产者单消费者sc|sp|多生产者单消费者sc|多消费者多生产者|| — | — | — | — ||-O3优化日志不输出|825960|803748|789805||-O0优化日志不输出|601277|587582|591950||-O3优化日志输出到文件|836531|803651|813643||-O0优化日志输出到文件|609254|590513|586667||-O0优化日志输出到stdout|-|-|23749|单核下可以看到基本上无锁队列的极限性能大约就是80w左右开启-O3优化会带来36%左右的性能提升单生产者比多生产者性能稍高但是差距并不巨大。上面是仅有master核写入的情况也就是不管队列是什么形式总是只有master在写入其他不写入的情形。为了真实再补充一组真正由多个转发core一起写入的情况也就是dpvs标准的异步日志。测试环境起了8个转发core只有一个core消费日志。|编译方式|多生产者单消费者sc|| — | — ||-O0优化日志输出到文件|1959404||-O3优化日志输出到文件|2601137|这里有一个问题理论上单核读取实际上没有变化但为什么都是尽可能多的写入多核写入和单核写入对于无锁队列来说会产生那么大的性能差异呢提升了一倍多理论上写入端的速率高于读取端那就应该读取端是性能瓶颈也就是读取端没法及时把队列中的消息读走导致队列满了才会导致写入端写不进去跟写入端的数量应该没关系才对。个人理解是这样子因为我们发送日志是循环发送的一旦检查日志队列已经满了就会执行一次continue的跳转因为这次跳转消费端已经把消息消费掉了这时候就可以继续发送了但是发送端要等到下一个循环重新检查才会发现可以继续发送所以中间就产生了一定的间隙。而当多核发送的时候一个核检查发现队列满进行continue的时候另一个核可能检查的时候队列已经被消费过了所以另一个就可以继续写入这个间隙会随着生产者的增多被浪费的越来越少于是有了上面的现象。日志优化dpvs社区版本只使用一个核进行日志输出我想是因为日志文件是单个不想引入文件锁因为本来日志输出核的写入就费时再加个文件锁效率就更低了并且日志是需要有一定顺序的单核能保证这个顺序。但这都是基于通用情形而言具体到ops的场景因为它是针对保存连接建立日志的一个强需求而dpvs为了提高处理效率对连接做了分核处理以此来避免使用锁这样做使得对于一个连接来讲它相关的日志就只会出现在一个核上换句话说同一个连接产生的日志即使是在全局多个日志文件的情景下依然是相对保序的。鉴于此我们可以让每一个转发核对应一个日志输出核这样可以达到理论上的日志输出最优。不考虑多文件句柄在操作系统层面的IO性能这样无锁队列可以采用scsp单一生产者-单一消费者模式从最开始的性能测试来看这是无锁队列效率最高的模式每条线都是相对独立的没有资源竞争理论上可以达到最大吞吐。测试结果|编译方式|8核心|4核心|单核心|| — | — | — | — ||-O3优化日志输出到文件|4638113|4615216|1021821||-O0优化日志输出到文件|3891251|3873803|826875|可以看到似乎4核心就是最好效果了再继续增加也不会有明显提高。结论1.无锁队列在单一生产者单一消费者模式下性能最高多生产者或者多消费者模式下均有性能降低但幅度不算大2.在并发核数不多的情形下性能是接近线性增长的但到了某个时候每个核的性能都会降低怀疑是系统io的性能瓶颈3.程序编译的O3优化选项对性能有大约30%的提升但是-g选项似乎只影响编译以后得到的二进制可执行文件的大小并不影响性能。开启-O3是有必要的-g则无所谓但是为了方便调试建议开启即使是release版本也建议开启。4.社区异步日志当前性能能达到总体200w向上对于ops环境下通常新建连接数在12w的情形来说应该是足够使用了正常不需要打开多文件输出除非必要。360智汇云是企业智数云底座以智-数-云三大核心底座为支柱以贯穿全程的 “观测与管控” 为神经中枢全链路赋能企业数智基建在 “用、运、管、看、维” 五维生命周期中实现价值闭环。提供数据库、中间件、存储、大数据、人工智能、计算等多种产品服务以及一站式解决方案让每一份IT投入都转化为智能生产力。官网https://zyun.360.cn

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑