基于 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.20GHz | 128 | 754 GB | CentOS Linux release 7.9 | SSD | 万兆局域网 |
2.2 集群配置
以下测试中使用的 DolphinDB Server 版本为 2.00.9.3。
基于四台服务器搭建双副本高可用集群,假设四台服务器名称分别为 P1、P2、P3、P4,P1 、P2、P3各部署一个控制节点、一个代理节点、一个数据节点,P4 部署一个代理节点、一个数据节点。
主要配置如下表:
| 配置项 | 值 |
|---|---|
| maxMemSize | 480GB |
| workerNum | 128个 |
| TSDBCacheEngineSize | 100GB |
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.so,libgfortran.so.3,libopenblas.so.0,libquadmath.so.0,libstdc++.so.6,libtcmalloc_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.so,libgfortran.so.3,libopenblas.so.0,libquadmath.so.0,libstdc++.so.6,libtcmalloc_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 ms | 2,007 ms | 1.61 |
| 20并发查询 | 33,346 ms | 15,313 ms | 2.18 |
| 40并发查询 | 85,144 ms | 24,672 ms | 3.45 |
| 60并发查询 | 134,065 ms | 28,793 ms | 4.66 |
| 100并发查询 | 224,902ms | 46,938 ms | 4.79 |
通过升级 glibc,DolphinDB 前后查询加速比为 1.61-4.79 倍。在并发情况下性能提升更加明显。
5 小结
针对高并发查询,当查询需要涉及多个分区时,如果查询任务积压但 CPU 利用率不高,可以先确定 glibc 的版本。如果 glibc 版本低于 2.23,则可以按照本方案进行升级,这可能会带来明显的性能提升。
相关文章:
基于 Glibc 版本升级的 DolphinDB 数据查询性能优化实践
在高并发查询、查询需要涉及很多个分区的情况下,低版本的 glibc(低于2.23)会严重影响查询性能。需要升级 glibc 解决该问题优化性能。我们撰写了本文,通过 patchelf 工具修改可执行文件和动态库的 rpath,达到无需升级系…...
【顺序表的应用-通讯录的实现】
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一、顺序表的应用 1. 基于动态顺序表实现通讯录 1、功能要求 2、代码实现 二、通讯录的代码实现 1.通讯录的底层结构(顺序表) (1)思路展示 (2)底层代码实现(顺序表…...
[Spring Cloud] Nacos 实战 + Aws云服务器
文章目录 前言一、拥有一台Aws Linux服务器1.1、选择Ubuntu版本Linux系统1.2、创建新密钥对1.3、网络设置1.4、配置成功,启动实例1.5、回到实例区域1.6、进入具体的实例1.7、设置安全组 二、在Mac上连接Aws云服务,并安装配置JDK112.1、解决离奇的错误2.2…...
SpringCloud微服务注册中心:Nacos介绍,微服务注册,Ribbon通信,Ribbon负载均衡,Nacos配置管理详细介绍
微服务注册中心 注册中心可以说是微服务架构中的”通讯录“,它记录了服务和服务地址的映射关系。在分布式架构中,服务会注册到这里,当服务需要调用其它服务时,就这里找到服务的地址,进行调用。 微服务注册中心 服务注…...
身份证号码校验
根据《新版外国人永久居留身份证适配性改造要点》,公司需要把代码中对身份证的校验进行优化 就文档内容可以看到需要优化的要点是: 新版永居证号码以 9 开头 受理地区代码出生日期顺序码校验码;(共18位) egÿ…...
ArcGIS如何处理并加载Excel中坐标数据?
做GIS行业的各位肯定免不了跟数据打交道,其中数据的处理说复杂也复杂,因为我们要花时间去做数据的转换及调整工作,那说简单也简单,因为我们有很多的工具可以使用,那么今天我就给大家带来处理Excel中的GIS数据中的其中一…...
C++标准模板(STL)- 类型支持 (类型修改,从给定类型移除 const 或/与 volatile 限定符,std::remove_cv)
类型特性 类型特性定义一个编译时基于模板的结构,以查询或修改类型的属性。 试图特化定义于 <type_traits> 头文件的模板导致未定义行为,除了 std::common_type 可依照其所描述特化。 定义于<type_traits>头文件的模板可以用不完整类型实例…...
nodejs搭建本地服务
前端开发时想自己有个本地服务如下操作直接上干货 1.在桌面上直接在powerShell 输入命令行 npm install -g express-generator 然后 npm install -g express 然后新建一个例如server的文件夹 在powerShell执行 express myStudy -e 端口号默认是3000 直接在地址栏输入 http://…...
如何看待Unity新收费模式?
Unity新收费模式的变化主要在于将收费重心从功能分级收费转变为资源使用量收费,这个改变已经引起了一定的争议和反响。以下是我个人的看法: 优点: 更公平的收费方式:新的收费模式将更加公平,用户只需按照实际使用的数…...
Excel数据可视化—波士顿矩阵图【四象限图】
EXCEL系列文章目录 Excel系列文章是本人亲身经历职场之后萌发的想法,为什么Excel覆盖如此之广,几乎每个公司、学校、家庭都在使用,但是它深藏的宝藏功能却很少被人使用,PQ、BI这些功能同样适用于数据分析;并且在一些需…...
【Java】智慧工地管理系统源代码,支持二次开发,SaaS模式
智慧工地系统围绕工程现场人、机、料、法、环及施工过程中质量、安全、进度、成本等各项数据满足工地多角色、多视角的有效监管,实现工程建设管理的降本增效。 一、行业现状 1、施工现场管理难:安全事故频发,人工巡检难度大,质量进度协同难等…...
Lstm+transformer的刀具磨损预测
视频讲解: 基于Lstm+transformer的刀具磨损预测实战_哔哩哔哩_bilibili 结果展示: 数据展示: 主要代码: # pip install openpyxl -i https://pypi.tuna.tsinghua.edu.cn/simple/ # pip install optuna -i https://pypi.tuna.tsinghua.edu.cn/simple/ import numpy as np…...
本机idea连接虚拟机中的Hbase
相关环境: 虚拟机:Centos7 hadoop版本:3.1.3 hbase版本:2.4.11 zookeeper版本:3.5.7 Java IDE:IDEA JDK:8 步骤 步骤一:在idea创建一个maven项目 步骤二:在虚拟机里找到core-site.x…...
.NET中的Object类学习3_MemberwiseClone方法
文章目录 一、前言二、Object.MemberwiseClone方法1 定义2 示例3 备注 三、总结 一、前言 按照MSDN文档的章节顺序来,本文应该是第五节。 但是学了上一节 Finalize之后,发现其内容对实际开发帮助不大。 所以这次跳过了前面的GetHashCode、GetType章节&a…...
鼎捷前端开发校招岗技术面面经(已过)
前言 鼎捷一共两面,一面针对技术,这篇博客记录下我认为有价值的问题。 有价值的提问 js类的继承的方式 es5,涉及到原型、原型链的继承; es6,类与对象,extends,super; 还问到Vue…...
Rockchip平台rk3588源码下载编译(基于Android13)
Rockchip平台rk3588源码下载编译(基于Android13) 源码下载 下载地址 repo init --repo-url https://gerrit.rock-chips.com:8443/repo-release/tools/repo -u https://gerrit.rock-chips.com:8443/Android_T/manifests.git -m Android13.xml服务器镜像下载 repo init --rep…...
RuntimeError: PyPI no longer supports ‘pip search‘ (or XML-RPC search).
RuntimeError: PyPI no longer supports ‘pip search’ (or XML-RPC search). 1. ERROR: XMLRPC request failed Deprecated Methods https://warehouse.pypa.io/api-reference/xml-rpc.html#deprecated-methods PyPI XMLRPC Search Disabled https://status.python.org/inc…...
21款奔驰GLS450升级23P驾驶辅助 提升安全出行
辅助驾驶越来越多的被大家所青睐!为了提升驾驶安全性和舒适便捷性奔驰改装原厂半自动驾驶23P辅助系统 23P智能辅助驾驶系统还是很有必要的,因为在跑高速的时候可以使用23P智能驾驶的自动保持车速,保持车距,车道自动居中行驶以及自…...
iOS越狱检测总结
文章目录 前言检测越狱文件私有目录检测检测越狱软件检测系统目录是否变为链接动态库检测环境变量检测系统调用检测指令集调用检测其他方式检测 前言 在之前的文章中,已经带大家一起制作了一个屏蔽越狱检测的Tweak。本文就和大家一起学习整理一下iOS系统中有哪些越…...
场景驱动的 AI 体验设计:如何让智能 IDE 赋能遗留系统重写
作为 AutoDev 的核心开发,我们不仅在不断丰富 AutoDev 的功能以满足不同公司的定制需求,还在与各种团队进行持续交流。在处理遗留系统时,我们发现程序员们日常工作中需要面对大量使用过时技术、基础设施混乱的系统。 在这个背景下,…...
HarmonyOS应用开发全流程深度解析:从入门到精通的20000字指南
第一章 鸿蒙生态架构与开发理念1.1 鸿蒙操作系统双版本体系 HarmonyOS与OpenHarmony构成华为"18N"全场景战略的技术底座。商业版HarmonyOS由华为维护,集成消费级设备专有功能;开源版OpenHarmony由开放原子基金会管理,适配工业、电网…...
如何快速掌握IDR:Delphi反编译的终极完整指南
如何快速掌握IDR:Delphi反编译的终极完整指南 【免费下载链接】IDR Interactive Delphi Reconstructor 项目地址: https://gitcode.com/gh_mirrors/id/IDR IDR(Interactive Delphi Reconstructor)是一款专门用于反编译Delphi程序的专业…...
别再死记公式了!用Multisim仿真带你直观理解电阻分流器原理(附电路文件)
用Multisim仿真破解电阻分流器:从理论到可视化的实战指南 在电子工程的学习过程中,电阻分流器原理常常是初学者遇到的第一个"拦路虎"。传统教学方法往往要求学生死记硬背分流公式,却忽略了最关键的物理直觉培养。本文将带你用Multi…...
AISMM成熟度模型落地失效?SITS2026用“能力-流程-角色-度量”四维校准法,3周止血、6周建模、12周固化!
更多请点击: https://intelliparadigm.com 第一章:SITS2026案例:AISMM驱动的组织变革 在SITS2026国际航天信息系统技术峰会中,欧洲航天局(ESA)与德国航空航天中心(DLR)联合实施的AI…...
基于Web的远程命令执行中心部署与安全实践指南
1. 项目概述:远程控制命令中心最近在折腾一个挺有意思的东西,一个叫cducote/remoteCC的开源项目。这个名字听起来有点抽象,但说白了,它就是一个轻量级的、基于Web的远程命令执行与控制中心。想象一下,你手头有几台服务…...
别再让UI卡死!Qt5子线程安全更新UI的两种实战方案(附完整代码)
Qt5子线程安全更新UI的两种实战方案与深度优化 在桌面应用开发中,数据处理或图形渲染的后台任务常常导致界面卡顿甚至崩溃。作为Qt开发者,我们经常面临这样的困境:如何在保持界面流畅响应的同时,高效执行后台计算任务?…...
README_条件编译笔记
条件编译笔记 1. 这篇笔记讲什么 这篇笔记不是泛泛而谈 C 语言预处理器,而是结合你当前 STM32 工程里的真实代码来讲清楚: 什么是条件编译它和普通 if 判断有什么本质区别你的项目里哪些地方正在使用条件编译这些写法分别解决什么问题后面你自己改工程时…...
ChatGPT商业应用部署实战:从多模型调度到SaaS化运营
1. 项目概述:一个功能完备的ChatGPT商业应用解决方案最近在折腾AI应用落地的事情,发现很多朋友对搭建一个属于自己的、能运营的ChatGPT服务特别感兴趣。市面上开源项目不少,但要么功能单一,要么部署复杂,要么就是商业逻…...
Windows 10 适配 OpenClaw 2.6.6 全自动部署教程
OpenClaw 2.6.6 Windows 10 专属一键部署教程|本地 AI 智能体完整搭建指南 OpenClaw(小龙虾)是一款可在本地环境运行的 AI 智能操作工具,能够通过自然语言指令完成文件管理、办公自动化、浏览器操控、系统维护等多项电脑任务。针…...
龙芯3A5000开发环境搭建记:从apt绝望到aptitude救场的Qt5安装全流程
龙芯3A5000开发环境搭建手记:Qt5安装的依赖困境与aptitude实战 第一次在龙芯3A5000上安装Qt5开发环境时,我以为这不过是又一个标准的apt install流程。毕竟在x86架构上,这类操作早已轻车熟路。但当我面对Kylin V10系统终端里那串红色的依赖冲…...
