Способны ли ARM-серверы эффективно работать в качестве высоконагруженного решения для PostgreSQL 13? Мы провели синтетические тесты, сравнивая TaiShan 200 с аналогичным оборудованием на платформе x86, и пришли к интересным результатам. Конфигурации, описание методики и выводы – под катом.

Цели тестирования

Перед началом тестирования популярного сервера баз данных PostgreSQL 13 ставилась задача проверить, возможно ли использовать ARM-серверы производства HUAWEI продуктовой линейки TaiShan 200 на базе разработанных дочерней компанией HiSilicon процессоров Kunpeng 920 в качестве высоконагруженных узлов для серверов БД. Попутно предложить вариант оптимизации настроек и получения максимальной производительности сервера, а также сравнить полученные результаты с x86-платформой.

Продукты HUAWEI на ARM-процессорах Kunpeng
Продукты HUAWEI на ARM-процессорах Kunpeng

Тестовый сервер и подготовка к тестированию

Практически любому серверу БД для получения максимальной производительности критически важно иметь быстрое и производительное хранилище. В самом простом случае это могут быть размещенные в сервере локальные накопители SSD или NVMe. В расположенной в Москве лаборатории OpenLab подобные ARM-серверы имеются, и для теста была взята модель TaiShan 2280.

Универсальный сервер TaiShan 2280 представляет собой платформу шасси высотой 2U, 2-socket, работающий на 64-разрядном процессоре Huawei Kunpeng 920. Сервер обеспечивает в общей сложности 128 ядер ARMv8.2, работающих на частоте 2,6 ГГц с возможностью установки до 28 твердотельных накопителей NVMe.

Универсальный сервер TaiShan 2280
Универсальный сервер TaiShan 2280

Конфигурация тестового сервера и версии ПО

Hardware:

  • HUAWEI TaiShan 200 (Model 2280) с 2шт. SoC HUAWEI Kunpeng 920 6426 (в каждом CPU по 64 ядра @ 2.60 ГГц)

  • 512 ГБ RAM DDR4 2933 МГц. Установлено 8 модулей 64 ГБ DDR4 DIMM, (минимальная рекомендуемая конфигурация), использовалось 4 канала памяти из 8 доступных

  • 8 HDD 2.5" 1.2TB SAS 10k RPM

  • 3.2 TB HUAWEI ES3000 V5 PCIe NVMe SSD

  • 4 сетевых порта 1GbE

  • 4 сетевых порта 25GbE

Операционная система:

CentOS 7.9 (ядро Linux 4.18.0-193.28.1.el7.aarch64)

СУБД:

PostgreSQL 13.2 on aarch64-linux-gnu, compiled by gcc (GCC) 10.2.0, 64-bit

Средство тестирования (benchmark):

pgbench (PostgreSQL) 13.2

Серверная материнская плата с двумя SoC Kunpeng 920
Серверная материнская плата с двумя SoC Kunpeng 920

Основной рекомендацией для получения максимальной производительности на ARM-серверах TaiShan является установка последних версий ПО (это также относится и к версии ОС, например, совместимых версий CentOS, Ubuntu и т.д.) с помощью собранного из исходных кодов с оптимизацией под SoC Kunpeng 920 последних версий компилятора gcc.

Результаты собранного с помощью этого компилятора прикладного ПО оказываются выше, т.к. при компиляции идёт оптимизация под CPU. Это дает выигрыш в производительности на том же оборудовании, относительно стандартных пакетов, полученных из публичных репозиториев ОС. Таким образом производится и сборка также чувствительного к производительности прикладного ПО, например, СУБД PostgreSQL.

Повышения производительности можно добиться, применив рекомендации из tuning guide (можно найти в одном из 8 рекомендованных BoostKit) для каждого продукта с официального сайта hikunpeng.com. Для PostgreSQL такой имеется: заходим → References → PostgreSQL → Tuning Guide.

Оптимизация настроек сервера и ядра ОС, конфигурация компилятора и СУБД

В ходе тестирования были выполнены следующие настройки:

Настройки BIOS:

Advanced → MISC Config → Support Smmu → Disable

Advanced → MISC Config → CPU Prefetching Configuration → Disable

Настройки параметров ядра ОС:

sysctl -w vm.swappiness=1
sysctl -w vm.max_map_count=3112960
sysctl -w net.core.somaxconn=1024

Пример конфигурации компилятора gcc 10.2.0:

# gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/local/libexec/gcc/aarch64-linux-gnu/10/lto-wrapper
Target: aarch64-linux-gnu
Configured with: ../gcc-10.2.0/configure --enable-languages=c,c++ --with-gcc-major-version-only --enable-shared --disable-multilib --with-arch=armv8.2-a --with-cpu=tsv110 -build=aarch64-linux-gnu --host=aarch64-linux-gnu --target=aarch64-linux-gnu
Thread model: posix
Supported LTO compression algorithms: zlib
gcc version 10.2.0 (GCC)

Пример конфигурации сервера БД PostgreSQL (postgresql.conf):

max_connections = 1024
shared_buffers = 390GB
max_prepared_transactions = 2048
huge_pages = try
work_mem = 1GB
maintenance_work_mem = 2GB
dynamic_shared_memory_type = posix
max_files_per_process = 100000
vacuum_cost_limit = 10000
bgwriter_delay = 10ms
bgwriter_lru_maxpages = 1000
bgwriter_lru_multiplier = 10.0
bgwriter_flush_after = 0
effective_io_concurrency = 200
max_worker_processes = 128
max_parallel_maintenance_workers = 4
max_parallel_workers_per_gather = 4
max_parallel_workers = 128
wal_level = minimal
fsync = on
synchronous_commit = on
wal_sync_method = fsync
full_page_writes = off
wal_compression = on
wal_buffers = 1GB
checkpoint_timeout = 10min
max_wal_size = 20GB
min_wal_size = 1GB
checkpoint_completion_target = 0.9
max_wal_senders = 0
random_page_cost = 1.1
effective_cache_size = 384GB
default_statistics_target = 100
log_checkpoints = on
log_autovacuum_min_duration = 0
autovacuum_max_workers = 5
autovacuum_naptime = 20s
autovacuum_vacuum_scale_factor = 0.002
autovacuum_analyze_scale_factor = 0.001

Методика тестирования и примеры запуска pgbench

Тестирование производилось стандартным инструментом для PostgreSQL pgbench.

Методика:

1)    Создаем тестовую БД следующей командой (размер около 370 ГБ):

pgbench -i -s 25000

2) Выполняем несколько SQL-запросов для разогрева кэша БД:

            CREATE EXTENSION pg_prewarm;
      select pg_prewarm('pgbench_accounts'::regclass);
      select pg_prewarm('pgbench_accounts_pkey'::regclass);
      select pg_prewarm('pgbench_tellers'::regclass);
      select pg_prewarm('pgbench_history'::regclass);
      select pg_prewarm('pgbench_branches'::regclass);

3) Пример команд для запуска теста с помощью pgbench для TPC-B like смешанных запросов (чтение, изменение, запись) и select-only запросов (только чтение):

pgbench -j 128 -c 300 -T 60
pgbench -j 128 -c 300 -T 60 -S

4) Примеры запуска команд:

-bash-4.2$ pgbench -j 128 -c 400 -T 60
starting vacuum...end.
transaction type: <builtin: TPC-B (sort of)>
scaling factor: 25000
query mode: simple
number of clients: 400
number of threads: 128
duration: 60 s
number of transactions actually processed: 4252809
latency average = 5.651 ms
tps = 70779.466059 (including connections establishing)
tps = 70859.923988 (excluding connections establishing)
-bash-4.2$ pgbench -j 128 -c 300 -T 60 -S
starting vacuum...end.
transaction type: <builtin: select only>
scaling factor: 25000
query mode: simple
number of clients: 300
number of threads: 128
duration: 60 s
number of transactions actually processed: 59593685
latency average = 0.302 ms
tps = 992318.982321 (including connections establishing)
tps = 1318347.345721 (excluding connections establishing)

Результаты тестирования

После проведения серии тестовых запусков с количеством одновременных соединений 50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000шт. были получены следующие результаты:

Сравнение результатов с x86-платформой

Аналогичное тестирование было проведено для сравнения с x86-платформой. Были взяты 64шт. CPU ядер с частотой 2,6 ГГц, выделенных на сервере ARM (SoC HUAWEI Kunpeng 920), и 28шт. CPU ядер с частотой 3,0 ГГц, выделенных на сервере x86 (процессор Intel Xeon Scalable). В среднем производительность сервера на платформе ARM оказалась на 10-15% выше, чем у аналогичной конфигурации на платформе x86.

Заключение

Производительность системы зависит от используемого оборудования, операционной системы (ОС) и базового программного обеспечения. На это также влияет общий дизайн каждой подсистемы, используемые алгоритмы и настройки компилятора.

Результаты текущего тестирования с синтетическими данными показывают, что серверы могут использоваться в качестве высоконагруженных узлов PostgreSQL и способны демонстрировать производительность не ниже, чем аналогичные платформы x86.

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

Комментарии (10)


  1. vazir
    22.11.2021 14:29

    Были взяты 64шт. CPU ядер с частотой 2,6 ГГц, выделенных на сервере ARM (SoC HUAWEI Kunpeng 920), и 28шт. CPU ядер с частотой 3,0 ГГц, выделенных на сервере x86

    Т.е. для обеспечения паритета к 28 ядер интел надо 64 ядра АРМ? Да и как то непонятно, в общей сложности у вас указано что сервер то 2х64 ядра. т.е. 128 ядер АРМ против 28 ядер интел?


    1. easyman
      22.11.2021 15:39
      +1

      А мы сами должны догадаться про стоимость серверов и TCO и кол-во транзакций на единицу денежки


    1. UCP Автор
      22.11.2021 15:47
      +1

      Тестирование 28шт. ядер на x86 и 64шт. на ARM проводилось отдельное (оно по сути и методике одинаковое с тем, что описано в этой статье) и его основной идеей являлось сравнить производительность решений с примерно одинаковой стоимостью (т.е. учитывался cost-performance). ARM процессор Kunpeng 920 не поддерживает одновременную многопоточность (SMT) в отличие от процессоров Xeon Scalable c HT и в целом для текущего теста был взят open-source PostgreSQL. В целом производительность Kunpeng 920 выпущенного в 2019г. до сих пор является одной из самых лучших и не уступает другим решениям на рынке. Вот для сравнения отчеты SPECrate2017_int с результатами тестирования сервера с Intel Xeon Gold 6240 https://www.spec.org/cpu2017/results/res2019q2/cpu2017-20190415-11976.html и Huawei Kunpeng 920 7260 https://www.spec.org/cpu2017/results/res2020q2/cpu2017-20200529-22566.html


    1. borovinskiy
      22.11.2021 18:16

      PostgreSQL очень хорошо масштабируется на HT-ядрах.
      "дополнительное" HT-ядро может добавлять 70% (см. излом на https://elibsystem.ru/node/490).

      Т.е. очень грубо, для PostgreSQL 28 ядер с HT2 эффективно будет под 48 ядер без HT.

      Умножать ядра на частоту нельзя, но когда очень хочется, то для Intel 48 "эффективных ядер" x 3 ГГц = 144 эффективных ГГц на сервер, а ARM 64 x 2.6 ГГц = эффективных 166 ГГц.

      Ну какую-то такую разницу и видно в сравнении производительностей.


  1. kolu4iy
    22.11.2021 17:14

    А prefetch зачем на нём выключали? Он так плох, что портит результаты?


    1. UCP Автор
      22.11.2021 17:54
      +1

      Настройку CPU prefetch рекомендуется отключать скорее из-за характера нагрузки. Т.к. изначально планировалось запускать приложение, которое интенсивно работает с памятью и также много производит выборки данных случайным образом, то настройку рекомендуется отключать, т.к. иначе наблюдается некоторая потеря производительности. Скорее всего в условиях обычной эксплуатации серверов, т.е. вне задачи запуска benchmark теста вроде pgbench, отключать prefetcher не надо было бы и производительность была бы лучше с включенной настройкой CPU prefetch.


      1. kolu4iy
        24.11.2021 09:50

        И всё же графика с включенным CPU prefetch не хватает. Интересно, а это prefetch всё же данных, как подразумевает ваш комментарий, или кода? Нет строчки из инструкции?


  1. zen
    23.11.2021 17:13

    Как верхний и нижний графики соотносятся друг с другом ? Желтый цвет вы специально выбрали, чтобы мы глаза ломали ?


  1. kolu4iy
    24.11.2021 09:49

    Я вот подумал - и понял, что в сравнении не хватает современных процессоров AMD, с соответствующим подсчетом TCO.

    P.S. Не подумайте плохого - я рад, что ARM таки прогрызает себе дорогу в серверные продакшн-решения. Но хочу всё знать.


    1. Am0ralist
      25.11.2021 12:11

      Так современные — это уже анонсированные с 3d кэшем нужно ждать. Вот там всё станет ещё интереснее, когда на процессор будет по 800 мегабайт кэша…