Linux 7.3 ускоряет файловые операции и меняет правила распределения ресурсов. Что еще?

—

от автора

Источник

Привет, Хабр! После двух месяцев разработки вышло ядро Linux 7.3, которое многие из нас ждали. В новую версию вошло более 20 тысяч изменений от 3 171 разработчика. Большая часть изменений традиционно пришлась на драйверы, но интересные доработки есть и в других направлениях: ФС, планировании задач, управлении памятью. Давайте посмотрим, что там появилось нового, а что убрали или поменяли. Поехали!

Обновления драйверов: графика, звук и игровые устройства

Что ж, начнем с тех самых драйверов. В Linux 7.3 появилась начальная поддержка чипов Apple M3 Pro, Max и Ultra, а также управление энергопотреблением для систем на процессорах Apple. Это очередной шаг к работе Linux на таком оборудовании, но пока не обещание полной совместимости любого Mac. Поддержка процессора сама по себе не означает, что графика, звук и вся периферия уже работают. Поэтому владельцам конкретных моделей по-прежнему нужно смотреть, какие компоненты доступны и какие ограничения остаются.

В драйвере AMDGPU добавили несколько возможностей для снижения энергопотребления. Для OLED-панелей предусмотрена технология CACP, которая регулирует контрастность с учетом изображения, а для дисплейных блоков DCN4 включен режим пониженного потребления во время простоя. Старые видеокарты на архитектурах GFX6–8 получили поддержку модификаторов DRM, описывающих способ размещения графических буферов в памяти. В общей подсистеме DRM также появилось свойство для выбора формата цвета на выходе. Его поддержали драйверы Intel i915, AMDGPU и Rockchip.

Продолжается разработка открытого драйвера Nova для видеокарт NVIDIA, написанного на Rust. В этом выпуске его перевели на новый формат прошивок TLV, добавили запуск прошивки GSP с включением vGPU и интерфейс для определения объема видеопамяти. Эти изменения развивают внутренние механизмы драйвера, поэтому воспринимать их как сообщение о готовой замене привычного графического стека пока рано. Еще один драйвер на Rust, Tyr для графики ARM Mali, научился загружать прошивки Mali CSF, включать виртуальную память GPU и запускать встроенный микроконтроллер.

Более заметные в повседневной работе изменения касаются периферии. В ядро добавили поддержку Steam Controller образца 2026 года, мышей Logitech G502 X Plus и G502 X Lightspeed, руля Turtle Beach VelocityOne Race и контроллера MSI Claw. Список также пополнили клавиатура Endorfy Thock TKL и гарнитуры Nova 5X, Nova 7 и Arctis 7. Кроме того, исправили работу звука на ряде ноутбуков HP, Lenovo, ASUS и других производителей, а также на мини-ПК Minisforum AI X1 Pro. Для владельцев этих устройств такие доработки могут оказаться полезнее ускорения отдельных файловых операций: после обновления появляется шанс обойтись без ручных настроек и сторонних исправлений.

Btrfs избавляется от лишних ожиданий

Одно из заметных ускорений Btrfs связано с записью на жесткие диски. Когда несколько задач одновременно сохраняли изменения в журнал, файловая система делала лишнюю паузу — ждала один такт системного таймера. Разработчики убрали это, и сразу в тесте скорость выросла примерно в пять раз. Больше всего от исправления могут выиграть программы, которые часто вызывают fsync(), чтобы убедиться, что данные сохранены на накопителе. При частой записи даже короткие задержки — потерянное время. 

Еще одна доработка касается файлов, данные которых хранятся во множестве отдельных участков — экстентов. При выполнении fsync() Btrfs проверяла, есть ли в файле пустоты, даже когда такая проверка была не нужна. Чуток оптимизации и результат налицо: операция выполняется в пять раз быстрее.

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

Изменился и учет свободного места в Btrfs. Старый кэш первой версии теперь отключен по умолчанию, но разделы, на которых он использовался, по-прежнему доступны. Для них лучше перейти на новый формат хранения сведений о свободном месте, иначе некоторые операции могут замедлиться. Заодно разработчики убрали устаревший параметр монтирования usebackuproot, который позволял использовать резервную копию корня файловой системы при восстановлении. Теперь для этого нужно указывать rescue=usebackuproot, причем раздел можно подключить только для чтения: запись в таком состоянии сочли слишком рискованной.

Бесплатный курс «Системный администратор Linux с нуля»

Освойте администрирование Linux на SelectOS и станьте востребованным специалистом.

Зарегистрироваться →

FUSE сокращает копирование, Ext4 ускоряет запись

Файловая система не обязательно должна целиком работать внутри ядра. Механизм FUSE позволяет вынести ее основную логику в обычный процесс, что удобно для сетевых хранилищ, зашифрованных каталогов и других специализированных решений. Правда, за гибкость приходится платить обменом запросами между ядром и пользовательским пространством. Поэтому здесь особенно полезны изменения, которые уменьшают объем промежуточной работы при каждом обращении к файлу.

В Linux 7.3 ускорили работу FUSE через асинхронный интерфейс io_uring. Теперь процесс, обслуживающий файловую систему, может заранее выделить набор буферов и передать их ядру для обработки запросов. Кроме того, он получил возможность напрямую обращаться к данным в памяти приложения или файловом кэше, без лишнего копирования — этот режим называют zero-copy. Благодаря этому на передачу данных уходит меньше процессорного времени и памяти. Чтобы воспользоваться улучшениями, нужно доработать саму программу, которая обслуживает FUSE: одного обновления ядра недостаточно. Для zero-copy также нужны заранее выделенные буферы и привилегия CAP_SYS_ADMIN. 

В Ext4 работа шла сразу по нескольким направлениям. Так, разработчики повысили производительность параллельной записи при прямом вводе-выводе, ускорили предварительное выделение места через fallocate() и исправили регрессию буферизированной записи. Эти изменения затрагивают разные пути обработки запросов, поэтому результат будет зависеть от того, как именно приложение обращается к накопителю.

Видеопамять распределяют с учетом обещанных ресурсов

Когда видеопамять заканчивается, приложение может продолжать работать, но уже заметно медленнее. Часть данных приходится хранить в обычной оперативной памяти, доступ к которой у видеокарты медленнее, чем к собственной. Если за ресурс конкурируют несколько программ, важно, как система распределяет ее между ними. Раньше преимущество часто получало приложение, которое первым успело занять свободное место. Но это не всегда работало на 100% корректно.

Хватит это терпеть! Новая логика помогает выполнять гарантии, заданные через контроллер dmem в механизме cgroup. Если для приложения зарезервирован определенный объем видеопамяти, ядро теперь попробует освободить ему место, перенеся в обычную оперативную память буферы программ без такой гарантии. Раньше зарезервированная память могла оказаться уже занятой — и тогда более медленную оперативную память получало само приложение, для которого предназначался резерв. Теперь система лучше соблюдает заданные настройки, когда видеопамяти на всех не хватает. Но для этого нужно настроить ее распределение между программами, поэтому само по себе обновление ядра не ускорит любую игру.

Источник

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

У разных групп процессов могут быть собственные планировщики

Контроллер dmem следит за тем, сколько памяти устройств занимают программы, и позволяет ограничивать ее расход или гарантировать определенный объем отдельным группам процессов. Он показывает, сколько памяти используется сейчас, каким был максимальный расход и какова общая емкость. Так можно управлять, например, видеопамятью дискретной видеокарты, распределяя ее между приложениями. Настройки задают администратор или системные службы. Это полезно, когда нужно обеспечить важную программу памятью, даже если другие приложения тоже активно используют видеокарту.

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

Заодно разработчики исправили ошибки, возникавшие при работе вложенных планировщиков. Раньше задача могла зависнуть в ожидании, если ее планировщик не имел доступа к процессорам, на которых ей разрешалось выполняться. В итоге срабатывал сторожевой механизм и отключал BPF-планировщик целиком. Теперь ядро в таких случаях само выделяет задаче немного процессорного времени, чтобы она могла продолжить работу. Также исправили передачу задач между планировщиками и усилили проверку данных, которые BPF-программы передают ядру. 

Файловая система, в которой ничего нельзя открыть

Что еще? Для изоляции программ в ядро добавили псевдофайловую систему failfs. В отличие от обычного пустого каталога, который можно открыть и прочитать, она отказывает в любых обращениях к ней, возвращая ошибку EOPNOTSUPP — операция не поддерживается. Это позволяет намеренно закрыть программе привычный доступ к файлам. Failfs используется только внутри ядра: подключить ее обычной командой монтирования или смонтировать поверх нее другую файловую систему нельзя. 

Вместе с failfs появился системный вызов fchroot(). Он позволяет сменить корневой каталог процесса, указав его файловый дескриптор вместо пути. Если сделать корнем failfs, программа больше не сможет обращаться к файлам по абсолютным путям, в том числе через символические ссылки с такими путями. Если туда же перенести текущий каталог, перестанут работать и относительные пути, отсчитываемые от него. Но программа по-прежнему сможет открывать файлы через заранее полученные дескрипторы обычных каталогов. Так ей можно оставить доступ к нужным папкам, закрыв привычный поиск файлов через корень и текущий каталог. 

Разработчики могут использовать failfs, чтобы ограничить доступ программы к файлам, оставив ей только заранее открытые каталоги. Однако саму программу нужно к этому подготовить: например, запуск другого приложения может завершиться ошибкой, если для его загрузчика потребуется абсолютный путь. Для перехода в failfs без специальных привилегий тоже есть условия. В частности, процесс должен установить флаг no_new_privs, запрещающий получение новых привилегий, и не делить сведения о корневом и текущем каталогах с другими процессами или потоками. Поэтому механизм прежде всего пригодится для песочниц и отдельных служб, у которых заранее известны все необходимые обращения к файлам. 

Новые возможности запуска программ и поддержка Time Machine 

BPF теперь можно использовать и в binfmt_misc — механизме, который определяет, чем запускать исполняемый файл. Раньше он распознавал формат по заданным признакам и передавал файл заранее указанному интерпретатору. Теперь BPF-программа может изучить файл при запуске и сама выбрать нужный обработчик. Например, она может проверить заголовки ELF или определить, в каком каталоге находится приложение. Это пригодится системам, где программы и их зависимости хранятся за пределами привычных системных каталогов. 

В системах с нестандартным размещением пакетов это позволит реже править исполняемые файлы и писать вспомогательные скрипты. Нужный загрузчик можно будет выбирать при запуске, вместо того чтобы заранее прописывать путь к нему в самом файле. Кроме того, обработчик умеет выбирать из уже открытых интерпретаторов, не разыскивая их заново по имени. Задача BPF здесь — определить, чем запустить программу. Для запуска приложения под другую архитектуру или операционную систему по-прежнему потребуется соответствующий эмулятор или среда совместимости.

Встроенный SMB-сервер ksmbd тем временем получил включаемую по запросу поддержку расширений Apple Time Machine. Это позволяет использовать подготовленные сетевые ресурсы для резервного копирования из macOS. Одновременно добавлены требования шифрования для отдельных общих каталогов и обработка повторных запросов SMB3 после потери соединения или ответа. Последняя доработка помогает повторить операцию без повторного изменения состояния там, где это предусмотрено протоколом. Для владельца хранилища смысл этих изменений вполне конкретен: улучшенная совместимость с клиентами и более надежное восстановление работы после сетевых сбоев.

Linux 7.3 также расширяет поддержку оборудования: в список вошли чипы Apple M3 Pro, Max и Ultra, новый Steam Controller и ряд игровых устройств. Одновременно продолжается удаление старых компонентов, включая файловые системы EFS и FreeVxFS. Для большинства пользователей значение выпуска определяется сочетанием нескольких небольших улучшений: более быстрой записью, исправленным поведением при нехватке памяти или заработавшей периферией. Насколько заметным окажется обновление, зависит от конкретной машины и ее задач. Именно поэтому новый номер ядра полезнее оценивать по решаемым проблемам, чем по самому крупному коэффициенту ускорения в списке изменений.

Как вам новое ядро? Расскажите в комментариях, если вы уже успели обновиться.

ссылка на оригинал статьи https://habr.com/ru/articles/1102194/