Опыт создания хранилища Ceph c пропускной способностью тебибайт в секунду

Инженер из компании Clyso обобщил опыт создания кластера хранения на базе отказоустойчивой распределённой системы Ceph с пропускной способностью, превышающей тебибайт в секунду. Отмечается, что это первый кластер на базе Ceph, который смог достигнуть подобного показателя, но перед получением представленного результата инженерам потребовалось преодолеть серию неочевидных подводных камней. Например, для повышения производительности на 10-20% было достаточно включить на серверах в настройках энергосбережения BIOS работу только в режиме максимальной производительности и отключить c-state (c-state меняет параметры энергосбережения в зависимости от нагрузки, что отражается на Ceph). Также оказалось, что при использовании накопителей NVMe ядро Linux значительное время тратит на обработку spin-блокировок в процессе обновления маппинга IOMMU. Отключение IOMMU в ядре привело к заметному росту производительности в тестах записи и чтения блоков размером 4MB. При этом отключение IOMMU не решило проблему с проседанием производительности при случайной записи блоков, размером 4KB. Разбираясь в чём дело, инженеры натолкнулись на исправления в сборочных сценариях Ceph от проектов Gentoo и Ubuntu, которые включали сборку с опцией RelWithDebInfo, так как с ней в GCC применялся режим оптимизации "-O2", при котором заметно возрастала производительность Ceph. К снижению производительности также приводила компиляция с библиотекой TCMalloc. Изменение флагов компиляции и прекращение использования TCMalloc привело к снижению времени упаковки (compaction) в три раза и повышению производительности случайных операций записи блоками 4K в два раза. В финале дополнительно была произведена оптимизация настроек Reef RocksDB и групп размещения (PG). Кластер сформирован из 68 узлов на базе серверов Dell PowerEdge R6615 с CPU AMD EPYC 9454P 48C/96T. Каждый узел содержит 10 NVMe-накопителей Dell 15.36TB, два Ethernet-адаптера 100GbE Mellanox ConnectX-6 и 192 ГБ ОЗУ. Программное обеспечение основано на Ubuntu 20.04.6 и Ceph 17.2.7. В кластере на 63 узлах поднято 630 OSD (Оbject Storage Daemon, фоновый процесс управляющий хранением данных в локальном хранилище, по одному OSD на NVMe-накопитель), три процесса MON (monitor, отслеживает состояние кластера) и один процесс MGR (Manager, управляющий сервис). Размер хранилища 8.2 ПБ. Пропускная способность при последовательных операциях чтения блоков 4М составила 1025 GiB/s, записи - 270 GiB/s. При случайном чтении блоков 4KB производительность составила 25.5 миллионов операций чтения в секунду и 4.9 млн при записи. Включение шифрования уменьшило пропускную способность при чтении примерно до 750 GiB/s. При задействовании кодов коррекции ошибок EC62 пропускная способность составила 547 GiB/s при чтении и 387 GiB/s при записи (скорость записи оказалась выше чем без кодов коррекции), а при случайном доступе 3.4M IOPS при чтении и 936K IOPS при записи. Дополнительно можно отметить, что в сентябре похожий рубеж пропускной способности в тебибайт в секунду был достигнут в эксабайтном кластере хранения CERN, реализованном на базе открытого распределённого хранилища EOS, построенного на базе протокола XRootD.