Релиз ядра Linux 4.5
После двух месяцев разработки Линус Торвальдс представил релиз ядра Linux 4.5. Среди наиболее заметных изменений: системный вызов copy_file_range для прямого копирования данных между файлами, поддержка технологии управления питанием Powerplay для GPU Radeon, улучшение распределения свободного пространства в Btrfs, поддержка сборки с включением детектора неопределённого поведения, поддержка прямой коррекции ошибок в dm-verity, стабилизация новой унифицированной иерархии cgroup, подключение BPF-балансировщиков для UDP-сокетов в режиме SO_REUSEPORT, увеличение масштабируемости epoll для многопоточных приложений.
В новую версию принято около 11 тысяч исправлений от примерно 1500 разработчиков, размер патча — 70 Мб (изменения затронули 11589 файлов, добавлено 1146727 строк кода, удалено 854589 строк). Около 45% всех представленных в 4.5 изменений связаны с драйверами устройств, примерно 17% изменений имеют отношение к обновлению кода специфичного для аппаратных архитектур, 14% связано с сетевым стеком, 4% — файловыми системами и 3% c внутренними подсистемами ядра.
Из наиболее интересных новшеств ядра Linux 4.5 можно отметить:
- Дисковая подсистема, ввод/вывод и файловые системы
- Новый системный вызов copy_file_range, позволяющий ускорить выполнение операций копирования части данных одного файла в другой файл за счёт выполнение копирования только на стороне ядра, без предварительного чтения данных в память процесса в пространстве пользователя, что избавляет от частого переключений контекста между ядром и пространством пользователя. Тем не менее, в обычных условиях использование copy_file_range лишь немного быстрее обычной команды «cp», так как основное время уходит на ввод/вывод с накопителя.
Совсем иная ситуация с применением copy_file_range для файлов на разделах NFS. Так как копирование в NFS приводит к необходимости перемещения данных по сети с сервера к клиенту и возвращения от клиента на сервер, исключение из этой цепочки клиента позволяет существенно ускорить процесс. Поддержка copy_file_range уже доступна для NFSv4.2. В будущих выпусках поддержка ускорения копирования будет реализована для Btrfs и специализированных устройств хранения, также будут преодолены текущие ограничение, такие как действия только в рамках одной точки монтирования и одного суперблока, а также невозможность ускорения копирования данных внутри одного файла.
- В Btrfs решены проблемы с масштабируемостью обработки свободного дискового пространства. Вместо использования кэша свободных блоков, становящегося узким местом на больших и нагруженных файловых системах (более 30 Тб), реализован новый экспериментальный метод представления кэша свободного дискового пространства, который лишен ограничений с масштабируемостью и не требует обновления после каждого изменения в ФС. Для включения новой реализации при монтировании следует указать опцию »-o space_cache=v2», после первого монтирования с которой файловая система будет переведена на новую реализацию кэша (старые ядра смогут только читать данные, для возвращения для них возможности записи следует вернуть старый вариант кэша через монтирование с опцией »-o clear_cache, space_cache=v1»);
- В модуль dm-verity (device-mapper verity), предназначенный для проверки целостности хранимых блоков данных по криптографическим хэшам (например, используется для верификации загрузки в платформе Android), добавлена поддержка кодов прямой коррекции ошибок (FEC, Forwarded Error Correction), которые позволяют не только выявить повреждения, но и восстановить исходное состояние данных блоков данных;
- Новый системный вызов copy_file_range, позволяющий ускорить выполнение операций копирования части данных одного файла в другой файл за счёт выполнение копирования только на стороне ядра, без предварительного чтения данных в память процесса в пространстве пользователя, что избавляет от частого переключений контекста между ядром и пространством пользователя. Тем не менее, в обычных условиях использование copy_file_range лишь немного быстрее обычной команды «cp», так как основное время уходит на ввод/вывод с накопителя.
- Сетевая подсистема
- Произведена оптимизация производительности работы режима SO_REUSEPORT для UDP-сокетов. Опция SO_REUSEPORT позволяет сразу нескольким слушающим сокетам подключиться к одному порту для приёма соединений с распределением поступающих запросов одновременно по всем подключенным через SO_REUSEPORT сокетам, что упрощает создание многопоточных серверных приложений. В новой версии ядра для UDP добавлены две дополнительные опции: SO_ATTACH_REUSEPORT_CBPF и SO_ATTACH_REUSEPORT_EBPF, позволяющие определить BPF-программу (классическую или расширенную), выполняющую функции диспетчера, принимающего решения какому сокету из группы REUSEPORT передать обработку пакета. Кроме того, увеличена скорость выбора сокета SO_REUSEPORT для входящих пакетов. При выполнении теста на сервере с 48 ядрами CPU с 10 гигабитным линком, скорость распределения между 10 сокетами возросла на 18%, 20 — на 14% и 40 — на 13%;
- Добавлена поддержка опции SOCK_DESTROY, позволяющей системному администратору принудительно закрыть TCP-соединение через интерфейс «netlink socket diag», инициируя операцию TCP ABORT с отправкой другой стороне RST-уведомления о завершении соединения;
- Добавлен модуль «clsact» с реализацией обобщённого метода построения очереди сетевых пакетов;
- Память и системные сервисы
- Обеспечена возможность сборки ядра в GCC 4.9+ с включённой опцией »-fsanitize=undefined», активирующей отладочный режим UBSAN (Undefined Behavior Sanitizer) с реализацией детектора неопределенного поведения, добавляющего в скомпилированный код дополнительные проверки для выявления во время выполнения программы ситуаций, когда поведение программы становится неопределенным (зависит от реализации компилятора) из-за ошибки программиста. Например, к неопределённому поведению относится использование нестатических переменных до их инициализации, деление целых чисел на ноль, переполнения целочисленных знаковых типов, разыменование указателей NULL, проблемы с выравниванием указателей и т.п.
- В системный вызов madvise, предоставляющий средства для оптимизации управления памятью процесса, добавлена поддержка флага MADV_FREE, который дополняет уже имеющийся флаг MADV_DONTNEED, через который ядру можно загодя сообщить о готовящемся освобождении блока памяти, т.е. о том, что этот блок уже не нужен и может использоваться ядром. В случае использования MADV_DONTNEED при последующем обращении к блоку приведёт к генерации «page fault», выделению и обнулению страниц памяти или к повторному маппингу файла в память. MADV_FREE отличается тем, что только помечает блок доступным для освобождёння, но не освобождает сразу, что позволяет вернуть его без генерации «page fault», если обращение произошло до его фактического использования ядром;
- В вызов epoll добавлена поддержка флага EPOLLEXCLUSIVE, решающего проблемы с масштабируемостью в многопоточных приложениях. В обычных условиях при создании нескольких файловых дескрипторов epoll (epfds) для совместно обрабатываемых событий генерация события приведёт к информированию всех epfds. Флаг EPOLLEXCLUSIVE позволят привязать событие к отдельному файловому дескриптору и информировать только связанный с ним поток, что значительно повышает эффективность в программах с большим числом epfds. Например, перевод платформы Enduro/X на EPOLLEXCLUSIVE уменьшил время прохождения тестового задания с 860 до 24 секунд;
- Интерфейс cgroup v2 переведён в разряд официально поддерживаемых и более не скрыт в категории экспериментальных разработок. В рамках cgroup v2 предлагается единая унифицированная иерархия cgroup (Cgroup unified hierarchy), пришедшая на смену гибкой, но не получившей практического применения, поддержке произвольного числа иерархий cgroup, определяющих применение правил к группам процессов (например, одна иерархия для распределения ресурсов CPU, а другая для регулирования потребления памяти). Изначально применяемый подход приводил к трудностям организации взаимодействия между обработчиками разных иерархий и к дополнительным затратам ресурсов ядра при применении правил для процесса, упоминаемого в разных иерархиях. Унифицированная иерархия cgroup теперь может монтироваться при указании типа файловой системы «cgroup2». К сожалению контроллер CPU пока не вошёл в релиз, поддержка ограничивается контроллерами памяти и ввода/вывода;
- Виртуализация и безопасность
- В User-Mode Linux добавлена поддержка системного вызова seccomp ();
- В файл конфигурации ядра добавлена новая опция CONFIG_IO_STRICT_DEVMEM, позволяющая блокировать доступ драйверов устройств к памяти через интерфейс /dev/mem.
- Внесены улучшения в реализацию TPM/TPM2 (Trusted Platform Module);
- В Smack добавлена проверка 'file receive', позволяющая определить права доступа к сокету в привязке к процессу, а не к i-node;
- Оборудование
- В драйвер AMDGPU добавлена экспериментальная поддержка технологии динамического управления питанием Powerplay. Powerplay позволяет решить проблему с посредственной производительностью GPU Radeon в Linux, связанной с тем, что по умолчанию GPU запускается в режиме низкого энергопотребления, не позволяющего добиться максимальной производительности. Powerplay динамически отслеживает нагрузку на графическую подсистему и при необходимости повышает тактовую частоту GPU, переводя его в режим максимальной производительности. В настоящее время поддержка Powerplay реализована для GPU Tonga и Fiji, а также для интегрированных APU Carrizo и Stoney, использование нового драйвера AMDGPU с которыми демонстрирует существенное увеличение производительности. Из-за необходимости дополнительной стабилизации и тестирования кода режим Powerplay пока отключен по умолчанию, для включения следует передать ядру параметр «amdgpu.powerplay=1»;
- Из драйвера Radeon полностью удалена поддержка переключения видеорежимов в пространстве пользователя (UMS), для управления видеорежимами теперь можно использовать только KMS;
- Расширены возможности DRM-драйвера для видеокарт Intel: поддержка будущего поколения чипов Kabylake, идущего на смену Skylake;
- Расширены возможности DRM-драйвера для видеокарт NVIDIA (Nouveau): возможность изменения скорости для шины PCI Express;
- Поддержка новых ARM-плат: Sigma Designs Tango4, Raspberry Pi 2 (BCM2836), Rockchip RK3228, Freescale LS1043a.
© OpenNet