Пересборка ClickHouse для процессоров без поддержки SSE 4.2

В официальных репозиториях Debian Buster появились пакеты с сервером и клиентом Clickhouse. По умолчанию сервер Clickhouse собран с использованием процессорных инструкций SSE 4.2, т.к. именно такие системные требования указаны на официальной странице проекта.

Для проверки, поддерживает ли процессор SSE 4.2, можно воспользоваться следующей командой:

$ grep -q sse4_2 /proc/cpuinfo && echo "SSE 4.2 supported" || echo "SSE 4.2 not supported"

При попытке запустить сервер ClickHouse на процессоре, не поддерживающем этот набор инструкций, в журнале /var/log/messages можно будет обнаружить сообщения следующего вида:

Aug  9 18:33:45 buster kernel: [    7.571795] traps: clickhouse-serv[257] trap invalid opcode ip:7f89f23 sp:7ffda2789a98 error:0 in clickhouse[400000+f8a5000]

Мой домашний компьютер не отличается новизной, поэтому для экспериментов дома мне пришлось пересобрать пакеты с Clickhouse. Сборочные скрипты автоматически определяют поддержку инструкций SSE 4.2 и при её отсутствии выполняют сборку так, чтобы пакеты работали без них.

Впишем в файл /etc/apt/sources.list дополнительные репозитории с исходными текстами:

deb-src http://mirror.yandex.ru/debian/ buster main contrib non-free
deb-src http://mirror.yandex.ru/debian/ buster-updates main contrib non-free
deb-src http://mirror.yandex.ru/debian/ buster-proposed-updates main contrib non-free
deb-src http://mirror.yandex.ru/debian-security/ buster/updates main contrib non-free

Обновим список пакетов, доступных через репозитории:

# apt-get update

Установим пакеты, которые потребуются нам для сборки ClickHouse из исходных текстов:

# apt-get build-dep clickhouse

И скачаем пакет с исходными текстами:

$ apt-get source clickhouse

Переходим в каталог с распакованными исходными текстами, запускаем dch и описываем изменения.

$ cd clickhouse-18.16.1+ds
$ dch -i

В открывшемся редакторе дописываем к номеру версии fix1 и описываем изменения:

clickhouse (18.16.1+ds-4fix1) UNRELEASED; urgency=medium

  * Version with no need CPU with support SSE4.2 instruction set..

 -- Vladimir Stupin <vladimir@stupin.su>  Tue, 14 Jan 2020 11:28:11 +0500

Собираем пакет:

$ debuild -us -uc

Для сборки потребуется довольно много оперативной памяти. Я пытался собрать пакет на виртуальной машине с 2 гигабайтами оперативной памяти, потом увеличил до 3 и до 4, но этого объёма оказывалось по-прежнему недостаточно для того, чтобы собрать библиотеку libclickhouse.so из объектных файлов. Вернул виртуальной машине 2 гигабайта оперативной памяти и подключил раздел подкачки размером 8 гигабайт. Сборка шла долго, но всё-таки завершилась успешно.

Если сборка завершается неудачно, а в тексте ошибки имеются такие строки:

CMake Error: Error: generator : Unix Makefiles
Does not match the generator used previously: Ninja
Either remove the CMakeCache.txt file and CMakeFiles directory or choose a different binary directory.

То можно попробовать удалить пакет ninja-build:

# apt-get purge ninja-build

Затем можно попробовать запустить сборку пакета снова.

После успешной сборки можно будет выйти из сборочного каталога и установить появившиеся рядом с ним двоичные пакеты:

# dpkg -i clickhouse-server_18.16.1+ds-4fix1_amd64.deb clickhouse-client_18.16.1+ds-4fix1_amd64.deb clickhouse-common_18.16.1+ds-4fix1_amd64.deb

Или можно воспользоваться утилитой aptly, чтобы создать собственный репозиторий и поместить в него эти пакеты. В таком случае для установки пакетов в систему будет достаточно:

  1. подключить этот репозиторий в файле /etc/apt/sources.list,
  2. обновить список пакетов, доступных через репозитории, командой apt-get update,
  3. поставить пакеты, например, командой apt-get install clickhouse-server clickhouse-client

Написать автору