Рубрики
Uncategorized

Clickhouse Server — Устранение неполадок

Clickhouse Server — Устранение неполадок. Tagged с Clickhouse, EC2, Cloudopz, DevOps.

Абстрактный

  • Когда мы получаем проблему производительности Clickhouse, например, высокое использование ЦП, чтобы выяснить, что является реальной проблемой и как решить или предоставить обходной путь, нам нужно понять атрибуты Clickhouse System/User Config.

Оглавление

  • MAX_PART_LOADING_THREADS
  • max_part_removal_threads
  • Number_of_free_entries_in_pool_to_execute_mution
  • founal_pool_size
  • founal_schedule_pool_size
  • max_threads
  • Получите размер столов
  • Поймите Clickhouse
  • Включить alluct_introspection_functions для профилирования запросов
  • parts_to_throw_insert

🚀 MAX_PART_LOADING_THREADS

Максимальное количество потоков, которые читают детали при запуске Clickhouse.

  • Возможные значения: Любое положительное целое число. Значение по умолчанию: Авто (количество ядер ЦП).

  • Во время запуска Clickhouse считывает все части всех таблиц (считывает файлы с метаданными частями), чтобы составить список всех частей в памяти. В некоторых системах с большим количеством частей этот процесс может занять много времени, и на этот раз может быть сокращено за счет увеличения MAX_PART_LOADING_THREADS (если этот процесс не является CPU и дисковым вводом -выводом).

  • Проверка запроса

SELECT *
FROM system.merge_tree_settings
WHERE name = 'max_part_loading_threads'

Query id: 5f8c7c7a-5dec-4e89-88dc-71f06d800e04

┌─name─────────────────────┬─value─────┬─changed─┬─description──────────────────────────────────────────┬─type───────┐
│ max_part_loading_threads │ 'auto(4)' │       0 │ The number of threads to load data parts at startup. │ MaxThreads │
└──────────────────────────┴───────────┴─────────┴──────────────────────────────────────────────────────┴────────────┘

1 rows in set. Elapsed: 0.003 sec. 

🚀 max_part_removal_threads

Количество потоков для одновременного удаления неактивных деталей данных. Обычно одно достаточно, но в Google Compute Environment Environment Ssd Persistent Disks Удаление файлов (UNLINK) чрезвычайно медленная, и вам, вероятно, придется увеличить это число (рекомендуется до 16).

🚀 number_of_free_entries_in_pool_to_execute_mution

  • Этот атрибут должен соответствовать founal_pool_size , его значения должны быть founal_pool_size
SELECT *
FROM system.merge_tree_settings
WHERE name = 'number_of_free_entries_in_pool_to_execute_mutation'

┌─name───────────────────────────────────────────────┬─value─┬─changed─┬─description──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ number_of_free_entries_in_pool_to_execute_mutation │ 10    │       0 │ When there is less than specified number of free entries in pool, do not execute part mutations. This is to leave free threads for regular merges and avoid "Too many parts" │
└────────────────────────────────────────────────────┴───────┴─────────┴──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘

🚀 founal_pool_size

  • background_pool_size Устанавливает количество потоков, выполняющих фоновые операции в табличных двигателях (например, слияния в таблицах двигателей Mergetree). Этот параметр применяется из профиля TheDefault при запуске сервера Clickhouse и не может быть изменена в сеансе пользователя. Регулируя эту настройку, вы управляете загрузкой процессора и диска. Меньшие размеры бассейна определяют меньше ресурсов процессора и дисков, но фоновые процессы продвигаются медленнее, что в конечном итоге может повлиять на производительность запроса.

  • Перед тем, как изменить его, также посмотрите на соответствующие настройки Mergetree, такие как number_of_free_entries_in_pool_to_lower_max_size_of_merge andnumber_of_free_entries_in_pool_to_execute_mute.

  • Возможные значения: Любое положительное целое число. Значение по умолчанию: 16.

  • Начать журнал

2021.08.29 04:22:30.824446 [ 12372 ] {}  BackgroundSchedulePool/BgSchPool: Create BackgroundSchedulePool with 16 threads
2021.08.29 04:22:47.891697 [ 12363 ] {}  Application: Available RAM: 15.08 GiB; physical cores: 4; logical cores: 8.
  • Как обновить это значение, например. 5

Обновление config.xml

      
        5
      

Обновление users.xml

    
        
            5
        
    

🚀 founal_schedule_pool_size

  • founal_schedule_pool_size Устанавливает количество потоков, выполняющих фоновые задачи для реплицированных таблиц, потоковой передачи Kafka, обновления кэша DNS. Этот параметр применяется при запуске сервера Clickhouse и не может быть изменена в сеансе пользователя.

  • Возможные значения: Любое положительное целое число. Значение по умолчанию: 128.

  • Как обновить это значение? — В профиле пользователя -> Обновление users.xml (Отключить founal_schedule_pool_size Если мы не используем Replictedmergetree двигатель)

    
      
          0
      
    
  • Получите размер бассейна
SELECT
    name,
    value
FROM system.settings
WHERE name LIKE '%pool%'

┌─name─────────────────────────────────────────┬─value─┐
│ connection_pool_max_wait_ms                  │ 0     │
│ distributed_connections_pool_size            │ 1024  │
│ background_buffer_flush_schedule_pool_size   │ 16    │
│ background_pool_size                         │ 100   │
│ background_move_pool_size                    │ 8     │
│ background_fetches_pool_size                 │ 8     │
│ background_schedule_pool_size                │ 0     │
│ background_message_broker_schedule_pool_size │ 16    │
│ background_distributed_schedule_pool_size    │ 16    │
└──────────────────────────────────────────────┴───────┘
  • Получите справочную задачу
SELECT
    metric,
    value
FROM system.metrics
WHERE metric LIKE 'Background%'

┌─metric──────────────────────────────────┬─value─┐
│ BackgroundPoolTask                      │     0 │
│ BackgroundFetchesPoolTask               │     0 │
│ BackgroundMovePoolTask                  │     0 │
│ BackgroundSchedulePoolTask              │     0 │
│ BackgroundBufferFlushSchedulePoolTask   │     0 │
│ BackgroundDistributedSchedulePoolTask   │     0 │
│ BackgroundMessageBrokerSchedulePoolTask │     0 │
└─────────────────────────────────────────┴───────┘
  • Получите Bgschpool
# ps H -o 'tid comm' $(pidof -s clickhouse-server) |  tail -n +2 | awk '{ printf("%s\t%s\n", $1, $2) }' | grep BgSchPool
7346    BgSchPool/D
SELECT 
    cluster, 
    shard_num, 
    replica_num, 
    host_name
FROM system.clusters

┌─cluster───────────────────────────┬─shard_num─┬─replica_num─┬─host_name─┐
│ test_cluster_two_shards           │         1 │           1 │ 127.0.0.1 │
│ test_cluster_two_shards           │         2 │           1 │ 127.0.0.2 │
│ test_cluster_two_shards_localhost │         1 │           1 │ localhost │
│ test_cluster_two_shards_localhost │         2 │           1 │ localhost │
│ test_shard_localhost              │         1 │           1 │ localhost │
│ test_shard_localhost_secure       │         1 │           1 │ localhost │
│ test_unavailable_shard            │         1 │           1 │ localhost │
│ test_unavailable_shard            │         2 │           1 │ localhost │
└───────────────────────────────────┴───────────┴─────────────┴───────────┘

🚀 max_threads

max_threads

  • Максимальное количество потоков обработки запросов, исключая потоки для извлечения данных с удаленных серверов (см. Параметр ‘max_distributed_connections’).

  • Этот параметр применяется к потокам, которые параллельно выполняют те же этапы конвейера обработки запросов. Например, при считывании из таблицы, если можно оценить выражения с помощью функций, отфильтруйте с тем, где и предварительно агрегация для группы по параллельному использованию, по крайней мере, «max_threads» количество потоков, тогда используется «max_threads».

  • Значение по умолчанию: количество физических ядер ЦП.

  • Для запросов, которые заполнены быстро из -за ограничения, вы можете установить более низкий «max_threads». Например, Если необходимое количество записей расположено в каждом блоке, и тогда получают 8 блоков, хотя этого было бы достаточно, чтобы прочитать только один.

  • Чем меньше значение max_threads, тем меньше памяти потребляется.

  • Обновите это значение в профиле пользователя

🚀 Получите размер таблиц

clickhouse-get-get-size.sql

select concat(database, '.', table)                         as table,
       formatReadableSize(sum(bytes))                       as size,
       sum(rows)                                            as rows,
       max(modification_time)                               as latest_modification,
       sum(bytes)                                           as bytes_size,
       any(engine)                                          as engine,
       formatReadableSize(sum(primary_key_bytes_in_memory)) as primary_keys_size
from system.parts
where active
group by database, table
order by bytes_size desc
  • Для детализации таблицы базы данных
select parts.*,
       columns.compressed_size,
       columns.uncompressed_size,
       columns.ratio
from (
         select table,
                formatReadableSize(sum(data_uncompressed_bytes))          AS uncompressed_size,
                formatReadableSize(sum(data_compressed_bytes))            AS compressed_size,
                sum(data_compressed_bytes) / sum(data_uncompressed_bytes) AS ratio
         from system.columns
         where database = currentDatabase()
         group by table
         ) columns
         right join (
    select table,
           sum(rows)                                            as rows,
           max(modification_time)                               as latest_modification,
           formatReadableSize(sum(bytes))                       as disk_size,
           formatReadableSize(sum(primary_key_bytes_in_memory)) as primary_keys_size,
           any(engine)                                          as engine,
           sum(bytes)                                           as bytes_size
    from system.parts
    where active and database = currentDatabase()
    group by database, table
    ) parts on columns.table = parts.table
order by parts.bytes_size desc;

🚀 Понять сжатие Clickhouse

🚀 Включить alluct_introspection_functions для профилирования запросов

        
            1
        
  • Получить трассировку стека потоков
WITH arrayMap(x -> demangle(addressToSymbol(x)), trace) AS all
SELECT
    thread_id,
    query_id,
    arrayStringConcat(all, '\n') AS res
FROM system.stack_trace
WHERE res LIKE '%SchedulePool%'

┌─thread_id─┬─query_id─┬─res──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│      7346 │          │ pthread_cond_wait
DB::BackgroundSchedulePool::delayExecutionThreadFunction()

ThreadPoolImpl::worker(std::__1::__list_iterator)

start_thread
clone │
└───────────┴──────────┴──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘

🚀 parts_to_throw_insert

  • parts_to_throw_insert Если количество активных частей в одном разделе превышает значение parts_to_throw_insert, вставка прерывается с помощью слишком большого количества частей (n). Слияния обрабатывают значительно медленнее, чем вкладывает исключение.

Возможные значения: любое положительное целое число. Значение по умолчанию: 300.

Чтобы достичь максимальной производительности избранных запросов, необходимо минимизировать количество обработанных частей, см. Дерево слияния.

Вы можете установить большее значение до 600 (1200), это уменьшит вероятность ошибки слишком много деталей, но в то же время выбора производительности могут ухудшиться. Также в случае проблемы слияния (например, из -за недостаточного места на дисковом пространстве) вы заметите его позже, чем с исходными 300.

  • Столкнувшись с проблемой?
2021.08.30 11:30:44.526367 [ 7369 ] {}  void DB::SystemLog::flushImpl(const std::vector &, uint64_t) [LogElement = DB::MetricLogElement]: Code: 252, e.displayText() = DB::Exception: Too many parts (300). Parts cleaning are processing significantly slower than inserts, Stack trace (when copying this message, always include the lines below):
  • И вы решили увеличить parts_to_throw_insert -> Обновление config.xml
    
         600
    

🚀 Vu Dao 🚀 Следуйте

Vumdao/Вумдао

Оригинал: «https://dev.to/vumdao/clickhouse-server-troubleshooting-2gb7»