clickhouse 参数优化配置

配置文件/etc/clickhouse-server/config.xml

max_server_memory_usage 服务器进程的最大内存使用量,限制服务器的总内存使用

  • 零值或未设置表示默认值。
  • 默认为:memory_amount(内存总量) * max_server_memory_usage_to_ram_ratio(占比分数值)

max_server_memory_usage_to_ram_ratio 用来计算 max_server_memory_usage 的值。

  • 定义 ClickHouse 服务器可用的总物理 RAM 量的比例。如果服务器尝试使用更多内存,则会将内存减少到适当的数量
  • 默认值0,代表 ClickHouse 服务器可以使用所有可用的 RAM
  • 在 RAM 和交换空间较低的主机上,您可能需要设置max_server_memory_usage_to_ram_ratio大于 1。

配置文件/etc/clickhouse-server/users.xml

max_memory_usage_for_user 用于在单个服务器上运行用户查询的最大 RAM 量。

  • 默认0,不限制

max_memory_usage 用于在单个服务器上运行查询的最大 RAM 量。

  • 默认值10G
  • 该设置不考虑可用内存量或机器上的总内存量。该限制适用于单个服务器中的单个查询

max_bytes_before_external_group_by 启用或禁用GROUP BY外部存储器(磁盘)中子句的执行

  • 默认0,GROUP BY在外部存储器中禁用。
  • 单个GROUP BY操作可以使用的最大 RAM 容量(以字节为单位)
  • 建议设置max_memory_usagemax_bytes_before_external_group_by 两倍的内存。这是必要的,因为聚合有两个阶段:读取数据并形成中间数据(1)和合并中间数据(2)。只能在第 1 阶段将数据转储到文件系统。如果未转储临时数据,则第 2 阶段可能需要与第 1 阶段相同的内存量。
  • 通过分布式查询处理,在远程服务器上执行外部聚合。为了让请求者服务器只使用少量 RAM,设置distributed_aggregation_memory_efficient为 1。
  • 合并刷新到磁盘的数据时,以及在distributed_aggregation_memory_efficient启用该设置时合并来自远程服务器的结果时,最多消耗1/256 * the_number_of_threadsRAM 总量。
  • 启用外部聚合时,如果数据少于max_bytes_before_external_group_by(即数据未刷新),则查询运行速度与没有外部聚合时一样快。如果刷新了任何临时数据,则运行时间将延长几倍(大约三倍)。
  • 外部存储器中的 GROUP BY

max_bytes_before_external_sort

  • 默认0, ORDER BY在外部存储器中禁用。
  • 当要排序的数据量达到指定的字节数时,将对收集的数据进行排序并转储到临时文件中。 读取所有数据后,将合并所有已排序的文件并输出结果。 文件被写入到 /var/lib/clickhouse/tmp/ 目录中的配置(默认情况下,但你可以使用 tmp_path 参数来更改此设置)。
  • 外部排序的工作效率远远低于在RAM中进行排序。

distributed_aggregation_memory_efficient 是否启用分布式聚合的内存节省模式。

  • 默认1 ,启用

其他优化参数

insert_deduplicate 数据复制表引擎中 数据块被重复数据删除。对于同一数据块的多次写入(相同大小的数据块包含相同顺序的相同行),该块只被写入一次。这样做的原因是当客户端应用程序不知道数据是否已写入数据库时发生网络故障,因此可以简单地重复 INSERT 查询。将相同数据发送到哪个副本 INSERT 并不重要。INSERT 是幂等的。重复数据删除参数由 merge_tree 服务器设置控制。 insert_deduplicate 对于复制表中的 INSERT 查询,指定应执行插入块的重复数据删除。 默认是启用去重,日志会出现Block with ID xx already exists locally as part xx ; ignoring it

max_insert_threads 执行INSERT SELECT查询的最大线程数。 值为0或1表示INSERT SELECT不是并行运行的。 更高的值将导致更高的内存使用。 只有当SELECT部分是并行运行时,并行INSERT SELECT才有效,请参阅’max_threads’设置。

parallel_distributed_insert_select 在同一个集群中,在每个shard的本地表上处理分布式的INSERT SELECT查询; 如果设置为1 -在每个shard上执行SELECT; 如果设置为2,则在每个shard上执行SELECT和INSERT

insert_distributed_sync 默认情况下,向Distributed表中插入数据时,ClickHouse 服务器以异步方式向集群节点发送数据。当 时insert_distributed_sync=1,数据是同步处理的,只有在所有分片上保存所有数据(如果为真INSERT,每个分片至少有一个副本),操作成功。

async_insert_threads 在后台实际解析和插入数据的最大线程数。0表示禁用异步模式

async_insert 如果为true, INSERT查询中的数据将存储在队列中,然后在后台刷新到表中。只有通过HTTP协议插入才有意义。如果wait_for_async_insert为false,则INSERT查询几乎立即被处理,否则客户端将等待数据刷新到表中

wait_for_async_insert如果为真,则等待异步插入处理

查看参数的默认值和含义

show settings ilike '%distributed_aggregation_memory_efficient%';
select  * from `system`.settings s where name in(
        'max_memory_usage_for_user', 
        'max_memory_usage', 
        'max_bytes_before_external_group_by', 
        'max_bytes_before_external_sort', 
        'max_memory_usage_for_all_queries', 
        'max_concurrent_queries_for_user',
        'max_concurrent_queries_for_all_users',
        'max_concurrent_queries',
        'max_server_memory_usage',
        'max_server_memory_usage_to_ram_ratio',
        'max_thread_pool_size',
        'distributed_aggregation_memory_efficient'
    );
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐