
# ClickHouse参数调优实践
表1硬件OS\&ClickHouse参数调优汇总（鲲鹏ARM场景调优） 
| 参数分类         | 参数名称        | 参数描述                                                                                                                                                                                                                                                                                               | 默认值     | 建议值                                                                                                                                                                                                                                                                                                                                      |
|:---|:---|:---|:---|:---|
| BIOS调优       | CPU预取       | CPU将内存中的数据读到CPU的高速缓冲Cache时，会根据局部性原理，除了读取本次要访问的数据，还会预取本次数据的周边数据到Cache里面，如果预取的数据是下次要访问的数据，那么性能会提升，如果预取的数据不是下次要取的数据，那么会浪费内存带宽。 对于数据比较集中的场景，预取的命中率高，适合打开CPU预取，反之需要关闭CPU预取。 目前发现speccpu和X265软件场景适合打开CPU预取，STREAM测试工具、Nginx和数据库场景需要关闭CPU预取。 | 未开启预取   | 开启CPU预取                                                                                                                                                                                                                                                                                                                                  |
| BIOS调优       | 性能模式        | CPU性能算力强相关场景，该模式下无动态调频，固定运行在标称频率，会增加功耗开销。                                                                                                                                                                                                                                                          | 未开启性能模式 | 开启性能模式                                                                                                                                                                                                                                                                                                                                   |
| BIOS调优       | 内存刷新频率      | 适当调低内存刷新频率可以提高内存工作效率。                                                                                                                                                                                                                                                                              | AUTO    | 64ms                                                                                                                                                                                                                                                                                                                                     |
| BIOS调优       | SMMU参数      | 关闭SMMU可减少内存访问延迟,降低开销,简化内存管理。                                                                                                                                                                                                                                                                       | 启用SMMU  | 关闭SMMU                                                                                                                                                                                                                                                                                                                                   |
| OS调优         | 透明大页        | 在openEuler 20.03上透明大页是默认开启的，关闭后可以获得不错的性能提升。                                                                                                                                                                                                                                                        | 启用透明大页  | 关闭透明大页                                                                                                                                                                                                                                                                                                                                   |
| ClickHouse调优 | max_threads | 修改配置参数max_threads,设置为不同的值可能获得优化效果。 由于X86物理核数较少，且超线程基于同一个物理核，该优化对X86效果不显著。由于鲲鹏物理核数较多，跨NUMA使用内存数据量较多，因此该参数优化效果明显。                                                                                                                                                      | CPU核个数  | 根据业务场景不同，可进行调整，直到性能达到业务目标。根据金融行业经验： - 在人群圈选画像场景下，宽表1\~10条件组合查询，max_threads调整为2查询性能最优；  - 1\~10聚合键group by聚合分析场景，max_threads为CPU核的50%查询性能最优。   |
   
表2ClickHouse参数调优汇总（X86\&ARM通用场景调优） 
| 参数名                                  | 参数描述                                                                                                         | 默认值     | 建议值                                                                                                                                                                                                                                                                                                                                 | 配置方式                                                                                                                | 是否需要重启生效         |
|:---|:---|:---|:---|:---|:---|
| max_memory_usage_for_all_queries     | 单台服务器上所有查询的内存使用量，默认没有限制。建议根据机器的总内存，预留一部分空间，防止内存不够导致服务或者机器异常。                                                 | 0       | 机器总内存的80%                                                                                                                                                                                                                                                                                                                           | 配置参数界面存在，则直接配置。如果不存在，则通过clickhouse-user-profiles-customize自定义配置profiles.default.max_memory_usage_for_all_queries。   | 否                |
| max_memory_usage                     | 单个查询在单台服务器的能使用的最大内存。                                                                                         | 10G     | 50GB                                                                                                                                                                                                                                                                                                                                | 配置参数界面存在，则直接配置。如果不存在，则通过clickhouse-user-profiles-customize自定义配置profiles.default.max_memory_usage。                   | 否（新版本可通过多租户方式配置） |
| max_bytes_before_external_group_by   | 确定了在GROUP BY中启动将临时数据转存到磁盘上的内存阈值。默认值为0表示这项功能将被禁用。一般：设置为max_memory_usage/2。                                    | 0       | 25GB                                                                                                                                                                                                                                                                                                                                | 配置参数界面存在，则直接配置。如果不存在，则通过clickhouse-user-profiles-customize自定义配置profiles.default.max_bytes_before_external_group_by。 | 否                |
| max_execution_time                   | 单次查询耗时的最长时间，单位为秒。默认没有限制。                                                                                     | 0       | 300                                                                                                                                                                                                                                                                                                                                 | 配置参数界面存在，则直接配置。如果不存在，则通过clickhouse-user-profiles-customize自定义配置profiles.default.max_execution_time。                 | 否                |
| max_threads                          | 每个SQL语句执行时请求的最大线程数。默认情况下是按照机器CPU核数自动确定的。单并发情况下线程数越大越好（该值要小于CPU核数），多并发情况建议设置为CPU核数/2的值。在鲲鹏ARM架构下，需根据具体业务模型调优。 | CPU核数/2 | 64                                                                                                                                                                                                                                                                                                                                  | 配置参数界面存在，则直接配置。如果不存在，则通过clickhouse-user-profiles-customize自定义配置profiles.default.max_threads。                        | 否                |
| max_result_rows                      | 限制返回结果行数，默认为0不限制。                                                                                            | 0       | 100000                                                                                                                                                                                                                                                                                                                              | 配置参数界面存在，则直接配置。如果不存在，则通过clickhouse-user-profiles-customize自定义配置profiles.default.max_result_rows。                    | 否                |
| distributed_product_mode             | 默认SQL中的子查询不允许使用分布式表，修改为local表示将子查询中对分布式表的查询转换为对应的本地表。                                                        | deny    | 根据场景定： deny/local/global/allow                                                                                                                                                                                                                                                                          | 配置参数界面存在，则直接配置。如果不存在，则通过clickhouse-user-profiles-customize自定义配置profiles.default.distributed_product_mode。           | 否                |
| background_pool_size                 | 后台用于merge的线程池大小。                                                                                             | 16      | - 4u16G：cpu核数  - 8u32G：cpu核数  - 16u64G及以上：CPU内核数 \* 2                                                        | 配置参数界面配置。                                                                                                           | 否                |
| max_bytes_before_external_sort       | 如果没有足够的内存，可以使用该参数来设置外部排序（在磁盘中创建一些临时文件）。默认为0表示禁用外部排序功能，当内存不够时直接抛错，设置了该值order by可以正常完成，但是速度非常慢。                | 0       | 25GB                                                                                                                                                                                                                                                                                                                                | 配置参数界面存在，则直接配置。如果不存在，则通过clickhouse-user-profiles-customize自定义配置profiles.default.max_bytes_before_external_sort。     | 否                |
| keep_alive_timeout                   | 服务端与客户端保持长连接的时长，单位为秒。                                                                                        | 10      | 80                                                                                                                                                                                                                                                                                                                                  | 配置参数界面存在，则直接配置。如果不存在，则通过clickhouse-config-customize自定义配置keep_alive_timeout                                          | 是                |
| max_concurrent_queries               | 最大支持的查询并发。                                                                                                   | 100     | 100                                                                                                                                                                                                                                                                                                                                 | 配置参数界面配置。                                                                                                           | 否                |
| session_timeout_ms                   | ClickHouse服务和ZooKeeper保持的会话时长，超过该时间ZooKeeper还收不到Clickhouse的心跳信息，会将与Clickhouse的session断开。                     | 3000    | 60000                                                                                                                                                                                                                                                                                                                               | 配置参数界面配置。                                                                                                           | 否                |
| max_server_memory_usage_to_ram_ratio | ClickHouseServer默认可使用的系统最大内存比例，小数表示，如0.9表示系统内存的90%。配置不合理可能出现节点OOM导致业务受损。                                     | 0.8     | - 4u16G：0.6  - 8u32G：0.7  - 16u64G：0.8  - 32u128G及以上：0.9   | 配置参数界面存在，则直接配置。如果不存在，则通过clickhouse-config-customize自定义配置max_server_memory_usage_to_ram_ratio。                       | 否                |
   
