sysBoosts

В данной статье будет произведено знакомство с технологией sysBosts, которая позволяет ускорить процесс запуска программ.

Введение

sysBoost производит переупорядочивание исполняемого кода динамических библиотек, для повышения производительности программы, путем уменьшения количества сегментов кода и количества кеш-промахов.

Предыстория

Большие приложения используют большое количество сторонних или собственных динамических библиотек. Большое количество переходов PLT происходит во время вызова функций, что уменьшает количество инструкций за цикл (IPC).

Ассемблерный код имеет большой размер и занимает большой объем памяти, что приводит к высокой частоте кеш-промахов iTLB, сегменты кода Hotspot разбросаны. В результате растёт частота промахов кеша инструкций, что влияет на эффективность конвейера CPU.

Разработчики приложений не знакомы с микроархитектурой ОС и ЦП, что приводит к высоким затратам на оптимизацию производительности IPC.

Структура sysBoosts

В основе работы sysBoosts используются следующие технологии:

  • Динамическое слияние библиотек: разрозненные сегменты кода и сегменты данных объединяются, когда динамический загрузчик загружает динамические библиотеки. Huge page memory используется для улучшения коэффициента попадания iTLB.
  • Устранение перехода PLT: когда код приложения вызывает функцию динамической библиотеки, выполнение перенаправляется в PLT, а затем в фактическую функцию. Устранение перехода PLT может улучшить IPC.
  • Онлайн-переупорядочивание сегментов кода горячих точек: по умолчанию код упорядочивается динамической библиотекой. Технология онлайн-переупорядочивания может переупорядочивать код горячих точек по сегментам.
  • Механизм exec Huge Page: Механизм Huge Page пользовательского режима требует определенной конфигурации приложения и перекомпиляции. Механизм exec Huge Page напрямую использует Huge page memory, когда ядро ​​загружает файл ELF, без необходимости изменения приложений.

Архитектура sysBoosts:

На рисунке отражена архитектура sysBoosts. Основные задачи которые выполняет sysBoosts сводятся к реорганизации кода динамических библиотек, для уменьшения переходов и использованию Huge Page.

Возможности sysBoost

Использование sysBoosts предоставляет следующие возможности:

  • Полное статическое слияние: приложения и их зависимые динамические библиотеки объединяются в один двоичный файл, что позволяет выполнить переупорядочение на уровне сегментов. Несколько дискретных сегментов кода или сегментов данных объединяются в один для повышения производительности приложения.
  • Автоматическая оптимизация двоичных файлов: демон sysBoost считывает файл конфигурации, чтобы получить двоичные файлы для оптимизации и соответствующие методы оптимизации, оптимизирует двоичные файлы на основе требований пользователя и сохраняет оптимизированные двоичные файлы в файлах RTO.
  • Предварительная загрузка Huge Page двоичного кода/сегментов данных: когда таблица страниц пользовательского режима отображается на физическую память, отображение Huge Page (2 МБ) может повысить производительность. sysBoost предоставляет функцию предварительной загрузки Huge Page. После завершения двоичной оптимизации sysBoost немедленно загружает содержимое в ядро ​​как Huge Page. При запуске приложения sysBoost сопоставляет предварительно загруженный контент с таблицей страниц пользовательского режима в пакетном режиме, чтобы уменьшить количество сбоев страниц и задержку доступа к памяти приложения, тем самым повышая скорость запуска приложения и эффективность работы.
  • Мониторинг двоичных исключений: если в двоичном файле RTO, созданном sysBoost, возникает ошибка, приложение может аварийно завершить работу. Чтобы избежать повторных запусков и сбоев приложения и предотвратить распространение сбоя, sysBoost отслеживает процессы, загружающие двоичные файлы RTO. Если такой процесс аварийно завершается, sysBoost откатывает оптимизацию, удаляя файл RTO и флаг в исходном файле приложения. Кроме того, sysBoost переименовывает файл конфигурации, чтобы предотвратить повторное применение оптимизации после перезапуска службы sysBoost.

Сценарии использования

Сценарий 1:

В тесте Bash UnixBench выполняются некоторые общие команды и скрипты, такие как ls, grep и awk. Эти команды и скрипты обычно вызывают некоторые системные библиотеки, такие как libc и libpthread. Файлы этих библиотек обычно должны быть динамически связаны, что увеличивает время запуска программы и задержку. Используя технологию слияния двоичных файлов, эти файлы библиотек можно объединить в исполняемый файл, что значительно повышает производительность Bash и увеличивает итоговый результат UnixBench.

Сценарий 2:

Динамическая сборка некоторых приложений использует большое количество динамических библиотек, что приводит к следующим проблемам:

  • Косвенный переход функции и разбросанные сегменты кода влияют на эффективность работы CPU.
  • Разбор избыточных символов динамической библиотеки замедляет запуск программы.
  • Профиль оптимизации основанный на определенной модели обслуживания, не может адаптироваться к другим моделям обслуживания (чтобы это не значило).

Использование sysBoost для запуска больших процессов во время развертывания службы может эффективно решить предыдущие проблемы.

  • Механизм exec huge page позволяет большим процессам хранить сегменты кода и сегменты данных в огромных страницах памяти, снижая частоту пропусков TLB.
  • Большой процесс содержит весь код динамической библиотеки и код приложения, устраняя косвенные переходы функций.
  • Изменения в обслуживании интеллектуально идентифицируются в режиме онлайн для восстановления крупных процессов на основе соответствующих моделей точек доступа (чтобы это не значило).

Практика

Изучив теоретическую часть приступим к практическим упражнениям.

Для тестов возьмем ВМ под управлением openScaler 23.09 архитектуры aarch64.
Установка производится стандартным образом:

dnf install sysboost

Также необходимо установить пакеты, содержащие информацию о релокации сегментов:

dnf install bash-relocation ncurses-relocation

Для настройки sysBoost необходимы привилегии root и только один экземпляр может быть запущен.

Создадим конфигурационный файл для процесса bash:

cat /etc/sysboost.d/bash.toml
elf_path = “/usr/bin/bash”
mode = “static-nolibc”
libs = [“/usr/lib64/libtinfo.so.6”]

Запустим службу:

systemctl start sysboost

В логах появляется:

Sep 06 14:54:54 oe-2309-arm systemd[1]: Starting Run sysboost for Kunpeng CPU…
Sep 06 14:54:54 oe-2309-arm sysboostd[93545]: On Daemon
Sep 06 14:54:54 oe-2309-arm sysboostd[93545]: [62B blob data]
Sep 06 14:54:54 oe-2309-arm sysboostd[93545]: output: sysboost_loader 36864 1
Sep 06 14:54:54 oe-2309-arm sysboostd[93545]: sysboost_loader.ko is ready4 1
Sep 06 14:54:54 oe-2309-arm sysboostd[93545]: parse config: RtoConfig { elf_path: “/usr/bin/bash”, mode: “static-nolibc”, libs: [“/usr/lib64/libtinfo.so.6”], profile_path: None, path: None, watch_paths: [] }
Sep 06 14:54:54 oe-2309-arm sysboostd[93545]: run child: /usr/bin/sysboost, –output /usr/bin/bash.tmp.rto –static-nolibc /usr/bin/bash /usr/lib64/libtinfo.so.6
Sep 06 14:54:54 oe-2309-arm systemd[1]: Started Run sysboost for Kunpeng CPU.
Sep 06 14:54:55 oe-2309-arm sysboostd[93545]: output: [main:139] static-nolibc mode
Sep 06 14:54:55 oe-2309-arm sysboostd[93545]: output: [read_relocation_file:746] build id mismatch for /usr/lib/relocation/usr/bin/bash.relocation
Sep 06 14:54:55 oe-2309-arm sysboostd[93545]: output: [read_relocation_file:746] build id mismatch for /usr/lib/relocation/usr/lib64/libtinfo.so.6.4.relocation
Sep 06 14:54:55 oe-2309-arm sysboostd[93545]: output: [check_rela_dyn:82] rela is not relative, offset 46bbc0 info 2700000401
Sep 06 14:54:55 oe-2309-arm sysboostd[93545]: output: [check_rela_dyn:82] rela is not relative, offset 46bcf8 info 3200000401
Sep 06 14:54:55 oe-2309-arm sysboostd[93545]: output: [check_rela_dyn:82] rela is not relative, offset 46c438 info 8500000401
Sep 06 14:54:55 oe-2309-arm sysboostd[93545]: output: [check_rela_dyn:82] rela is not relative, offset 46cdb8 info dd00000401
Sep 06 14:54:55 oe-2309-arm sysboostd[93545]: output: [check_rela_dyn:82] rela is not relative, offset 46df00 info 2700000401
Sep 06 14:54:55 oe-2309-arm sysboostd[93545]: output: [check_rela_dyn:82] rela is not relative, offset 46df18 info 3200000401
Sep 06 14:54:55 oe-2309-arm sysboostd[93545]: output: [check_rela_dyn:82] rela is not relative, offset 46df70 info 8500000401
Sep 06 14:54:55 oe-2309-arm sysboostd[93545]: output: [check_rela_dyn:82] rela is not relative, offset 46dfe8 info dd00000401
Sep 06 14:54:55 oe-2309-arm sysboostd[93545]: output: [main:162] OK
Sep 06 14:54:55 oe-2309-arm sysboostd[93545]: [58B blob data]
Sep 06 14:54:55 oe-2309-arm sysboostd[93545]: [58B blob data]
Sep 06 14:54:55 oe-2309-arm sysboostd[93545]: [58B blob data]
Sep 06 14:54:55 oe-2309-arm sysboostd[93545]: refresh all config 0chmodtoolibc mode

Значит все успешно запустилось.

Теперь необходимо понять, а стало ли лучше?
Для этого воспользуемся unixbench, произведем его установку:

dnf install unixbench

В конфигурационном файле Makefile укажем интерпретатор /bin/bash вместо /bin/sh и запустим ./Run

В случае запуска без sysboost значения результатов для тестов shell будут:

Shell Scripts (1 concurrent) 42.4 3464.6 817.1
Shell Scripts (8 concurrent) 6.0 484.3 807.2

В случае же активного sysboost:

Shell Scripts (1 concurrent) 42.4 3680.1 867.9
Shell Scripts (8 concurrent) 6.0 509.1 848.6

Так что какой-то выигрыш от sysboost есть.