После двух месяцев разработки Линус Торвальдс анонсировал (https://lkml.org/lkml/2016/1/10/305) релиз ядра Linux 4.4 (http://kernel.org). Среди наиболее заметных изменений: задействование Direct I/O и AIO для примонтированных в loop-режиме ФС, устойчивый к сбоям RAID5 с дополнительным журналированием, поддержка пулинга для блочных устройств, драйвер для SSD-накопителей Open-Channel на основе памяти NVM, работа слушающих TCP-сокетов в неблокирующем режиме, новый системный вызов mlock2(), поддержка 3D в виртуальном GPU virtio-gpu, возможность запуска программ eBPF непривилегированными пользователями, поддержка постоянно работающих eBPF-программ, механизм определения потери TCP-пакетов RACK.
В новую версию принято около 13 тысяч исправлений от 1548 разработчиков, размер патча - 49 Мб (изменения затронули 10606 файлов, добавлено 714106 строк кода, удалено 471010 строк). Около 44% всех представленных в 4.4 изменений связаны с драйверами устройств, примерно 16% изменений имеют отношение к обновлению кода специфичного для аппаратных архитектур, 15% связано с сетевым стеком, 4% - файловыми системами и 3% c внутренними подсистемами ядра.
12.9% изменений внесено сотрудниками компании Intel, 5.2% - Samsung, 5.1% - Red Hat, 3.5% - Atmel, 3.5% - Linaro, 2.3% - IBM, 2.1% - Google, 2.0% - SUSE, 1.8% - ARM, 1.6% - Texas Instruments, 1.6% - Freescale, 1.4% - AMD, 1.3% - Oracle.
Из наиболее интересных новшеств (http://kernelnewbies.org/Linux_4.3) можно отметить:
-
Дисковая подсистема, ввод/вывод и файловые системы
- Для файловых систем, примонтированные в режиме "loopback" (монтирование из файла с использованием блочного устройства loop), реализована возможность использования прямых (Direct I/O) и асинхронных (AIO) операций ввода/вывода при чтении и записи в файл, связанным с loop-устройством. Использование Direct I/O при обращении к файлу с образом ФС позволяет избежать двойного кэширования, существенно сокращает потребление памяти и уменьшает число переключений контекста;
- В подсистему MD интегрированы наработки (https://code.facebook.com/posts/414713638724358/improving-so.../) компании Facebook по увеличению живучести программного RAID5 в случае краха системы. В частности, реализован режим журналирования RAID5, при котором на отдельном носителе (SSD или NVRAM) создаётся специальный журнал. Записываемые в RAID данные вначале сохраняются в журнале, а затем разносятся по входящим в RAID-массив дискам. Журнал позволяет гарантировать целостное состояние RAID в ситуациях неожиданного отключения питания, даже если RAID находился в деградированном состоянии. Если питание будет прервано на стадии когда составляющие транзакцию данные были записаны лишь на часть дисков, повреждения данных можно избежать так как вся информация о транзакции отражена в журнале. Журнал также позволяет повысить производительность некоторых операций и сократить задержки, но данные изменения войдут в будущие выпуски ядра;
- Поддержка пулинга ввода/вывода (http://lwn.net/Articles/663879/) для блочных устройств (I/O polling). Пулинг позволяет уменьшить нагрузку на систему при использовании высокопроизводительных устройств за счёт периодического опроса состояния вместо генерации прерываний. Как следствие, в определённых ситуациях включение пулинга позволяет существенно повысить пропускную способность и сократить задержки ввода/вывода. Включение производится через запись 1 в /sys/block/DEV/queue/io_poll. В настоящее время поддерживается только режим O_DIRECT, а реализация помечена как экспериментальная и предназначенная для тестирования;
- Реализована спецификация LightNVM (http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.g...), расширяющая драйвер NVM поддержкой SSD-накопителей, допускающих низкоуровневый прямой доступ к физическому накопителю (например, первое поколение Open-Channel SSD-накопителей на основе памяти NVM). Для таких устройств ядро берёт на себя функции низкоуровневого управления хранилищем, которые в обычном Flash выполняются реализованным на уровне контроллера транслирующим слоем (FTL, Flash Translation Layer). LightNVM обеспечивает такие операции как управление размещением данных, сборка мусора и организация параллельного доступа. Функции управления сбойными блоками, атомарность ввода/вывода и размещением метаданных по-прежнему выполняются чипом накопителя;
-
Сетевая подсистема
- Обработка слушающих TCP-сокетов (listen) полностью избавлена от установки блокировок (lockless). Тесты показывают, что после задействования неблокирующего режима производительность слушающих сокетов увеличилась на 2-3 порядка (!), например, один слушающий сокет теперь способен обработать 3.5 млн SYN-пакетов в секунду;
- В setsockopt() добавлена поддержка флага SO_INCOMING_CPU и расширена логика выбора CPU при использовании SO_REUSEPORT. SO_INCOMING_CPU позволяет организовать обработку в текущем процессе только тех пакетов, которые были приняты с обработкой сетевым стеком на том же CPU. Закрепление привязанных к одному CPU RX-очередей и обработчиков слушающих сокетов позволяет более эффективно использовать процессорный кэш;
- Добавлен RACK - новый механизм определения потери TCP-пакетов, который в отличие от штатного метода определения факта потери пакета, отталкивается от последовательности пакетов, а не от времени передачи. Суть работы RACK в том, что при получении ACK-подтверждения для пакета, любые неподтверждённые пакеты, отправленные как минимум на RTT (round-trip time) раньше подтверждённого пакета, считаются потерянными и потребуют повторной отправки. Новый алгоритм уже протестирован в инфраструктуре Google и будет предложен для утверждения в качестве стандарта IETF;
-
Память и системные сервисы
- Возможность (http://lwn.net/Articles/660331/) загрузки программ eBPF непривилегированными пользователями для их использования в качестве фильтров для сокетов. Ранее, из соображений безопасности, доступ к системному вызову ebpf() был открыт только пользователю root. В текущей версии ядра код проверки корректности загружаемых программ был значительно улучшен и непривилегированным пользователям дана возможность запуска ограниченных по функциональности программ eBPF, которые могут использоваться для создания простых сетевых фильтров. Возможности eBPF по трассировке, классификации трафика и манипуляциям с данными ядра по-прежнему доступны только для root. Для запрета обращения к системному вызову ebpf() из непривилегированных процессов добавлен sysctl kernel.unprivileged_bpf_disabled;
- Возможность постоянного выполнения eBPF-программ и сопоставлений (Persistent eBPF maps/progs), продолжающих работу и после завершения процесса, инициировавшего их выполнение. Объекты выполняемого persistent eBPF размещаются в области /sys/fs/bpf/ и могут совместно использоваться несколькими процессами. Например, таким способом удобно создавать классификаторы и обработчики трафика;
- Добавлен фреймворк "devfreq cooling" для управления температурным режимом устройств, позволяющий, при наличии соответствующей аппаратной поддержки, перевести перегревающееся устройство в режим пониженного энергопотребления для удержания температуры в заданных границах;
- Добавлен (http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.g...) Представлен системный вызов mlock2() (http://lwn.net/Articles/650538/), расширяющий возможности системного вызова mlock() поддержкой дополнительного аргумента, позволяющего задействовать новый режим блокировки VM_LOCKONFAULT, при котором страницы памяти в указанном диапазоне будут закреплены в ОЗУ не сразу, а только после возникновения page fault (обращение к невыделенным страницам памяти);
- Изменено содержимое файлов "stat", размещённых в поддиректории каждого процесса в /proc (например, /proc/123/stat). Поле wchan (30 столб...
URL: https://lkml.org/lkml/2016/1/10/305
Новость: https://www.opennet.ru/opennews/art.shtml?num=43652