共计 2967 个字符,预计需要花费 8 分钟才能阅读完成。
(预计浏览工夫:6 分钟)
最近,TuGraph 团队发展了一项令人振奋的优化工作,胜利将 Antlr4 C++ target 的并发性能晋升超过 10 倍!这一优化计划已被 Antlr4 开源社区激情接收,将给寰球的 Antlr C++ 生态开发者带来更好的应用体验。PR 地址:
https://github.com/antlr/antlr4/pull/4237
图查问引擎是一种用于查问图数据库的工具,它应用特定的查询语言(如 Cypher 或 ISO GQL)来执行和操作图数据库。这些查询语言容许用户形容图模式并查问图数据,例如查找特定节点或查找节点之间的门路。
对于 Antlr4
Antlr4 是一款备受欢送的开源解析器生成器,可能依据语法规定疾速生成自定义解析器。其反对 LL(*)解析,领有更弱小的错误处理能力和更快的解析速度。不仅如此,Antlr4 还反对 Java、Python、C++、JavaScript、Go 等 10 种目标语言,广泛应用于多种开发语言生态中。简略易用的 API 和文档使得开发人员可能疾速上手。无论是编程语言、数据格式、编译器还是解释器等畛域,Antlr4 都施展着重要作用。
驰名的开源我的项目如 Apache Spark、Eclipse IDE 和 MongoDB 等都抉择了 Antlr4。对于语言工具开发者而言,Antlr4 是不可或缺的工具,能大幅提高开发效率和代码品质。
当 TuGraph 遇见 Antlr4
ISO GQL(ISO/IEC 39075)是一种标准化的图数据库查询语言,蚂蚁团体是其次要贡献者之一。因而,Antlr4 作为一种弱小的解析器生成器,成为了蚂蚁图数据库 TuGraph 生成 GQL 解释器的现实抉择。Antlr4 可能帮忙团队更快、更精确地构建图数据库的查询语言,从而进步产品性能和用户体验。
然而,当咱们从开发场景来到生产场景,超高的并发量带来一个重大问题:Antlr4 C++ target 的并发性能不足以反对所需的超高并发 GQL 申请。通过调研并与 Antlr 开源社区探讨,咱们发现 并发性能这个问题普遍存在,并且在过来 5 年中继续困扰着 C ++ 生态的开发者。咱们决定解决这个问题。
咱们做了哪些工作
在调研探讨的过程中咱们发现,多位开发者在论坛提出其耗时甚至多于 Java target 数倍之多,见文末参考【1,2,3,4】。因而,咱们决定从问题和开源代码登程,来定位、解决问题。
这是一个典型的并发程序优化问题,依据以往的程序优化教训,咱们分步推动该问题的解决:
(1)辨认问题
通过对程序运行时的性能数据进行收集和剖析,咱们找到了程序运行瓶颈所在,通过调用剖析,初步将问题定位为数据竞争导致的并发问题。
(2)深刻浏览 Antlr4 开源代码
接下来,咱们对 Antlr4 的源代码进行认真的浏览和了解,把握其外部的构造和外围逻辑,找出了外围的数据结构和要害的调用链路。为咱们破解性能难题和剖析批改的正确性做好了筹备。
(3)梳理数据竞争链路
根据上述剖析,咱们判断问题的症结极大概率是数据竞争造成的。造成数据竞争至多有两个条件:一是线程之间共享内存数据,二是至多存在两个线程去读写某个共享内存。
进一步地,咱们通过分析程序中的并发拜访状况,找到了可能引发数据竞争的所有代码段和共享变量(次要为 DFA、ATN 等构造),拼接出了数据竞争的残缺链路。
(4)破解数据竞争问题
数据竞争问题是多线程程序中常见而又简单的问题,能够思考通过破解多种竞争条件来解决。就本文问题来说,也存在多种破解计划抉择,如何制订最优的解决方案是一项极具挑战的工作,次要难点有两个:
(i)保障批改后程序的正确性 / 稳定性
(ii)保障计划的有效性(低成本)
重复推演后,咱们抉择了提交给社区的优化计划(PR 地址见参考【6】),即通过扭转要害数据的 ownership 接触对锁的依赖。针对上述两个难点的剖析如下:
通过源码剖析并与开源社区探讨,咱们确认要害数据结构的初始化构建是十分耗时的,但能够通过“只调用一次”(\`call_once\`)伎俩将老本均摊,而后续的增量构建绝对开销较低,并且也可均摊。因而该优化计划的低工夫老本是能够保障的。
对于程序正确性的保障,咱们通过双重验证来保障。首先在设计之初咱们曾经从源代码角度,推断出共享数据依然是平安的,其次咱们也设计了试验对此进行了验证,验证后果与咱们的剖析统一(见下图)。
奉献和成绩
优化的成果非常显著,32 线程的并发性能晋升超过 18 倍 ,如下图所示(16 外围 CPU 测试平台,性能测试代码仓库见【5】)。思考到理论生产服务器性能远高于测试机型,理论的性能晋升成果将比测试后果更高, 优化后 GQL 解析能力已能齐全满足企业业务的须要。
充斥播种的社区互动
提案的互动过程波折也充斥乐趣。当波及到多线程代码的批改时,官网开发团队会分外审慎,因为这波及到零碎的稳定性和性能。他们会进行认真的测试和评估,确保批改不会引入新的问题或升高零碎的性能。为此社区引入了多达 7 名评审专家(个别提案的评审人多为 1~2 人),长达 60 屡次的重复探讨不仅是评审专家了解提案的过程,也让咱们理解了很多 Antlr4 代码背地深层的设计理念,能够更好地利用它来构建高性能、可保护的语法分析器。
通过此项优化工作,咱们播种了更多与其余社区贡献者合作的教训,多位 Antlr4 社区成员也对 TuGraph 团队的工作表白了感激,Antlr4 负责人评估该提案为“一个重大的奉献”(a major contribution)。
参考文献
【1】antlr4 doesn’t scale on a computer with 8 or more cores, https://github.com/antlr/antlr4/issues/2454
【2】Parsing with C++ target 5x slower than Java, https://github.com/antlr/antlr4/issues/2584
【3】Performance Issues Running Cpp Runtime on Many Threads, https://github.com/antlr/antlr4/issues/3938
【4】Why the C++ target is 6X slower than the Java target, https://stackoverflow.com/questions/52528982/why-the-c-target-is-6x-slower-than-the-java-target
【5】The test repo: https://github.com/wangtao9/antlr4-perfopt-test
【6】Optimize the concurrent performance of Cpp target by more than 10 times, https://github.com/antlr/antlr4/pull/4237
欢送关注 TuGraph!
https://github.com/tugraph-family
https://tugraph.antgroup.com/
END
往期回顾
→ TuGraph 阿里云收费试用、技术注释,更有丰盛互动奖品
→ 蚂蚁图数据库再获 LDBC 权威测试世界第一
→ 蚂蚁团体开源图数据库 TuGraph,成立图计算开源委员会
▼ 关注蚂蚁图计算,理解最新资讯