Требуется поддержка набора инструкций SSE 4.2. Современные процессоры (с 2008 года) его поддерживают.
При выборе между процессорами с большим числом ядер с немного меньшей тактовой частотой и процессором с меньшим числом ядер с высокой тактовой частотой, первый вариант более предпочтителен.
Например, 16 ядер с 2600 MHz лучше, чем 8 ядер 3600 MHz.
Hyper-Threading
---------------
Hyper-threading лучше не отключать. Некоторые запросам он помогает, а некоторым — нет.
Turbo-Boost
-----------
Turbo-Boost крайне не рекомендуется отключать. При типичной нагрузке он значительно улучшает производительность.
Можно использовать ``turbostat`` для просмотра реальной тактовой частоты процессора под нагрузкой.
CPU scaling governor
--------------------
Нужно всегда использовать ``performance`` scaling governor. ``ondemand`` scaling governor работает намного хуже при постоянно высоком спросе.
..code-block:: bash
sudo echo 'performance' | tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
Ограничение CPU
---------------
Процессоры могут перегреваться. С помощью ``dmesg`` можно увидеть, если тактовая частота процессора была ограничена из-за перегрева.
Также ограничение может устанавливаться снаружи на уровне датацентра. С помощью ``turbostat`` можно за этим наблюдать под нагрузкой.
Оперативная память
------------------
Для небольших объемов данных (до ~200 Гб в сжатом виде) лучше всего использовать столько памяти не меньше, чем объем данных.
Для больших объемов данных, при выполнении интерактивных (онлайн) запросов, стоит использовать разумный объем оперативной памяти (128 Гб или более) для того, чтобы горячее подмножество данных поместилось в кеше страниц.
Даже для объемов данных в ~50 Тб на сервер, использование 128 Гб оперативной памяти намного лучше для производительности выполнения запросов, чем 64 Гб.
Файл подкачки
-------------
Всегда отключайте файл подкачки. Единственной причиной этого не делать может быть только использование ClickHouse на личном ноутбуке.
Huge pages
----------
Механизм прозрачных huge pages нужно отключить. Он мешает работе аллокаторов памяти, что приводит к значительной деградации производительности.
..code-block:: bash
echo 'never' | sudo tee /sys/kernel/mm/transparent_hugepage/enabled
С помощью ``perf top`` можно наблюдать за временем, проведенном в ядре операционной системы для управления памятью.
Постоянные huge pages так же не нужно аллоцировать.
Подсистема хранения
-------------------
Если ваш бюджет позволяет использовать SSD, используйте SSD.
В противном случае используйте HDD. SATA HDDs 7200 RPM подойдут.
Предпочитайте много серверов с локальными жесткими дисками вместо меньшего числа серверов с подключенными дисковыми полками.
Но для хранения архивов с редкими запросами полки всё же подходят.
RAID
----
При использовании HDD можно объединить их RAID-10, RAID-5, RAID-6 или RAID-50.
Лучше использовать программный RAID в Linux (``mdadm``). Лучше не использовать LVM.
При создании RAID-10, нужно выбрать ``far`` расположение.
Если бюджет позволяет, лучше выбрать RAID-10.
На более чем 4 дисках вместо RAID-5 нужно использовать RAID-6 (предпочтительнее) или RAID-50.
При использовании RAID-5, RAID-6 или RAID-50, нужно всегда увеличивать stripe_cache_size, так как значение по умолчанию выбрано не самым удачным образом.
..code-block:: bash
echo 4096 | sudo tee /sys/block/md2/md/stripe_cache_size
Точное число стоит вычислять из числа устройств и размер блока по формуле: ``2 * num_devices * chunk_size_in_bytes / 4096``.
Размер блока в 1024 Кб подходит для всех конфигураций RAID.
Никогда не указывайте слишком маленький или слишком большой размер блока.
На SSD можно использовать RAID-0.
Вне зависимости от использования RAID, всегда используйте репликацию для безопасности данных.
Включите NCQ с длинной очередью. Для HDD стоит выбрать планировщик CFQ, а для SSD — noop. Не стоит уменьшать настройку readahead.
Большинство других файловых систем также должны нормально работать. Файловые системы с отложенной аллокацией работают лучше.
Ядро Linux
----------
Не используйте слишком старое ядро Linux. В 2015 году 3.18.19 — достаточно свежее.
Рассмотрите возможность использования сборки ядра от Яндекса: https://github.com/yandex/smart — это дает прирост в производительности не менее 5%.
Сеть
----
При использовании IPv6, стоит увеличить размер кеша маршрутов.
Ядра Linux до 3.2 имели массу проблем в реализации IPv6.
Предпочитайте как минимум 10 Гбит сеть. 1 Гбит также будет работать, но намного хуже для починки реплик с десятками терабайт данных или для обработки распределенных запросов с большим объемом промежуточных данных.
ZooKeeper
---------
Вероятно вы уже используете ZooKeeper для других целей. Можно использовать ту же инсталляцию ZooKeeper, если она не сильно перегружена.
Лучше использовать свежую версию ZooKeeper, как минимум 3.5. Версия в стабильных дистрибутивах Linux может быть устаревшей.
С настройками по умолчанию, ZooKeeper является бомбой замедленного действия:
Сервер ZooKeeper не будет удалять файлы со старыми снепшоты и логами при использовании конфигурации по умолчанию (см. autopurge), это является ответственностью оператора.