После двух с половиной месяцев разработки Линус Торвальдс выпустил ядро Linux 3.13. Среди наиболее заметных улучшений ядра 3.13: интеграция пакетного фильтра Nftables, включение по умолчанию режима TCP Fast Open, увеличение производительности Squashfs, поддержка протокола HSR для создания отказоустойчивых сетевых конфигураций, добавление нового высокопроизводительного слоя блочных устройств, поддержка автоматического переключения между GPU в драйвере Radeon, фреймворк для ограничения энергопотребления устройств, классификатор трафика на основе BPF, реализация средств для проведения защищённых финансовых транзакций по NFC, поддержка архитектуры Intel MIC.
В новую версию принято 12 тысяч исправлений от 1339 разработчиков, размер патча - 32 Мб (изменения затронули 9849 файлов, добавлено 441972 строк кода, удалено -237897 строк). Около 44% всех представленных в 3.13 изменений связаны с драйверами устройств, примерно 21% изменений имеют отношение к обновлению кода специфичного для аппаратных архитектур, 14% связано с сетевым стеком, 4% - файловыми системами и 5% c внутренними подсистемами ядра. 11.9% изменений внесено сотрудниками компании Intel, 9.7% - Linaro, 9% - Red Hat, 5% - Samsung, 3.5% - IBM, 2.7% - SUSE, 1.7% - Google, 1.5% - NVIDIA, 1.1% - Oracle, 1.0% - Huawei, 0.9% - ARM.
Из наиболее интересных новшеств можно отметить:
- Сетевая подсистема
- Интеграция пакетного фильтра Nftables, развиваемого для замены iptables, ip6table, arptables и ebtables. Добавленный в ядро 3.13 код предусматривает сосуществование старой и новой подсистем, так как Nftables ещё требует доработки и тестирования. Nftables основывается на идеях, близких к реализации BPF (Berkeley Packet Filters) - правила фильтрации компилируются в пространстве пользователя в байткод и передаются в ядро через API Netlink, после чего для принятия решения по дальнейшим действиям с пакетом выполняются с использованием конечного автомата (pseudo-state machine). Выполнение правил с использованием конечного автомата вместо применения логики сопоставления позволяет сократить размер кода фильтрации, работающего на уровне ядра и вынести все функции разбора правил и логики работы с протоколами в пространство пользователя.
В Nftables работа с различными видами протоколов унифицирована в едином наборе псевдокода, что позволяет избавиться от необходимости поддержания в ядре отдельных расширений фильтрации для IPv4, IPv6, ARP и сетевых мостов. Все операции по определению условий и связанных с ними действий выполняются в пространстве пользователя, в ядре производится только базовый набор операций, таких как чтение данных из пакета, сравнение данных и т.п. Для реализации поддержки фильтрации нового протокола, все изменения могут быть внесены в пользовательском пространстве без обновления кода ядра. В качестве базовых блоков по-прежнему используются компоненты инфраструктуры Netfilter, в том числе существующие хуки, система отслеживания состояния соединений, компоненты организации очередей и подсистема ведения лога.
Для формирования правил фильтрации в nftables подготовлена утилита nft, которая проверяет корректность правил и транслирует их в байткод. Правила могут добавляться не только инкрементально, но и загружаться целиком из файла на диске. Синтаксис правил не похож на iptables и отличается использованием иерархических блочных структур вместо линейной схемы. Язык классификации правил основан на реальной грамматике, при обработке которой используется сгенерированный в bison парсер. Для обеспечения обратной совместимости с линейными правилами предоставляется специальная прослойка, позволяющая использовать iptables/ip6tables поверх инфраструктуры Nftables.
- Интегрирован легковесный классификатор трафика, выступающий в качестве гибко настраиваемой альтернативы ematch-классификатору. Особенностью нового классификатора является использование виртуальной машины BPF (Berkley Packet Filter) для выполнения программы классификации трафика, загружаемой в ядро в форме байткода, который в том числе может компилироваться в машинные инструкции при помощи BPF JIT-компилятора. Для загрузки bpf-правил используется штатная утилита tc, например "tc filter add dev em1 parent 1: bpf run bytecode-file /etc/tc/ssh.bpf flowid 1:1". Для создания bpf-правил может использоваться компилятор bpfc или tcpdump: "tcpdump -iem1 -ddd port 22 | tr '\n' ',' > /etc/tc/ssh.bpf".
- Включена по умолчанию поддержка режима быстрого открытия TCP-соединений (TFO - TCP Fast Open), который позволяет сократить число шагов установки соединения за счёт комбинирования в один запрос первого и второго шагов классического 3-этапного процесса согласования соединения, и давая возможность отправки данных на начальном этапе установки соединения.
- В ipset добавлена поддержка сетевых пространств имён (network namespaces), возможность использования комментариев в записях, реализация модулей "hash:net,net" и "hash:net,port,net" для указания двух подсетей в одной записи.
- Поддержка протокола HSR (High-availability Seamless Redundancy) для создания высокодоступных резервных Ethernet-каналов, обеспечивающих сохранение работоспособности сети при выходе из строя одного из каналов без задержки на восстановление. Для обеспечения отказоустойчивости в HSR используется кольцевая топология, в которой все узлы соединены с использованием двух дублирующих друг-друга каналов, каждый из которых используется в параллельном режиме. Для контроля целостности в обоих направлениях кольца отправляются специальные HSR-фреймы. HSR-драйвер создаёт специальный виртуальный сетевой интерфейс, с которым можно работать как с обычным сетевым интерфейсом.
- Для сетевых сокетов представлена поддержка опции SO_MAX_PACING_RATE, позволяющей приложению выставить значение максимальной интенсивности обработки пакетов на транспортном уровне. Лимит задаётся в байтах в секунду. Опция эффективно работает только с планировщиком пакетов Fair Queue.
- В стек IPv4 для сокетов добавлена поддержка режима IP_PMTUDISC_INTERFACE, позволяющего игнорировать механизм Path MTU discovery, не принимать и устанавливать новую информацию Path MTU, а всегда использовать параметры MTU сетевого интерфейса для отправляемых пакетов. Данная опция может оказаться полезной для блокирования атак на DNS-серверы, манипулирующих PMTU.
- В интерфейсы виртуальных туннелей IPsec (vti) добавлена поддержка IPv6.
- Добавлена возможность использования непривилегированными пользователями некоторых вызовов sysctl (например, /proc/sys/net/ipv4/ip_local_ports_range или /proc/sys/net/ipv4/icmp_echo_ignore_all) для изолированных сетевых пространств имён (network namespaces).
- Интеграция пакетного фильтра Nftables, развиваемого для замены iptables, ip6table, arptables и ebtables. Добавленный в ядро 3.13 код предусматривает сосуществование старой и новой подсистем, так как Nftables ещё требует доработки и тестирования. Nftables основывается на идеях, близких к реализации BPF (Berkeley Packet Filters) - правила фильтрации компилируются в пространстве пользователя в байткод и передаются в ядро через API Netlink, после чего для принятия решения по дальнейшим действиям с пакетом выполняются с использованием конечного автомата (pseudo-state machine). Выполнение правил с использованием конечного автомата вместо применения логики сопоставления позволяет сократить размер кода фильтрации, работающего на уровне ядра и вынести все функции разбора правил и логики работы с протоколами в пространство пользователя.
- Дисковая подсистема, ввод/вывод и файловые системы
- Для эффективного использования возможностей современных SSD-накопителей в ядро включен новый блочный слой (Linux block layer), рассчитанный на организацию многопоточного доступа к данным на многоядерных системах. Архитектура нового блочного слоя основана на двухуровневой модели очередей: На первом уровне функционируют очереди для передачи запросов ввода/вывода, привязанные к каждому CPU. Из данных очередей запросы направляются в очереди второго уровня, которые в свою очередь координируют обращение к оборудованию. В зависимости от конфигурации системы, числа CPU и накопителей, соотношение между очередями первого и второго уровня может составлять от 1 к 1 до N к M.
Тестирование показало высокую эффективность нового блочного слоя, который смог обеспечить производительность в многие миллионы операций ввода/вывода в секунду, т.е. показал способность справиться с пропускной способностью современных устройств NVM-Express и PCI-E на многоядерных системах, сохранив при этом типовой интерфейс и привычные возможности слоя для работы с блочными устройствами. Старый блочный слой обеспечивал производительность порядка 800 тысяч операций в секунду, не масштабируясь от числа CPU, чего было достаточно для накопителей на гибких магнитных дисках, но уже не хватает для SSD-накопителей, производительность которых перешагнула рубеж к 1 млн операций в секунду.
- Существенно ускорена работа специализированной файловой системы SquashFS, обычно используемой в качестве ФС для установочных образов, Live-систем и прошивок. SquashFS поддерживает доступ только для чтения, но обеспечивает при этом компактное представление метаданных и позволяет хранить данные в сжатом виде. В частности, реализована возможность непосредственной распаковки в кэш страниц (page cache), что позволяет избежать лишних операций копирования и уйти от эксклюзивной блокировки буфера, Также добавлена поддержка многопоточной распаковки сжатых данных и параллельного ввода/вывода.В зависимости от характера нагрузки и конфигурации системы, внесённые оптимизации позволяют ускорить работу SquashFS в разы, например, в одном из тестов скорость возросла с 13 MB/s до 67 MB/s. Изменения особенно заметны на многоядерных системах и при выполнении параллельного чтения данных.
- В системе Bcache, которая позволяет организовать кэширование доступа к медленным жестким дискам на быстрых SSD-накопителях, добавлена поддержка инкрементального сборщика мусора, позволяющего свести к минимуму задержки при выполнении операций чистки кэша от устаревших элементов и повысить эффективность расходования места в кэше.
- В модуле dm-cache, предназначенном для ускорения доступа к жестким дискам через применение кэширования на SSD-накопителях, добавлен режим сквозного проброса (passthrough), применяемого кода неизвестно насколько содержимое кэша согласовано с содержимым базового устройства. В данном режиме все операции чтения выполняются с базового накопителя, минуя кэш, а операции записи перенаправляются на базовое устройство с использованием кэширования. Например, режим passthrough может быть установлен загрузочным скриптом после экстренной перезагрузки, что позволит сохранить возможность кэширвоания записи до момента выполнения утилиты для восстановления целостности кэша. Кроме того в dm-cache добавлена поддержка операции урезания кэша и очистки блоков из кэша.
- В файловой системе Btrfs добавлена поддержка опций монтирования commit (задаёт интервал периодических коммитов, по умолчанию 30) и rescan_uuid_tree (инициирует процесс проверки и перестроения дерева UUID). Добавлен флаг FIEMAP_EXTENT_SHARED, позволяющий организовать совместное использование экстентов разными inode.
- Для файловых систем SMB2/SMB3 добавлена поддержка клонирования файлов при копировании на стороне сервера (по аналогии с "cp --reflink"), возможность определения настроек сжатия для отдельных файлов (через "chattr +c filename"). Добавлена опция CONFIG_CIFS_STATS2 для сбора информации о сетевых адаптерах, что удобно использовать для отладочных целей.
- Для F2FS представлена настройка CONFIG_F2FS_CHECK_FS, позволяющая отключить механизм проверки согласованности ФС на лету, сказывающийся на производительности.
- Для эффективного использования возможностей современных SSD-накопителей в ядро включен новый блочный слой (Linux block layer), рассчитанный на организацию многопоточного доступа к данным на многоядерных системах. Архитектура нового блочного слоя основана на двухуровневой модели очередей: На первом уровне функционируют очереди для передачи запросов ввода/вывода, привязанные к каждому CPU. Из данных очередей запросы направляются в очереди второго уровня, которые в свою очередь координируют обращение к оборудованию. В зависимости от конфигурации системы, числа CPU и накопителей, соотношение между очередями первого и второго уровня может составлять от 1 к 1 до N к M.
- Виртуализация и безопасность
- Поддержка API Secure Element для организации выполнения защищённых операций с использованием протокола NFC. С практической стороны, при реализации надлежащей поддержки на пользовательском уровне, теперь предоставлены все необходимые средства для совершения платежей и финансовых транзакций с использованием NFC. Новый API пока поддерживается только драйвером pn544;
- Внесена серия улучшений в генератор псевдослучайных чисел: увеличена производительность, повышено качество энтропии, улучшена работа на платформах, отличных от х86. Генератор 32-разрядых случайных чисел prandom32*() переведён с алгоритма taus88 на taus113, обеспечивающий периодичность 2^113.
- Добавлено устройство KVM-VFIO, позволяющее огранизовать взаимодействие гипервизора KVM c построенными с использованием механизма VFIO драйверами устройств, работающих в пространстве пользователя. В KVM обеспечена поддержка работы на системах с процессором ARM Cortex-A7;
- Улучшения в SELinux: Обеспечена возможность установки контекста безопасности для rootfs (ramfs) в привязке к inode, что например может быть использовано для привязки метки к файлу, когда ФС не предоставляет обработчик xattr.Добавлен признак always_check_network, при включении которого поведение проверки пакетов и пиров производится всегда, как при активном SECMARK и включенных метках для пиров, даже если SECMARK-правила не определены для netfilter и отсутствует конфигурация на основе Netlabel или меток в IPSEC. Проведены оптимизации, позволившие снизить накладные расходы при использовании SELinux (по тесту AIM7 выигрыш для систем с 1100-2000 пользователями составляет 2.6%).
- Память и системные сервисы
- Добавлен Power Capping Framework, предоставляющий унифицированный интерфейс для управления настройками ограничения энергопотребления устройств из пространства пользователя. В частности, фреймворк позволяет через sysfs-интерфейс /sys/devices/virtual/powercap задать ограничения энергопотребления для устройств, поддерживающих механизм Intel RAPL (Running Average Power Limit), реализованный в процессорах Intel начиная с Sandy Bridge и ожидаемый в будущих моделях различных типов устройств;
- Для систем на базе архитектуры NUMA задействован набор политик, позволяющих планировщику задач более эффективно организовывать выполнение процессов на подобных системах. Реализованные политики нацелены на размещение процессов и связанной с ними памяти в рамках одного NUMA-узла, а также на обработку таких ситуаций, как совместное использование страниц памяти несколькими процессами. Подобная локализация процессов и связанной с ними памяти важна, так как на NUMA-системах каждый CPU снабжён отдельным контроллером памяти и, несмотря на то, что каждый CPU может обращаться к любым областям памяти, обращения к областям, адресуемым локальным контроллером памяти данного CPU, осуществляется заметно быстрее, чем к областям привязанным к контроллерам памяти других CPU. Для управления включением тех или иных потилик работы планировщика представлены соответствующие sysctl-переменные.
- Проведена работа по увеличению масштабируемости при организации доступа к таблицам страниц памяти в условиях, когда выполняются операции со страницами памяти большого размера (hugepage). В частности, при использовании hugepages вместо монолитного блокирования частей таблиц страниц памяти теперь используются более гранулированные блокировки, позволяющие увеличить масштабируемость при применении многопоточности.
- Увеличена производительность и эффективность распределения памяти в механизме slab. Изменения коснулись методов управления свободными объектами в кэшах kmem_caches, в которых хранятся объекты, размером 128 байт и меньше. В итоге, число попаданий в кэш увеличилось на 5%, что привело к увеличению производительности slab на 3.1%.
- Увеличена масштабируемость epoll на системах с большим числом CPU за счёт переработки организации блокировок. Тестирование на системе с 16 CPU показало увеличение производительности с 35k jOPS до 125k jOPS в тесте SPECjbb.
- Реализация NFC digital layer. Большинство NFC-чипсетов реализуют данный слой на уровне прошивки, но встречаются и такие в которых поддерживается только аналоговый слой NFC. Добавлена поддержка технологий NFC-A (106 kbits/s), NFC-F (212 kbits/s и 424 kbits/s), NFC-DEP initiator/target и цифрового стека протоколов (Digital Protocol stack).
- Bluetooth-стеке реализована возможность создания виртуальных AMP-контроллеров, поддержка установки режима DUT (Device Under Test), добавлена команда mgmt_set_bredr для включения и отключения функций BR/EDR, добавлена команда для установки статического адреса для контроллеров, поддерживающих режимы BR/EDR и LE, добавлена поддержка нового HCI-сокета для управления определённым HCI-устройством из пользовательского приложения.
- Добавлен новый фреймворк Generic PHY Framework для разработки драйверов для подключаемых устройств, в том числе внешних сетевых адаптеров, SATA и USB устройств.
- Добавлена утилита, которую можно использовать для мониторинга за работой подсистемы температурного контроля.
- Аппаратные архитектуры
- Поддержка архитектуры http://www.intel.com/content/www/us/en/architecture-and-technology/many-integrated-core/intel-many-integrated-core-architecture.html Intel MIC]] (Many Integrated Core), используемой в сопроцессорах, имеющих форм-фактор карт PCIe и способных выполнять 64-разрядные экземпляры Linux. Интегрированный в ядро драйвер нацелен на управление состоянием экземпляров ОС и обеспечение взаимодействия между хост-системой и системой на карте сопроцессора. В настоящее время обеспечена поддержка сопроцессоров Intel MIC X100, которые, в частности, используются в самом высокопроизводительном кластере Tianhe-2, использующем архитектуру MIC для достижения производительности в 33.86 PetaFLOPS.
- Максимальное число CPU для архитектуры x86 увеличено с 4096 до 8192;
- Поддержка архитектуры ARM big.LITTLE и гетерогенных многопроцессорных ARM-систем. Поддержка субархитектуры big-endian ARM "BE8".
- Для архитектуры ARM64 добавлена поддержка систем big-endian, горячего подключения CPU и 42-разрядного виртуального адресного пространства при использовании страниц памяти размером 64 Кб;
- Для архитектуры PowerPC добавлена поддержка систем little-endian;
- Для архитектуры SPARC64 реализована полная поддержка tickless-режима, не зависящего от сигналов таймера. Размер больших страниц (huge pages) памяти для архитектуры SPARC64 увеличен с 4MB до 8MB.
- Оборудование
- Серия значительных улучшений в DRM-модуле Radeon:
- Поддержка GPU семейства "Hawaii" (R9 290X). Обеспечена поддержка UVD-декодера, управление питанием (DPM) и сменой видеорежимов;
- Стабилизирована и по умолчанию активирована поддержка динамического управления питанием и частотами (DPM) для большинства современных встроенных и внешних видеокарт Radeon. С практической стороны DPM позволит обеспечить оптимальное энергопотребление в условиях автономной работы и добиться максимальной производительности для конфигураций, работающих на заниженной частоте;
- По умолчанию включена поддержка вывода звука через HDMI, в том числе с использованием кодеков DTS-HD и Dolby TrueHD, и с поддержкой конфигурации объёмного звука 7.1;
- Поддержка динамического включения и выключения дискретного GPU на базирующихся на технологии AMD PowerXpress ноутбуках с двумя GPU;
- Внесены изменения, позволившие существенно увеличить производительность HD7000 и более новых GPU, поддерживаемых в Mesa Gallium3D-драйвером RadeonSI;
- В DRM-драйвере Intel i915 появилась поддержка графической подсистемы процессоров на базе микроархитектуры Broadwell, которая придёт на смену Haswell;
- Добавлен DRM-модуль для видеоподсистемы Marvell Armada 510 SoC;
- В DRM-модуль Tegra добавлена поддержка 3D для Tegra20, Tegra30 и Tegra114. Для Tegra114 добавлена поддержка HDMI.
- Поддержка систем NVIDIA Tegra T124, Renesas r7272100, r8a7791
- Поддержка звуковых интерфейсов на базе чипа TC Applied Technologies DICE;
- Поддержка беспроводных адаптеров на базе чипов Qualcomm Atheros WCN3660/3680
- Поддержка сетевых интерфейсов Sony Port-100 Series USB NFC, MOXA ART MDIO.
- Серия значительных улучшений в DRM-модуле Radeon: