基于 Glibc 版本升级的 DolphinDB 数据查询性能优化实践

在高并发查询、查询需要涉及很多个分区的情况下,低版本的 glibc(低于2.23)会严重影响查询性能。需要升级 glibc 解决该问题优化性能。我们撰写了本文,通过 patchelf 工具修改可执行文件和动态库的 rpath,达到无需升级系统便可以使用高版本 glibc 的目的。

1 概述

在高并发查询、查询需要涉及很多个分区的情况下,需要频繁读取磁盘文件,而旧版 glibc(低于2.23)的 fseek 函数性能低下,导致查询任务堆积,CPU 利用率却不高。需要升级 glibc 解决该问题。由于系统 glibc 通常和系统版本绑定,所以升级系统 glibc 需要升级系统。但是升级系统步骤繁琐,故我们撰写了本文通过 patchelf 工具修改可执行文件和动态库的 rpath,在动态链接时优先链接的高版本 glibc。从而无需升级系统便可以使用高版本 glibc。

2 环境配置与数据模拟

2.1 硬件配置

测试总共使用四台配置相同的服务器,分别命名为 P1、P2、P3、P4,具体硬件配置如表所示。

处理器核数内存操作系统硬盘网络
Intel(R) Xeon(R) Gold 5320 CPU @ 2.20GHz128754 GBCentOS Linux release 7.9SSD万兆局域网

2.2 集群配置

以下测试中使用的 DolphinDB Server 版本为 2.00.9.3。

基于四台服务器搭建双副本高可用集群,假设四台服务器名称分别为 P1、P2、P3、P4,P1 、P2、P3各部署一个控制节点、一个代理节点、一个数据节点,P4 部署一个代理节点、一个数据节点。

主要配置如下表:

配置项
maxMemSize480GB
workerNum128个
TSDBCacheEngineSize100GB

2.3 模拟数据

2.3.1 生成模拟数据

模拟数据为物联网测点数据,有 4 个字段,分别是 id、time、v、q,一天 28.8 亿条数据。数据库按照日期(按天)、id(HASH 128)分区。每个分区约 2250 万条记录。具体脚本见附件。

2.3.2 模拟数据查询

我们模拟单个、20、40、60、100 个并发查询,查询内容为 4 天 1000 个随机id的点查询,理论上将包含 128x4个分区。具体脚本见附件。

3 升级 glibc

3.1 查看本机 DolphinDB 使用的 glibc 版本

执行以下命令

ldd dolphindb

找到 libc.so.6 的位置,在终端执行

/lib64/libc.so.6

得到版本为如图(2.17,低于 2.23)

3.2 下载或者编译高版本 glibc

3.2.1 下载

  • 可自行下载对应系统高版本的 glibc 库和 libgcc 库后手工提取。
  • 或下载 DolphinDB 提供的压缩包(glibc 版本 2.23,Centos 7)。
  • 注意:可能存在兼容性问题。

glibc-2.23.tar.gz

3.2.2 编译

可以通过自行编译的方式解决高版本 glibc 的兼容性问题。

#下载glibc源代码
git clone https://sourceware.org/git/glibc.git
cd glibc
git checkout glibc-2.23
mkdir build
cd build
#具体路径需要自己选择,不要不添加路径或者选择系统库的路径,避免系统glibc被覆盖
../configure --prefix=/home/thchen/glibc-2.23
# -j后面的数字要低于或者等于自己cpu的核数
make -j12
make install
#编译运行需要把系统的/lib64/libgcc_s.so.1 复制到/home/thchen/glibc-2.23/lib里
cp /lib64/libgcc_s.so.1 /home/thchen/glibc-2.23/lib

3.3 解压高版本 glibc 到自定义位置

注意事项:

1)不要解压到系统 lib64、根目录等路径覆盖系统 glibc。

2)不要添加自定义 glibc 文件夹到 LD_LIBRARY_PATH 环境变量。

#当前位置为/home/thchen
tar -zxvf glibc-2.23.tar.gz

3.4 下载 patchelf

sudo yum install patchelf

3.5 文件备份

备份相关文件(dolphindb libDolphinDB.solibgfortran.so.3libopenblas.so.0libquadmath.so.0libstdc++.so.6libtcmalloc_minimal.so.4

#备份文件,需要到dolphindb 可执行文件下的目录
cp dolphindb dolphindb.bak
cp libDolphinDB.so libDolphinDB.so.bak
cp libgfortran.so.3 libgfortran.so.3.bak
cp libopenblas.so.0 libopenblas.so.0.bak
cp libquadmath.so.0 libquadmath.so.0.bak
cp libstdc++.so.6 libstdc++.so.6.bak
cp libtcmalloc_minimal.so.4 libtcmalloc_minimal.so.4.bak

3.6 修改文件的 rpath 和 interpreter

1)关闭 DolphinDB

2)根据高版本 glibc 的路径,修改以下文件的 rpath:dolphindb libDolphinDB.solibgfortran.so.3libopenblas.so.0libquadmath.so.0libstdc++.so.6libtcmalloc_minimal.so.4

#修改rpath,具体路径要看高版本glibc的路径
patchelf --set-interpreter /home/thchen/glibc-2.23/lib/ld-linux-x86-64.so.2 \
--set-rpath ./:/home/thchen/glibc-2.23/lib64 dolphindb
patchelf  --set-rpath ./:/home/thchen/glibc-2.23/lib libDolphinDB.so 
patchelf  --set-rpath ./:/home/thchen/glibc-2.23/lib libgfortran.so.3
patchelf  --set-rpath ./:/home/thchen/glibc-2.23/lib libopenblas.so.0
patchelf  --set-rpath ./:/home/thchen/glibc-2.23/lib libquadmath.so.0
patchelf  --set-rpath ./:/home/thchen/glibc-2.23/lib libstdc++.so.6
patchelf  --set-rpath ./:/home/thchen/glibc-2.23/lib libtcmalloc_minimal.so.4

3.7 验证 glibc 库路径

使用 ldd dolphindb 命令验证当前 glibc 库的路径。当运行结果显示其路径为高版本 glibc 路径时,说明前述修改成功。

4 性能测试与对比

通过在升级前和升级后运行 2.3.2 节的模拟查询,我们得到了以下数据:

查询方法查询用时(glibc 2.17)查询用时(glibc 2.34)加速比
单查询3,241 ms2,007 ms1.61
20并发查询33,346 ms15,313 ms2.18
40并发查询85,144 ms24,672 ms3.45
60并发查询134,065 ms28,793 ms4.66
100并发查询224,902ms46,938 ms4.79

通过升级 glibc,DolphinDB 前后查询加速比为 1.61-4.79 倍。在并发情况下性能提升更加明显。

5 小结

针对高并发查询,当查询需要涉及多个分区时,如果查询任务积压但 CPU 利用率不高,可以先确定 glibc 的版本。如果 glibc 版本低于 2.23,则可以按照本方案进行升级,这可能会带来明显的性能提升。

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

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

相关文章

专业课140+总分420+东南大学920专业综合考研,信息学院通信专业考研分享

专业课140总分420东南大学920专业综合考研,信息学院通信专业考研分享 我是三月开始系统考研备战,寒假先看的高数全书,奈何在家效率极其低下,才草草看了前三四章。回校后学习的比较认真,每天大概保持10个小时左右&…

3分钟看完NVIDIA GPU架构及演进

近期随着 AI 市场的爆发式增长,作为 AI 背后技术的核心之一 GPU(图形处理器)的价格也水涨船高。GPU 在人工智能中发挥着巨大的重要,特别是在计算和数据处理方面。目前生产 GPU 主流厂商其实并不多,主要就是 NVIDIA、AM…

前端为什么不能直接连数据库

其实也不是不可以,只是这样做有很多不好的地方,但是如果是一个只有几个人用的内网小系统,是没有问题的。主要基于以下原因考虑 安全性问题:前端信息都是公开的,从前端访问数据库,就需要将数据库的地址&…

学习黑马AJAX

今天开始学习黑马的AJAX课程,一上来就是注册案例,开始很不习惯axios的语法,感觉好别扭,但前面花了比较长的时间重复敲,现在也熟悉了很多,后面以为的几节课都是围绕http协议的,首先是url的目标资…

利用OpenCV实现图片中导线的识别

下面是一个需求,识别图片中的导线,要在图像中检测导线,我们需要采用不同于直线检测的方法。由于OpenCV没有直接的曲线检测函数,如同它对直线提供的HoughLines或HoughLinesP,检测曲线通常需要更多的图像处理步骤和算法&…

java io流中为什么使用缓冲流就能加快文件读写速度

FileInputStream的read方法底层确实是通过调用JDK层面的read方法,并且这个JDK层面的read方法底层是使用C语言编写的,以实现高效的文件读取功能。但是它会涉及多次内核态与操作系统交互。当我们使用FileInputStream的read方法读取文件时,首先会…

UEC++ day7

敌人NPC机制 敌人机制分析与需求 新建一个character类来作为敌人,直接建蓝图设置骨骼网格,因为敌人可能多种就不规定死,然后这个敌人肯定需要两个触发器,一个用于大范围巡逻,一个用于是否达到主角近点进行攻击 注意我…

【Flink】Process Function

目录 1、ProcessFunction解析 1.1 抽象方法.processElement() 1.2 非抽象方法.onTimer() 2、Flink中8个不同的处理函数 2.1 ProcessFunction 2.2 KeyedProcessFunction 2.3 ProcessWindowFunction 2.4 ProcessAllWindowFunction 2.5 CoProcessFunction 2.6 ProcessJo…

https和http的区别和优势

大家好,我是咕噜-凯撒,HTTP(超文本传输协议)和HTTPS(安全超文本传输协议)是用于在网络上传输数据的协议,HTTPS相比HTTP在数据传输过程中更加安全可靠,适合对数据安全性要求较高的场景…

ventoy安装操作系统

下载ventoy https://github.com/ventoy/Ventoy/releases/download/v1.0.96/ventoy-1.0.96-windows.zip 解压后执行 Ventoy2Disk 2、安装后将ISO放入U盘大的分区,通过U盘启动就可以识别到ISO镜像开始装系统

MySQL 日志管理、备份与恢复

一、MySQL 日志管理 MySQL 的日志默认保存位置为 /usr/local/mysql/data vim /etc/my.cnf [mysqld] ##错误日志,用来记录当MySQL启动、停止或运行时发生的错误信息,默认已开启 log-error/usr/local/mysql/data/mysql_error.log #指定日志的保存位置…

PDF控件Spire.PDF for .NET【转换】演示:将 PDF 转换为 word、HTML、SVG、XPS

本文我们将演示如何通过调用 Spire.PDF 提供的方法 PdfDocument.SaveToStream() 将 PDF 页面转换为 HTML、Word、SVG、XPS、PDF 并将它们保存到流中。并且从Spire.PDF版本4.3开始,它新支持转换定义范围的PDF页面并将其保存到流中。 Spire.Doc 是一款专门对 Word 文…

springboot项目基于jdk17、分布式事务seata-server-1.7.1、分库分表shardingSphere5.2.1开发过程中出现的问题

由于项目需要,springboot项目需基于jdk17环境开发,结合nacos2.0.3、分布式事务seata-server-1.7.1、分库分表shardingSphere5.2.1等,项目启动过程中出现的问题解决方式小结。 问题一: Caused by: java.lang.RuntimeException: j…

职场Excel:求和家族,不简单

说到excel函数,很多人第一时间想到的就是求和函数sum。作为excel入门级函数,sum的确是小白级的,以至于很多人对求和函数有点“误解”,觉得求和函数太简单了。 但是,你可能不知道,sum只是excel求和家族里的一…

【打卡】牛客网:BM59 N皇后问题

自己写的&#xff1a; ①想自己定义结构体node&#xff0c;发现find函数太麻烦。看了眼模板&#xff0c;就用一个vector<int>记录行号就行&#xff0c;索引自然而然就是列号。 ②想用for循环写&#xff08;未通过&#xff09; 还在想这和模拟差不多。后来才意识到&…

Ubuntu22.04 交叉编译GCC13.2.0 for Rv1126

一、安装Ubuntu22.04 sudo apt install vim net-tools openssh-server 二、安装必要项 sudo apt update sudo apt upgrade sudo apt install build-essential gawk git texinfo bison flex 三、下载必备软件包 1.glibc https://ftp.gnu.org/gnu/glibc/glibc-2.38.tar.gz…

引迈-JNPF低代码项目技术栈介绍

从 2014 开始研发低代码前端渲染&#xff0c;到 2018 年开始研发后端低代码数据模型&#xff0c;发布了JNPF开发平台。 谨以此文针对 JNPF-JAVA-Cloud微服务 进行相关技术栈展示&#xff1a; 1. 项目前后端分离 前端采用Vue.js&#xff0c;这是一种流行的前端JavaScript框架&a…

Doris的分区表和分桶表

1 列定义 以AGGREGATE KEY数据模型为例进行说明。更多数据模型参阅Doris数据模型。 列的基本类型,可以通过在mysql-client中执行HELP CREATE TABLE; 查看。 AGGREGATE KEY数据模型中,所有没有指定聚合方式(SUM、REPLACE、MAX、MIN)的列视为Key列。而其余则为Value列。 定义…