Как улучшить производительность Linux отключив патчи для Meltdown и Spectre

Kernel security

Предупреждение! Приведенные ниже инструкции увеличивают не только производительность, но и риски безопасности. Автор и сайт не отвечают за любой возможный вред причиненный использованием данной методики.

Существует множество случаев когда необходимо найти компромиссное решение между уровнем безопасности и производительностью. Не пропадать же добру? В самом деле, хоть оно старое и медленное, но сердцу дорогое и ему можно постараться найти применение.

Пример №1

LiveCD, или LiveUSB загружаются прямо в ОЗУ. Таким образом, все возможные изменения которые вы сделаете в ней, за исключением операций с устройствами хранения, будут сброшены после перезагрузки. Этот случай наиболее практичен потому, что загрузка из внешнего устройства значительно медленнее.

Пример №2:

Этот пример наиболее подходит для исследователей приложений. Они могут использовать старые ПК, как «физические песочницы». «Песочницы» –это изолированные от внешнего мира машины, которые используются в основном для тестирования специфических особенностей операционных систем, утилит, приложений или аппаратных компонентов. В нашем примере, под термином «физической песочницы» будем понимать тот факт, что только исследователь или группа исследователей имеет право физического доступа к её аппаратным и программным компонентам так, что машина абсолютно изолирована от внешнего мира. Это помогает избежать всех нежелательных факторов, которые могут исказить результаты эксперимента.

Пример №3:

Прекрасным примером из реальной жизни является среднестатистический компьютерный класс в провинциальном городе, или селе. Из-за недостатка финансовых и технических ресурсов некоторым школам и другим образовательным институциям приходится использовать старые ПК так, что некоторые программы не работают должным образом. Следовательно, они вынуждены использовать хитрости предложенные в данной статье. Это плохая практика, но они не имеют другого выбора.

Практический случай

После установки Ubuntu 18.04 (Bionic Beaver) на ноутбук Lenovo G580 20150 или другие бюджетные модели, очень возможно то, что вы будете удивлены высоким уровнем загруженности центрального процессора. Работа на таких машинах медленная, невыносимая, и порой полностью невозможная. Для сравнения Windows 10, даже с установленными патчами безопасности, работает немного быстрее. Вы можете использовать команду top на машине под управлением Linux для просмотра списка запущенных процессов.

Насколько вы можете видеть, использование процессора на уровне 54,8%, а количество работающих процессов 2. Вы можете инсталировать другие среды рабочего окружения, но это не повлияет на общий результат значительно.

В чем причина?

Основными причинами этого, за исключением старого железа, являются заплатки безопасности для аппаратных брешей: Meltdown и Spectre. Этот тип проблем безопасности устраняется только проверкой спекулятивных операций в реальном времени, вот почему замедляется выполнение каждого процесса.

Spectre and meltdown logos

Если вам интересно как ОС управляет памятью прочитайте: Исторический обзор управления памятью в операционных системах.

Компромиссное решение

Широкое разнообразие системных возможностей может быть отключено или включено посредством добавления или удаления соответствующих опций ядра. Следовательно, вы можете использовать несколько вариантов загрузки: один для поиска в Интернете или других важных операций, и другой для запуска программ которым вы доверяете на изолированной системе.

Последний вариант широко рассмотрен как наиболее гибкое и компромиссное решение для простого пользователя (но не для бизнес организаций, прошу заметить!!!). Если вы пытаетесь найти решение для бизнеса, то настоятельно рекомендуется купить новое аппаратное обеспечение. В противном случае это подвергнет значительному риску всю вашу сетевую инфраструктуру.

Опции о которых идет речь

Ядро – (англ. kernel) это основа каждой операционной системы. Оно отвечает за способ обработки процессов, управление памятью и некоторые другие важные рутинные операции выходящие за рамки данной статьи. Разработчики ядра Linux позволили вам сделать выбор собственных опций управления оперативной памятью.

PTI – это английская аббревиатура Page Table Isolation. Добавлением опций ядра «nopti» или «pti=off» вы можете улучшить общую производительность системы. Короче говоря, вся память разделена на страницы. Каждая страница имеет свои собственные атрибуты которые разрешают или запрещают доступ к ней некоторым процессам. Если один процесс (запущенная программа) пытается прочитать память другого процесса, вы увидите ошибку доступа к памяти (access violation error), как на картинке ниже.

exception access violation

Ошибка в Windows 10

ОС, как хороший сторожевой пёс, предотвращает любую деятельность подобного рода. Вместе с отключением изоляции страниц вы становитесь возможной жертвой эксплуатации бреши в безопасности под названием Meltdown (и не только!!!). Главный вопрос: «Использовать или не использовать эту возможность?». В любом случае, решение за вами и вашими предпочтениями.

Другая проблема, которая влияет на общую производительность – это заплатка от бреши Spectre. Для её отключения есть специальная опция «spectre_v2=off». Заметьте, что эта опция активна и в состоянии «on» по умолчанию.

Опции загрузчика

Существует множество загрузчиков для операционной системы Linux, такие как: Grub2, Grub legacy, Lilo, Syslinux, rEFInd, итд. . Все они имеют общие цели: загрузку ОС и передачу аргументов ядру. Опции ядра размещаются в соответствующих конфигурационных файлах загрузчика. Как правило, загрузчик размещает конфигурационные файлы в каталоге: «/boot/имя_загрузчика».

Для GRUB 2

Но для Grub 2 содержимое /boot/grub/grub.cfg автоматически генерируется утилитой update-grub. Следовательно, если вы отредактируете его содержимое вручную, то он восстановит свое предыдущее состояние после следующего обновления и вы потеряете желаемые опции. Во избежание этого, вам следует отредактировать файл /etc/default/grub. Его начальные строчки приведены ниже:

# If you change this file, run 'update-grub' afterwards to update
# /boot/grub/grub.cfg.
# For full documentation of the options in this file, see:
#   info -f grub -n 'Simple configuration'

GRUB_DEFAULT=0
GRUB_TIMEOUT_STYLE=hidden
GRUB_TIMEOUT=10
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash pti=off spectre_v2=off nopti"
GRUB_CMDLINE_LINUX=""

Посредством редактирования GRUB_CMDLINE_LINUX_DEFAULT вы можете изменить загрузочные опции ядра по умолчанию. Но не забудьте, про выполнение утилиты update-grub:

 sudo update-grub 

Для rEFInd

Если вам нравится загрузчик rEFInd и ваша система поддерживает UEFI, тогда вам следует найти rEFInd.conf. Вставьте опции разделенные пробелами вконец строки options, как указано ниже:

menuentry "My Linux Distro Name" {
        icon     /EFI/refind/icons/My_Linux_Distro_Icon.png
        volume   Label_of_my_partition
        loader   /boot/vmlinuz-linux
        initrd   /boot/initramfs-linux.img
        options  "root=PARTUUID=XXXXXXX rootfstype=XXXX rw add_efi_memmap pti=off spectre_v2=off"
        submenuentry "Boot using fallback initramfs" {
                initrd /boot/initramfs-linux-fallback.img
        }
}

Вместо иксов идут ваши личные настройки. Вместо PARTUUID может быть лейбл раздела. То что есть не трогайте добавьте только красные опции.

Для Syslinux

Syslinux используется для загрузки livecd и liveusb версий дистрибутивов Линукс. Учитывая специфику livecd/liveusb, коротковременный характер хранения изменений при работе (все изменения включая временные файлы каталога /tmp хранятся в RAM-диске, а приложения монтируются как read only со squashfs файлов) и относительно нечастое использование, то рисками можно пренебречь.

Следовательно, будет полезно использовать рассмотренные ранее опции для ускорения процесса загрузки. Когда загрузочное меню загрузится, вы должны нажать кнопку <TAB> и передать следующие опции ядру:

linux /boot/vmlinuz-linux root=/dev/sdb1 initrd=/boot/initramfs-linux.img quiet splash pti=off spectre_v2=off

sdb1  – это сокращение устройство хранения (storage device) "b" номер раздела 1.  

Будьте внимательны, «root» параметр должен указывать на ваше личное загрузочное устройство. Если хотите сделать эту опцию постоянной (не терять при перезагрузке) найдите в корне liveusb следующий файл /boot/syslinux/syslinux.cfg. Далее найдите соответствующую вашему дистрибутиву (будьте внимательны если у вас их несколько) строчку начинающуюся с «APPEND» и просто добавьте в конец опции:

APPEND root=/dev/sdb1 quiet splash pti=off spectre_v2=off

Для Systemd-boot

Конфигурация этого загрузчика схожа с предыдущем, но придется нажать клавишу «Е» и написать это:

initrd=\initramfs-linux.img root=/dev/sdb1 quiet splash pti=off spectre_v2=off

Для того чтоб указанные опции применялись постоянно найдите исправьте следующий файл в корне загрузочного носителя /boot/loader/entries/linux_distro_name.conf и допишите следующее:

Как убедится что патчи применены?

Откройте ваш терминал и напишите:

dmesg | grep 'retpoline' 

Если ничего не видно заплатки для Spectre не были применены. В противном случае вы увидите это:

[    0.165383] Spectre V2 : Mitigation: Full generic retpoline

Для проверки применена или нет страничная изоляция памяти (PTI) введите:

dmesg|grep "page tables isolation"

И вы увидите что-то вроде этого:

[    0.131162] Kernel/User page tables isolation: enabled

Enable — применен, disabled — нет.

Meltdown and Spectre detection
Проверка применения патчей безопасности

Обратите внимание на версию Spectre патча — «V2»!!! В «V1» процедура retpoline реализована лишь частично и система продолжает быть уязвимой. Этот случай редкий, но возможен если вы используете старую версию ядра, поэтому обновитесь.

Что такое retpoline?

По статистике, 1/6 часть всех инструкций выполняемых программами – условные переходы (инструкции типа: jb, jbe, ja, jz, jnz и так далее). Для быстрого выполнения программ разработчиками процессорных архитектур был придуман модуль предсказания переходов (англ. branch prediction unit). Злоумышленники использует его особенности чтобы перейти на нужный адрес в памяти обойдя, тем самым, запреты на доступ.

Retpoline – это механизм препятствующий спекулятивному выполнению переходов. Для процессоров Intel используется инструкция «PAUSE», в процессорах AMD она также есть но без сериализации. Вместо «PAUSE» для процессоров AMD используется «LFENCE». Они призывают процессор ждать когда будет известен адрес точного перехода.

Как сказал сам Линус Торвальдс, первые предложения и фиксы предложенные инженерами Intel были откровенно глупыми.

Предложенные Intel исправления являются полным мусором!

Linus Torvalds

Выводы

Рассмотренные вопросы полезны:

  • Если вы используете livecd или liveusb версию вашего дистрибутива
  • Если вы хотите ускорить старые устройства не покупая новое «железо».
  • Если вы не заботитесь о безопасности

Оставьте комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *