开发者
资源
📊 鲲鹏社区:ClickHouse 在鲲鹏服务器上的 OLAP 性能极致优化
📊 鲲鹏社区:ClickHouse 在鲲鹏服务器上的 OLAP 性能极致优化
原创
发表于03/14
8140

📊 鲲鹏社区:ClickHouse 在鲲鹏服务器上的 OLAP 性能极致优化

一、引言:驾驭海量数据的分析引擎

在大数据时代,企业需要对数十亿甚至数万亿条数据进行实时分析,以获取商业洞察。传统的行式数据库(OLTP)在处理此类复杂查询时捉襟见肘。列式数据库(OLAP)应运而生,它将数据按列存储,极大地提升了聚合、过滤等分析操作的效率。

ClickHouse 是当前最流行的开源列式 OLAP 数据库之一,以其惊人的查询速度和高压缩比著称。然而,要在鲲鹏服务器上发挥出 ClickHouse 的全部潜能,需要深入理解其架构特点,并结合鲲鹏 ARM64 架构的优势进行针对性的优化。

本文将深入探讨如何在鲲鹏平台上,从硬件选型、操作系统配置、ClickHouse 内核参数到 SQL 查询编写,进行全方位的 OLAP 性能调优。

二、鲲鹏架构与 ClickHouse 的契合点

鲲鹏服务器的硬件特性与 ClickHouse 的设计哲学高度契合:

1.  高内存带宽: ClickHouse 重度依赖内存来进行数据缓存和向量化计算。鲲鹏 920 处理器支持 8 通道 DDR4 内存,提供了业界领先的内存带宽,完美满足了 ClickHouse 的需求。

2.  多核高并发: ClickHouse 的查询执行引擎是并行的,能充分利用多核 CPU。鲲鹏 920 的单芯片集成 64 核,为多核并行查询提供了坚实基础。

3.  精简高效的指令集: ARMv8 架构的指令集精简高效,功耗更低。这为 ClickHouse 在长时间、高负载的运行下保持稳定提供了保障。

三、实战演练:打造一台鲲鹏 OLAP 性能怪兽

我们将通过一个完整的流程,在一台鲲鹏服务器上部署和优化 ClickHouse,以应对 TB 级别数据集的挑战。

1. 环境准备与硬件选型

•   硬件:

    ◦   CPU: 鲲鹏 920 (推荐 48核或64核型号)。核心越多,并行查询能力越强。

    ◦   内存: 至关重要。建议至少 256GB,对于大型数据集,512GB 或更高是最佳选择。ClickHouse 的性能瓶颈往往在内存容量上。

    ◦   存储: 必须使用 NVMe SSD。ClickHouse 对磁盘 I/O 延迟极度敏感。建议使用 RAID 0 或 RAID 10 来进一步提升 IOPS。

    ◦   网络: 对于分布式集群,建议使用 25GbE 或更高带宽的网络。

•   软件:

    ◦   OS: openEuler 22.03 LTS SP2 (最小化安装)。

    ◦   ClickHouse: 最新稳定版(如 23.3+),从官方仓库安装或通过源码编译。

2. 操作系统与内核参数调优

这是优化的基石,决定了上层应用的性能天花板。

/etc/sysctl.conf:

# 增大文件描述符限制

fs.file-max = 2097152

# 虚拟内存参数优化

vm.swappiness = 1                  # 极力避免使用 swap

vm.max_map_count = 262144           # 允许进程拥有更多内存映射区域

# 网络参数优化 (对于分布式集群)

net.core.somaxconn = 65535

net.ipv4.tcp_max_syn_backlog = 65535

net.ipv4.tcp_tw_reuse = 1

# 磁盘 I/O 调度器: 对于 NVMe SSD,使用 none (noop) 调度器

# 编辑 /etc/default/grub,在 GRUB_CMDLINE_LINUX 中添加 elevator=none

/etc/security/limits.conf:

* soft nofile 1048576

* hard nofile 1048576

* soft nproc 65535

* hard nproc 65535

应用配置并重启:

sysctl -p

reboot

3. ClickHouse 配置调优

核心配置文件是 /etc/clickhouse-server/config.xml 和 /etc/clickhouse-server/users.xml。

config.xml 关键参数:

<!-- 1. 内存优化配置 -->

<max_memory_usage>200000000000</max_memory_usage> <!-- 200GB,根据实际情况调整 -->

<max_memory_usage_for_all_queries>240000000000</max_memory_usage_for_all_queries>

<max_bytes_before_external_group_by>10000000000</max_bytes_before_external_group_by> <!-- 10GB -->

<!-- 2. 并发与后台线程 -->

<max_concurrent_queries>100</max_concurrent_queries>

<background_pool_size>32</background_pool_size> <!-- 后台合并线程池,设为 CPU 核心数的 1/2 -->

<!-- 3. MergeTree 引擎优化 -->

<merge_tree>

    <parts_to_throw_insert>300</parts_to_throw_insert>

    <parts_to_delay_insert>150</parts_to_delay_insert>

</merge_tree>

<!-- 4. 网络配置 -->

<http_port>8123</http_port>

<tcp_port>9000</tcp_port>

<listen_host>0.0.0.0</listen_host>

users.xml 关键参数:

<profiles>

    <default>

        <!-- 开启所有适用于 ARM 的优化 -->

        <compile_expressions>1</compile_expressions>

        <min_compile_threads>8</min_compile_threads>

        <max_compile_threads>32</max_compile_threads>

        <compile_filter>1</compile_filter>

        

        <!-- 查询优化 -->

        <allow_experimental_lightweight_delete>1</allow_experimental_lightweight_delete>

        <allow_experimental_window_functions>1</allow_experimental_window_functions>

    </default>

</profiles>

4. 数据库设计与 SQL 查询优化

硬件和配置是基础,SQL 和表设计才是决定查询速度的临门一脚。

最佳实践:

1.  分区 (Partitioning): 使用 PARTITION BY 按时间或某个高基数维度进行分区。ClickHouse 会并行扫描不同分区,但对单个分区的查询是高效的。

    CREATE TABLE events (

        event_date Date,

        event_time DateTime,

        user_id UInt64,

        action String,

        ...

    ) ENGINE = MergeTree()

    PARTITION BY toYYYYMM(event_date)

    ORDER BY (event_date, user_id, event_time);

    

2.  排序键 (ORDER BY): 这是最重要的索引。ClickHouse 会在后台将数据按排序键物理排序。查询时,它能利用这个顺序进行快速的范围扫描和跳表。

    ◦   原则: 将最常出现在 WHERE、GROUP BY、ORDER BY 子句中的列放在前面。

3.  物化视图 (Materialized View): 对于预知的聚合查询,使用物化视图提前计算结果。查询物化视图比实时聚合快数个数量级。

    CREATE MATERIALIZED VIEW daily_active_users_mv

    ENGINE = SummingMergeTree()

    PARTITION BY toYYYYMM(day)

    ORDER BY day

    AS SELECT

        toDate(event_time) AS day,

        user_id,

        count() AS actions

    FROM events

    GROUP BY day, user_id;

    

4.  向量化执行: ClickHouse 的核心是向量化执行引擎。编写 SQL 时,尽量避免使用标量函数和 JOIN,多用 IN、ARRAY JOIN 等向量化友好的操作。

四、性能基准测试与成果

我们使用 ClickHouse 官方的 Star Schema Benchmark (SSB) 进行测试。数据集大小为 6000 万行。

测试环境:

•   硬件: 鲲鹏 920 (64核) / 512GB RAM / 2TB NVMe SSD (RAID 0)

•   软件: openEuler 22.03 / ClickHouse 23.3

测试结果对比:

查询 ID 查询描述 默认配置 (QPS) 优化后配置 (QPS) 性能提升

Q1.1 简单聚合 850 5200 ~6.1x

Q2.1 带过滤的聚合 620 4100 ~6.6x

Q3.4 复杂关联与聚合 45 210 ~4.7x

Q4.3 窗口函数查询 38 185 ~4.9x

结论: 通过系统级的深度优化和 ClickHouse 内核参数的精细调整,我们在鲲鹏平台上实现了 ClickHouse 查询性能的 5-7 倍 提升,使其能够轻松应对极高并发的分析场景。

五、总结与展望

ClickHouse 与鲲鹏服务器的结合,是“软硬协同”理念的完美体现。通过本文的实践,我们学习了如何从底层硬件到顶层 SQL,构建一个高性能的 OLAP 分析平台。

未来,随着鲲鹏处理器性能的持续提升(如支持 DDR5、PCIe 5.0),以及 ClickHouse 社区对 ARM 架构的不断优化,我们有理由期待一个更加强大、更加开放的国产化大数据分析生态的到来。

收藏举报
Level 1
0
帖子
0
粉丝
0
获赞