在 ClickHouse 中使用 Rust 实现超过 2 倍速度提升的哈希

news2024/11/15 19:41:18

图片

本文字数:2544;估计阅读时间:7 分钟

审校:庄晓东(魏庄)

本文在公众号【ClickHouseInc】首发

Meetup活动

ClickHouse 上海首届 Meetup 讲师招募中,欢迎讲师在文末扫码报名!

介绍

目前,ClickHouse DBMS 的代码库包含多种编程语言,但其主要语言是 C++。因此,集成其他编译语言的库的可能性非常有限。Rust 是其中一种语言。它的性能与 C 和 C++ 相似,并且 Rust 丰富的类型系统和所有权模型可以保证内存安全和线程安全。由于有许多有用的库是用 Rust 编写的,所以我们考虑在 ClickHouse 中使用这些库。

将 Rust 集成到 ClickHouse

构建 Rust

Rust 有一个名为 Cargo 的包管理器,用于下载依赖项、编译和分发包。另一方面,ClickHouse 使用 CMake 和 Ninja 构建系统。这两种构建方法默认情况下不兼容,因此我们需要实现某种集成 Rust 构建系统的方法。我们首先尝试实现了一个自定义的 CMake 函数,该函数可以启动 Cargo 并检测其输出。虽然这种方法成功地让我们能够将 Rust 库作为依赖项构建到 ClickHouse 中,但每次引入新的 Rust 库时,都需要更改和重新实现部分函数。后来,我们找到了一个名为 Corrosion-rs 的工具,它专为将 Rust 库集成到 CMake 项目中设计。通过它,我们可以更轻松地集成 Rust 项目,仅需一个简单的三行 CMake 文件。

BLAKE3

我们选择 BLAKE3 作为示例 Rust 库进行集成。BLAKE3 是一种高性能的安全加密哈希函数。

我们将其添加为子模块并连接到 ClickHouse 构建系统,但仍然无法在 C++ 代码中直接使用其方法。为了解决 Rust 数据类型与 C++ 数据类型之间的兼容性问题,我们在 Rust 中编写了一个中间函数。该函数接收 C 数据类型的变量作为输入,在将数据转换为相应的 Rust 类型后调用 BLAKE3 哈希函数,然后以 C 格式返回哈希结果。我们之所以使用 C 是因为 Rust 外部函数接口仅提供与 C 兼容的类型。

由于其输入和返回类型都为 C 类型,我们创建了一个 .h 头文件,声明了该函数,从而使我们最终能够在 ClickHouse 代码中使用它。

关于性能

我们在三种不同的输入上测量了 BLAKE3 的性能。以下是比较 BLAKE3 与 ClickHouse 中类似哈希函数的图表:

图片

如图所示,BLAKE3 的性能比 SHA224 或 SHA256 提升超过两倍,并且比 MD5 更快。此外,BLAKE3 是安全的,不像 MD5 和 SHA-1,并且能够防止长度扩展攻击,不像 SHA-2。

这些结果符合我们的预期,并且与 BLAKE3 作者对 1KB 输入长度的测试结果一致:

图片

中间函数的方法如何?我们在调用 BLAKE3 之前和之后使用中间函数转换 Rust 和 C 数据类型,这些转换需要一些时间。为了衡量类型转换带来的开销,我们使用了 perf top 工具,并将其数据呈现为火焰图:

图片

由图可见,中间函数最消耗时间的部分是将 Rust 哈希数据转换为 C 格式,这大约占整个查询时间的 1.15%。此外,在开始时将 C 输入的 char 指针转换为 Rust 字节数组类型几乎不需要时间,因为指针到字符串的转换是零成本的,而转换为字节数组在 Rust 中具有恒定成本。

遇到的问题

在 BLAKE3 集成过程中,我们遇到了一些问题。第一个问题是 C++ 内存检测器无法理解 Rust 中的内存操作,并将其标记为误报。我们通过在输入数据上使用 _msanunpoison 内存检测器函数,并添加一个更明确的字节数组转换版本的中间方法解决了这个问题。所有修复完成后,误报消失,内存检测器正常工作。

另一个问题是多平台构建和链接。虽然大多数 ClickHouse 支持的平台都可以通过 Cargo 轻松配置,但有些需要通过 CMake 或特定的包/框架进行额外配置。目前,只有一个平台 (aarch64-darwin) 由于链接问题仍不支持。

结论

我们实现了将 Rust 语言库集成到 ClickHouse 的可能性,并将 BLAKE3 哈希函数作为示例库添加。这使我们能够:

1. 将来在 ClickHouse 中添加和使用其他 Rust 库。

2. 在 ClickHouse 中与其他哈希函数一起使用 BLAKE3,并利用其速度和安全特性。

Alexey Milovidov 的评论

我们希望在构建中添加对 Rust 的支持,作为一种实验。Rust 有一个活跃的社区,并且有许多优秀的高质量库,我们可以在 ClickHouse 中使用。同时,我们希望尽可能不引人注目地进行集成。我们使用“你不使用就不付费”的原则:Rust 集成不应妨碍您的使用,并且不要强调它有多好。

我们对集成提出的要求如下:

  • 它应该是可选的 - 代码不应要求构建时需要 Rust:

    如果未安装 cargo,则应在没有 Rust 库的情况下进行简单构建;

  • 静态链接(没有新的动态库);

    它不应引入来自 glibc 的新符号版本依赖;

    二进制文件应在古老的 Linux 系统上运行;

    二进制文件应是单片的;

  • 支持与 C++ 代码的交叉编译,因为我们总是使用交叉编译我们的代码(即使目标平台与主机平台相同,我们也使用带有自定义 sysroot 的密封构建);

  • 支持使用检测器和模糊测试的构建:

    它们主要用于 C++ 代码,但二进制文件应能与 Rust 代码链接并与检测器一起正常工作。

满足这些要求比我们想象的要难得多,但结果比我预期的要好。没有人抱怨 Rust - 当它未安装时,项目照常构建;当它已安装时,构建就能正常工作。

我们选择了一个小型库作为概念验证。如果实验顺利进行,我们可以将其使用扩展到更多的库。同时,我们的期望值不高 - 如果没有足够的热情,我们可以简单地放弃它。

我对 Denis Bolonin 的工作印象深刻,他使这一切成为可能!

Meetup 活动讲师招募

我们正为上海活动招募讲师,如果你有独特的技术见解、实践经验或 ClickHouse 使用故事,非常欢迎你加入我们,成为这次活动的讲师,与大家分享你的经验。

点击此处或扫描下方二维码,立刻报名成为讲师!

图片

征稿启示

面向社区长期正文,文章内容包括但不限于关于 ClickHouse 的技术研究、项目实践和创新做法等。建议行文风格干货输出&图文并茂。质量合格的文章将会发布在本公众号,优秀者也有机会推荐到 ClickHouse 官网。请将文章稿件的 WORD 版本发邮件至:Tracy.Wang@clickhouse.com

图片

​​联系我们

手机号:13910395701

邮箱:Tracy.Wang@clickhouse.com

满足您所有的在线分析列式数据库管理需求

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1861105.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Elasticsearch:使用 semantic_text 简化语义搜索

作者:来自 Elastic Carlos Delgado, Mike Pellegrini semantic_text - 你知道,用于语义搜索! 你是否想开始使用语义搜索来搜索数据,但专注于模型和结果而不是技术细节?我们引入了 semantic_text 字段类型,…

Python-爬虫 下载天涯论坛帖子

为了爬取的高效性,实现的过程中我利用了python的threading模块,下面是threads.py模块,定义了下载解析页面的线程,下载图片的线程以及线程池 import threading import urllib2 import Queue import re thread_lock threading.RL…

上电相位确定性:使用多芯片同步

将多个数字信号处理 (DSP) 块、宽带数模转换器 (DAC) 和宽带模数转换器 (ADC) 集成到单个单片芯片中,现在可以卸载耗电的 FPGA 资源,以允许更小的占地面积、更低的功耗、增加通道数的平台,能够以比以前更高的速率进行采样。伴随这一新功能而来…

【大数据开发语言Scala的入门教程】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

井盖位移传感器:给井盖装上“大脑”

你是否曾经在深夜回家时,因为路上一个不起眼的井盖而心惊胆战?或者因为某个井盖缺失,导致车辆受损、行人受伤?这些看似微小的问题,其实都隐藏着巨大的安全隐患。 旭华智能针对这一问题,研制了井盖位移传感器…

多种驱鸟设备,在电力安全中各显神通

多种驱鸟设备,在电力安全中各显神通 鸟类对电力的危险是一个不容忽视的问题,尤其是在电力设施密集的区域。随着人类对自然环境的不断开发和利用,鸟类与电力设施之间的接触也日益频繁,由此引发的安全隐患和事故也屡见不鲜。 具体…

【详细教程】如何使用YOLOv10进行图片与视频的目标检测

《博主简介》 小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍感谢小伙伴们点赞、关注! 《------往期经典推…

基于SaaS平台的iHRM管理系统测试学习

目录 1、登录模块 2、员工管理模块 3、Postmannewman软件的安装,学习 1、Postman的使用 2、Postman断言 1、断言状态码(重要) 2、断言包含某个字符串(contains string) 3、断言等于某个字符串(equal string) …

【多通道卷积终结篇,通俗易懂,清晰必读】

作为常识, 1、卷积层 输出特征图通道数 卷积核个数 与输入特征图通道数无关, 2、多卷积核处理多通道特征图的机制过程如下: 本文的参考资料为知乎:一文读懂Faster RCNN。 对于多通道图像多卷积核做卷积,计算方式如…

中兴光猫破解telnet配置命令汇总

中兴光猫telnet配置命令汇总 | LogDicthttps://www.logdict.com/archives/zhong-xing-guang-mao-telnetpei-zhi-ming-ling-hui-zong

Pikachu靶场--SSRF

参考借鉴:pikachu靶场练习——SSRF详解_pikachu ssrf-CSDN博客 SSRF(curl) 先了解一下curl curl是一个非常实用的、用来与服务器之间传输数据的工具;支持的协议包括 (DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, PO…

【技术指南】稳压器(电压调节器):原理、类型及其实际用用案例

电压调节器(稳压器)是一种电子器件或电路,用于控制电路中的电压水平,以确保在电源电压波动或负载变化时,输出电压能够保持在设定的稳定水平。它们通常用于各种电子设备和电源系统中,以提供稳定的电压供应。…

AMEYA360代理品牌江苏润石:RS8661/2/4系列高压精密低噪声运算放大器

继RS8651/2/4系列高压精密低噪声运算放大器成功推向市场,润石科技再次成功量产RS8661/2/4系列高压精密低噪声运算放大器。 RS8661/2/4系列产品将工作电压提升到最高36V(18V)、失调电压进一步优化到5μV、在工业现场数据采集、各种仪器仪表测量设备\分析设备上有着广…

QT中的样式表.qss文件

一、前言 qt中样式表的改变有几种方法,第一种就是直接在ui界面对应的组件右键修改样式表,还有一种就是直接在程序里面修改样式表,我知道的还有一种就是qss文件,这个文件就是将在程序中写的修改样式表的语句写道qss文件中&#xff…

ROS CDK魔法书:点亮博客上云新技能(Python篇)

引言 在数字世界的浩瀚海洋中,信息与数据如同戏剧中的主角,舞动着无形的旋律,构建起信息时代的交响乐。而在这其中,作为一位技术领域的探索者,你的使命便是挥舞着编码的魔杖,创造和守护着这些宝贵的数字灵…

游戏AI的创造思路-技术基础-深度学习(1)

他来了,他来啦,后面歌词忘了~~~~~ 开谈深度学习,填上一点小坑,可又再次开掘大洞 -.-b 目录 1. 定义 2. 深度学习的发展历史和典型事件 3. 深度学习常用算法 3.1. 卷积神经网络(CNN) 3.1.1. 算法形成过…

前端必会--浏览器的工作原理与实践

进程与线程 线程 线程分为单线程和多线程 线程是不能单独存在的,它是由进程来启动和管理的。 进程 一个进程就是一个程序的运行实例。详细解释就是,启动一个程序的时候,操作系统会为该程序创建一块内存,用来存放代码、运行中的…

OpenAI扩大版图,收购Mac协作应用巨擘Multi

Multi,这款专为macOS用户打造的多人协作应用,凭借其卓越的低延迟实时协作功能,如共享光标、绘图和键盘控制,在业界享有盛誉。如今,OpenAI宣布成功收购Multi,以进一步扩大其技术生态。Multi公司将停止运营&a…

ppt忘记保存怎么恢复?

朋友们大家好,我是热爱分享电脑知识的资源伙伴~接下来,别忘了点赞、收藏并关注资源伙伴!如果你在使用PowerPoint时忘记保存演示文稿,突然关闭程序或电脑出现故障,不用太担心。 PowerPoint和大多数现代Office应用程序都…

将本地项目托管到Github或码云中

最按照打开页面的步骤,一步步生成公钥就: 按照提示完成三次回车,即可生成 ssh key 到C:\Users\登录用户名.ssh下找到文件d_rsa.pub ,打开就可以获取到public key 将id_rsa.pub文件中的内容全部复制到设置/SSH页面中: 单…