Ядро Linux 3.3. Обзор новшеств

Linux  Линус Торвальдс представил релиз ядра Linux 3.3.
Из основных улучшений можно отметить интеграцию изменений,
подготовленных в процессе разработки платформы Android, поддержку новой
архитектуры TI C6X, включение наработок по борьбе с негативным влиянием
промежуточной буферизации пакетов (Bufferbloat), улучшенную реализацию
RAID в Btrfs, интеграцию кода виртуального коммутатора Open vSwitch,
альтернативную систему агрегации сетевых интерфейсов, новые средства для
управления сетевыми приоритетами и возможность ограничения TCP-буфера в
привязке к cgroup.

  В новую версию принято около 9 тысяч исправлений от более тысячи
разработчиков, размер патча — 43 Мб (для сравнения, размер патча ядра
3.2 — 99 Мб, 3.1 — 49 Мб, 3.0 — 44 Мб). Добавлено 10753 тыс. строк кода,
удалено — 10698 тыс. строк. Около 40% всех представленных в 3.3
изменений связаны с драйверами устройств, примерно 26% изменений имеют
отношение к обновлению кода специфичного для аппаратных архитектур, 12%
связано с сетевым стеком, 5% — файловыми системами и 4% c внутренними
подсистемами ядра.

  Ядро 3.3 также примечательно преодолением очередного рубежа —
размер исходного кода ядра превысил отметку в 15 млн строк. При этом
5.6 млн строк приходится на драйверы, 1.8 млн на специфичный для
аппаратных архитектур код, 700 тыс на файловые системы, 533 тыс на
звуковую подсистему, 493 тыс на сетевой стек. 97.22% кода ядра написано
на языке Си, 2.47% на ассемблере, 0.15% на Perl и 0.04% на Shell.
Отметка в 10 млн строк была пройдена в конце 2008 года, при выпуске ядра
2.6.27.

Наиболее интересные новшества ядра 3.3:

  • Память и системные сервисы

    • Интеграция
      некоторых улучшений и исправлений, подготовленных для ядра,
      используемого в платформе Android. В частности, перенесена поддержка ashmem
      (реализация разделяемой памяти, позволяющая маркировать незакреплённые
      страницы памяти, которые в последующем можно освободить в ситуации
      нехватки свободной памяти), механизм межпроцессного взаимодействия
      Binder IPC, ram console (возможность сохранить вывод консоли в
      специальной области ОЗУ, к которой можно получить доступ после
      перезагрузки в режиме диагностики), специализированный драйвер для
      ведения системного лога, реализация LMK (low memory killer, управление
      принудительным завершением приложений в случае нехватки памяти), новый
      вариант драйвера gpio.

      Некоторые подсистемы ядра Android, например wakelocks, пока остаются
      неперенесёнными, но в конечном итоге планируется добиться интеграции
      всех наработок из ядра Android, что существенно упростит сопровождение
      кода, позволит сконцентрироваться на одном ядре при разработке драйверов
      и даст возможность использования последней версии ядра Linux при
      портировании Android;

    • Поддержка загрузки с использованием EFI
      (Extensible Firmware Interface). В состав ядра включен набор
      компонентов, необходимых для загрузки и запуска образа ядра (x86
      bzImage) непосредственно прошивкой EFI. Образ ядра bzImage выглядит для
      прошивки как приложение EFI. При этом, созданный образ bzImage
      является универсальным и кроме поддержки EFI может использоваться без
      изменений и с классическими загрузчиками, вызываемыми из BIOS;

    • Интеграция патча, который решает проблемы с
      повышенным потреблением энергии на ноутбуках, поддерживающих технологию
      ASPM (Active State Power Management) для карт PCI Express. Проблема
      проявляется начиная с ядра 2.6.38, в котором была реализована новая
      система инициализации ASPM, и проявляется в повышении энергопотребления
      на 10-30%. Патч имитирует поведение Windows Vista при инициализации
      системы управления питанием, т.е. не очищает статус ASPM для всех
      устройств в процессе загрузки, оставляя параметры, выставленные BIOS. В
      феврале данный патч уже был распространён для прошлых версий ядра в виде обновлений 3.0.20 и 3.2.5;
    • Поддержка технологии DMA-BUF для совместного
      использования буферов. При помощи DMA-BUF различные подсистемы ядра
      (V4L2, DRI и т.п.) могут совместно использовать буферы между различными
      драйверами устройств;

    • В реализации псевдофайловой системы /proc добавлена
      опция монтирования hidepid, позволяющая запретить пользователю вход в
      поддиректории /proc/pid/ с данными о непринадлежащих ему процессах
      (hidepid=1) или полностью сделать невидимыми для пользователя
      поддиректории чужих процессов (hidepid=2). Через опцию gid можно задать
      группу для которой будет сделано исключение при доступе к информации о
      процессах через /proc;

    • Значительно снижено потребление памяти при использовании cgroup;
    • Проведена работа
      по сокращению задержек и проблем с отзывчивостью, наблюдаемых обычно
      при интенсивной работе с медленными USB-накопителями, которые
      проявлялись, например, в виде подвисания web-браузера или мультимедиа
      проигрывателя;

  • Дисковая подсистема, ввод/вывод и файловые системы
    • Расширение возможностей файловой системы Btrfs:

      • Полностью переработанная реализация операции балансировки
        («balance»), используемых для полной перезаписи данных файловой
        системы, в чём возникает необходимость, например, при добавлении
        дополнительного диска, на который следует перераспределить уже имеющиеся
        в ФС данные. Таким образом, операция балансировки позволяет привести ФС
        в сбалансированное состояние, но обычно перестроение является
        длительной операцией и занимает много часов. Новая реализация кода
        балансировки поддерживает возможность приостановки процесса перестроения
        и его последующего возобновления, а также возможность вывода подробной
        информации о статусе выполнения операции. Процесс балансировки теперь
        основан на использовании профилей данных и метаданных, что позволяет
        организовать балансировку только пустых групп блоков.
      • Поддержка перестроения данных (restriping) между
        различными RAID-уровнями (т.е. можно перейти от одного типа RAID на
        другой). Поддержка новой возможности реализована в ветке «parser»
        инструментария btrfs-progs;
      • Новая отладочная утилита «integrity check»,
        предназначенная для расширенного тестирования целостности данных
        разработчиками ФС в процессе выявления ошибок. Суть тестирования состоит
        в обеспечении дополнительного слежения за соблюдением
        непротиворечивности записываемых на диск данных, выявляя ситуации при
        которых возможно нарушение целостности ФС;
    • Новая реализация механизма изменения размера ФС
      Ext4. В отличие от существующей в настоящее время системы изменения
      размера, новый механизм полностью реализован в ядре, а потому работает
      намного быстрее. В тестах производительности он значительно обогнал
      прошлую реализацию, позволив изменить размер файловой системы, с 20 Гб
      до 230 Гб за 3.3 секунды, вместо более чем 5 минут, которые понадобились
      утилите resize2fs. Для выполнения изменения размера в ядро был добавлен
      новый ioctl EXT4_IOC_RESIZE_FS;
    • Из staging-дерева удалён код старой версии файловой системы PohmelFS в связи с намерением интегрировать в ядро новый переработанный вариант PohmelFS, базирующийся на распределённом хранилище Elliptics;
  • Сетевая подсистема
    • Альтернативная реализация системы агрегирования сетевых интерфейсов. Реализовано новое сетевое устройство «teaming«,
      изначально позиционируемое как быстрая, масштабируемая, прозрачная и
      управляемая из пространства пользователя замена механизму «bonding».
      Teaming позволяет создавать виртуальные сетевые интерфейсы, объединяющие
      несколько физических Ethernet-адаптеров, что обычно делается для
      обеспечения более высокой пропускной способности или для обеспечения
      отказоустойчивых конфигураций. В настоящее время teaming поддерживает
      два режима балансировки пакетов между связанными интерфейсами:
      round-robin и active-backup. Для организации управления новым
      устройством подготовлена специальная библиотека libteam, а также набор демонстрационных приложений;

    • Контрольная группа net_prio для управления сетевыми
      приоритетами (Network priority cgroup). Используя cgroup net_prio
      администратор теперь может динамически управлять приоритетом сетевого
      трафика, генерируемого различными приложениями. Традиционно, приложение
      может установить приоритет для своего трафика на этапе создания сокета
      через опцию SO_PRIORITY, но к сожалению это не всегда возможно. Cgroup позволяет
      администратору привязать процессы к группе, которая будет иметь иной
      приоритет для исходящих пакетов, отправляемых через заданный сетевой
      интерфейс;

    • Поддержка байтового ограничения очередей передачи
      данных, реализованного в рамках проекта по разработке средств для борьбы
      с эффектом «Bufferbloat«, под которым понимается феномен негативного влияния промежуточной буферизации пакетов на пропускную способность, однородность потока (jitter) и время прохождения пакетов (latency).
      В состав ядра 3.3 интегрирована поддержка задания ограничения на размер
      данных, помещаемых в очередь передачи данных для заданного сетевого
      устройства. В результате появилась возможность обеспечения приемлемой
      транзитной задержки (latency) для высокоприоритетных пакетов, без
      очистки аппаратных очередей, когда появляются данные для отправки.
      Настройка ограничений осуществляется через файлы tx-n в директории
      byte_queue_limits внутри sysfs;

    • Возможность
      ограничения размера TCP-буфера в зависимости от cgroup. Механизм cgroup
      позволяет установить ограничения на ресурсы группы процессов, но эти
      ограничения ранее затрагивали только память в пространстве пользователя.
      В некоторых ситуациях, работа процессов приводит к большим расходам
      памяти на уровне ядра, которую хотелось бы тоже ограничить.
      Представленная возможность является первым шагом к реализации таких
      ограничений и позволяет управлять потреблением памяти ядра, выделяемой
      для буферизации TCP-соединений. В частности, теперь можно в привязке с
      cgroup задать ограничение на размер буферов, используемых кодом TCP;

    • Поддержка интерфейса для мониторинга за UNIX-сокетами, используемого утилитой ss;
    • Поддержка Target-драйвера для протокола SCSI RDMA
      Protocol (SRP), позволяющего получить доступ к блочному устройству на
      другом хосте (target), организовав соединение поверх сетей,
      поддерживающих протокол RDMA;
    • Поддержка протокола NFC Logical Link Controller, известного также как P2P-режим NFC (peer to peer);
  • Виртуализация и безопасность
    • Интеграция Open vSwitch, программной реализации мультипротокольного сетевого коммутатора. Open vSwitch поддерживает
      как стандартные управляющие интерфейсы (sFlow, Netflow, RSPAN, CLI),
      так и позволяет подключать дополнительные программные расширения или
      использовать для управления протоколы Openflow и OVSDB. В отличии от уже
      входящей в состав ядра подсистемы сетевых мостов, Open vSwitch
      изначально создан для решения более комплексных задач, таких как
      организация сетевого взаимодействия между виртуальными машинами;
    • Набор патчей с решением
      некоторых проблем с производительностью Xen Dom0. Патчи позволяют
      организовать информирование гипервизора о текущих режимах
      энергопотребления (cpufreq). Поэтому, без данных патчей Xen не может
      инициировать выставление оптимальной частоты работы CPU, необходимой для
      достижения максимальной производительности;
    • Добавлены новые Xen-драйверы: privcmd, xenbus_backend и xenbus;
    • В KVM для гостевых систем предоставлена вторая версия архитектуры PMU (Performance Monitoring Unit);
    • В модуль расширенной верификации EVM (extended verification module) добавлена
      поддержка верификации цифровых сигнатур. EVM позволяет защитить
      расширенные атрибуты файлов (xattrs) от атак, направленных на нарушение
      их целостности (не даёт злоумышленнику изменить метаданные, например,
      загрузившись со своего накопителя);

  • Оборудование и аппаратные архитектуры
    • Поддержка LPAE (large physical address extension) для 32-разрядной архитектуры ARMv7, что позволит организовать адресацию более 4 Гб памяти;

    • Поддержка архитектуры C6X,
      используемой в одноядерных и многоядерных DSP-процессорах C64x и C66x,
      выпускаемых компанией Texas Instruments и используемых в широком спектре
      современных мобильных платформ (DaVinci, OMAP3, OMAP4). Изначально
      поддержка C6X для Linux обеспечена проектом linux-c6x.org;
    • В DRM-модуле для карт Radeon обеспечена поддержка вывода звука через порт HDMI для карт серии Radeon HD 5000 «Evergreen»;
    • В DRM-модуле Intel улучшена поддержка видеокарт,
      встроенных в процессоры Sandy Bridge и Ivy Bridge, например, добавлена
      поддержка видеоспрайтов;
    • В DRM-модуле Nouveau добавлена поддержка карт NVD9,
      для некоторых карт семейства GeForce реализована возможность вывода
      звука через порт HDMI, для карт NVD0-Fermi добавлена поддержка Page Flipping, улучшена поддержка MXM, добавлен код для определения типа памяти, возможность управления частотой GPU для карт Fermi;
    • Добавлен DRM/KMS драйвер omapdrm для графической подсистемы TI OMAP;
    • В основное дерево ядра из ветки staging перенесён драйвер gma500 для интегрированных видеокарт Intel (Poulsbo, Oaktrail, Cedarview), используемых на многих устройствах с процессором Atom;
    • Новые USB-драйверы: Samsung Exynos OHCI, Marvell
      Host Controller, Marvell usb OTG. В драйвер ipheth добавлена поддержка
      iPhone 4S;

    • В звуковую подсистему добавлена поддержка
      оборудования, снабжённого средствами ускорения обработки сжатого звука.
      Добавлена поддержка HDA-карты Cirrus Logic 4213;

    • Множество других улучшений и изменений, связанных с поддержкой аппаратных устройств, в том числе новые драйверы для устройств хранения, сетевых адаптеров и web-камер.
Запись опубликована в рубрике jadro_linux_3_3_obzor_novshestv. Добавьте в закладки постоянную ссылку.