Skip to content

Instantly share code, notes, and snippets.

@dblokhin
Created June 16, 2016 04:10
Show Gist options
  • Save dblokhin/efe53dd8f6543f63d74053802fae5004 to your computer and use it in GitHub Desktop.
Save dblokhin/efe53dd8f6543f63d74053802fae5004 to your computer and use it in GitHub Desktop.
ClickHouse administration tips.
CPU
SSE 4.2 instruction set support is required. Most recent (since 2008) CPUs have this instruction set.
When choosing between CPU with more cores and slightly less frequency and CPU with less cores and more frequency, choose first.
For example, 16 cores with 2600 MHz is better than 8 cores with 3600 MHz.
Hyper-Threading
Don't disable hyper-threading. Some queries will benefit from hyper-threading and some will not.
Turbo-Boost
Don't disable turbo-boost. It will do significant performance gain on typical load.
Use 'turbostat' tool to show real CPU frequency under load.
CPU scaling governor
Always use 'performance' scaling governor. 'ondemand' scaling governor performs much worse even on constantly high demand.
sudo echo 'performance' | tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
CPU throttling
Your CPU could be overheated. Use 'dmesg' to show if it was thermal throttled.
Your CPU could be power capped in datacenter. Use 'turbostat' tool under load to monitor that.
RAM
For small amount of data (up to ~200 GB compressed) prefer to use as much RAM as data volume.
For larger amount of data, if you run interactive (online) queries, use reasonable amount of RAM (128 GB or more) to hot data fit in page cache.
Even for data volumes of ~50 TB per server, using 128 GB of RAM is much better for query performance than 64 GB.
Swap
Disable swap. The only possible reason to not disable swap is when you are running ClickHouse on your personal laptop/desktop.
Huge pages
Disable transparent huge pages. It interfers badly with memory allocators, leading to major performance degradation.
echo 'never' | sudo tee /sys/kernel/mm/transparent_hugepage/enabled
Use 'perf top' to monitor time spent in kernel on doing memory management.
Don't allocate permanent huge pages.
Storage subsystem
If you could afford SSD, use SSD.
Otherwise use HDD. SATA HDDs 7200 RPM are Ok.
Prefer more servers with inplace storage to less servers with huge disk shelves.
Of course you could use huge disk shelves for archive storage with rare queries.
RAID
When using HDDs, you could use RAID-10, RAID-5, RAID-6 or RAID-50.
Use Linux software RAID (mdadm). Better to not use LVM.
When creating RAID-10, choose 'far' layout.
Prefer RAID-10 if you could afford it.
Don't use RAID-5 on more than 4 HDDs - use RAID-6 or RAID-50. RAID-6 is better.
When using RAID-5, RAID-6, or RAID-50, always increase stripe_cache_size, because default setting is awful.
echo 4096 | sudo tee /sys/block/md2/md/stripe_cache_size
Exact number is calculated from number of devices and chunk size: 2 * num_devices * chunk_size_in_bytes / 4096.
Chunk size 1024K is Ok for all RAID configurations.
Never use too small or too large chunk sizes.
On SSDs, you could use RAID-0.
Regardless to RAID, always use replication for data safety.
Enable NCQ. Use high queue depth. Use CFQ scheduler for HDDs and noop for SSDs. Don't lower readahead setting.
Enable write cache on HDDs.
Filesystem
Ext4 is Ok. Mount with noatime,nobarrier.
XFS is Ok too, but less tested with ClickHouse.
Most other filesystems should work fine. Filesystems with delayed allocation are better.
Linux kernel
Don't use too old Linux kernel. For example, on 2015, 3.18.19 is Ok.
You could use Yandex kernel: https://github.com/yandex/smart
- it gives at least 5% performance increase.
Network
When using IPv6, you must increase route cache.
Linux kernels before 3.2 has awful bugs in IPv6 implementation.
Prefer at least 10 Gbit network. 1 Gbit will also work, but much worse for repairing replicas with tens of terabytes of data and for processing huge distributed queries with much intermediate data.
ZooKeeper
Probably you already have ZooKeeper for another purposes.
It's Ok to use existing ZooKeeper installation if it is not overloaded.
Use recent version of ZooKeeper. At least 3.5 is Ok. Version in your linux package repository might be outdated.
With default settings, ZooKeeper have time bomb:
"A ZooKeeper server will not remove old snapshots and log files when using the default configuration (see autopurge below), this is the responsibility of the operator."
You need to defuse the bomb.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment