Menu Close
Red Hat Training
A Red Hat training course is available for Red Hat Enterprise Linux
Оптимизация производительности
Оптимизация пропускной способности в Red Hat Enterprise Linux 6
Редакция 4.0
Red Hat. Отдел документации
Под редакцией
Don Domingo
Под редакцией
Laura Bailey
Аннотация
Глава 1. Обзор
- Функции
- Описание подсистем начинается с обзора их функций в Red Hat Enterprise Linux 6, а также обновлений Red Hat Enterprise Linux 6, которые способствовали повышению их производительности.
- Анализ
- В секциях анализа обсуждаются основные характеристики производительности отдельных подсистем, что поможет оценить их значимость в реальных окружениях.Дополнительно будут рассмотрены способы сбора статистики подсистем (что известно как профилирование). Инструменты профилирования могут подробно рассматриваться в других документах.
- Конфигурация
- Возможно, наиболее важная информация приведена в секциях, посвященных изменению конфигурации с целью повышения производительности подсистем Red Hat Enterprise Linux 6.
1.1. Целевая аудитория
- Системные и бизнес-аналитики
- Документ предоставляет общую информацию о производительности Red Hat Enterprise Linux 6 и отдельных подсистем до и после оптимизации. Такого уровня детализации достаточно, чтобы помочь потенциальным клиентам оценить пригодность платформы для работы в условиях интенсивной нагрузки.Руководство содержит ссылки на специализированные документы, после ознакомления с которыми у читателя будет достаточно знаний для формирования высокоуровневой стратегии развертывания и оптимизации Red Hat Enterprise Linux 6. Это позволит не только разрабатывать новые схемы инфраструктур, но и выполнять анализ предлагаемых проектов.Такая структура документа рассчитана на читателей с общими знаниями подсистем Linux и сетей уровня предприятия.
- Системные администраторы
- Материал рассчитан на специалистов уровня RHCE[1]и системных администраторов с аналогичным опытом работы с Linux (3-5 лет). Результаты каждой схемы конфигурации и их влияние на производительность будут рассматриваться более подробно.Задача администратора заключается в подборе стратегии оптимизации в соответствии с требованиями нагрузки. Это означает необходимость понимания рисков и компромиссов, которые нужно будет учесть при выборе конфигурации, призванной повысить производительность той или иной подсистемы.
1.2. Горизонтальное масштабирование
1.2.1. Параллельные вычисления
1.3. Распределенные системы
- Взаимодействие
- Горизонтальное масштабирование достигается за счет параллельного выполнения задач. Для их координации необходимо обеспечить возможность взаимодействия между процессами и системами.
- Хранение данных
- Размещения данных на локальных дисках может быть недостаточно — для эффективного масштабирования надо добавить дополнительный уровень абстракции для распределенного пространства хранения, что позволит его наращивать, добавляя необходимое оборудование.
- Управление
- В распределенных схемах уровень управления является наиболее важным, так как именно на этом уровне осуществляется координация программных и аппаратных компонентов, их взаимодействия, размещения данных и использования общих ресурсов.
1.3.1. Взаимодействие
- оборудование,
- программное обеспечение.
Ethernet является наиболее распространенным способом передачи данных между компьютерами. На сегодняшний день по умолчанию используется Gigabit Ethernet (GbE), и серверы обычно имеют 2-4 порта Gigabit Ethernet. Именно GbE чаще всего используется для организации распределенных схем. Даже если Ethernet-карты поддерживают более высокую скорость передачи, GbE может по-прежнему использоваться для выделенного управляющего интерфейса.
Стандарт 10GbE (10 Gigabit Ethernet) становится все более популярным при проектировании мощных серверов, так как его скорость в 10 раз превышает скорость GbE. Его основным преимуществом является обеспечение баланса между скоростью передачи и вычислений для многоядерных процессоров. 10GbE позволяет поддерживать оптимальный уровень производительности системы без ограничения скорости связи.
Скорость Infiniband значительно выше по сравнению с 10GbE. Помимо соединений TCP/IP и UDP, используемых с Ethernet, Infiniband поддерживает взаимодействие с общей памятью, что позволяет использовать этот стандарт протоколами удаленного прямого доступа к памяти (RDMA, Remote Direct Memory Access).
RoCCE (RDMA over Ethernet) объединяет соединения Infiniband с прямым доступом к памяти и инфраструктуру 10GbE. Рынок продукции 10GbE постоянно расширяется, поэтому вполне можно ожидать, что со временем RDMA и RoCCE будут использоваться более широко.
1.3.2. Хранение данных
- Разные системы хранят данные в одном месте.
- Пространство хранения состоит из разных устройств хранения.
NFS (Network File System) позволяет серверам и пользователям обращаться к файловым системам через TCP или UDP. Эта файловая система используется для хранения данных, к которым обращаются разные приложения, и подходит для хранения больших объемов информации.
Сети хранения данных (SAN, Storage Area Network) используют протоколы Fibre Channel и iSCSI для удаленного доступа к данным. Инфраструктура Fibre Channel объединяет в себе адаптеры шин, коммутаторы, массивы данных и характеризуется высокой скоростью работы и пропускной способностью. Пространство данных SAN отделено от сети, что обеспечивает определенный уровень гибкости при дизайне системной структуры.
- управление доступом к пространству хранения данных;
- управление большими объемами данных;
- подготовка систем;
- резервное копирование и репликация данных;
- создание снимков;
- восстановление систем;
- обеспечение целостности данных;
- миграция данных.
Файловая система GFS2 (Global File System 2) допускает одновременное выполнение чтения и записи данных, расположенных на разных узлах в кластере. Таким образом, узлы смогут обращаться к одним и тем же данным, как будто они расположены на одном диске.
1.3.3. Конвергенция сетей
Протокол FCoE (Fibre Channel over Ethernet) использует физическую инфраструктуру 10GbE для передачи пакетов данных через единственную конвергентную карту (CNA, converged network card). Стандартный трафик TCP/IP и операции передачи данных тоже могут обрабатываться подобным образом. Конвергенция сетей позволяет использовать одну сетевую карту для обработки множества сетевых подключений.
- Сокращение числа соединений
- FCoE сокращает число сетевых подключений в два раза. При необходимости можно использовать больше каналов связи, однако одного такого подключения обычно достаточно для обработки сетевого трафика и данных. Обычно такая схема подходит для компактных серверов в силу экономии места.
- Экономичность
- Сокращение числа подключений ведет к снижению количества используемых сетевых адаптеров, кабелей и сетевых коммутаторов, тем самым значительно снижая себестоимость сетевой инфраструктуры. Так как со временем цена оборудования тоже уменьшается, экономия растет в геометрической прогрессии.С учетом того, что себестоимость технологии 10GbE также постепенно снижается, а конвергентные сетевые адаптеры интегрируются в одну микросхему, их доступность приводит к все более широкому использованию, что со временем приведет к снижению цен.
Протокол iSCSI (Internet SCSI) тоже используется для конвергенции сетей и предоставляет альтернативу FCoE. Несмотря на то что iSCSI не включает полный диапазон функций управления, его достоинствами являются гибкость и экономичность.
Глава 2. Особенности производительности Red Hat Enterprise Linux 6
2.1. 64-разрядные процессоры
- Прозрачные и очень большие страницы
- Улучшения неравномерного доступа к памяти
Реализация очень больших страниц в Red Hat Enterprise Linux 6 увеличивает эффективность управления памятью независимо от уровня нагрузки. Размер больших страниц составляет 2 МБ (размер стандартной страницы равен 4 КБ), что облегчает масштабирование приложений, позволяя работать с гигабайтами и даже терабайтами памяти.
Современные системы поддерживают неравномерный доступ к памяти (NUMA, Non-Uniform Memory Access). NUMA значительно упрощает проектирование схемы оборудования для крупных систем, но в то же время усложняет разработку приложений. Представим ситуацию, где NUMA работает и с локальной, и с удаленной памятью. Так как обращение к удаленной памяти занимает намного дольше по сравнению с локальным доступом, это негативно скажется на производительности операционной системы, приложений, и поэтому конфигурацию системы потребуется откорректировать.
2.2. Спин-блокировка
2.3. Динамическая структура списков
2.4. Безтактовое ядро
2.5. Контрольные группы
- список задач,
- ресурсы.
- наборы процессоров;
- память;
- ввод-вывод;
- сетевые ресурсы.
2.6. Оптимизация файловой системы
Файловая система еxt4 в Red Hat Enterprise Linux 6 используется по умолчанию. Ее основной особенностью является увеличение максимального размера раздела до 1 эксабайта и файла до 16 ТБ. В свою очередь, Red Hat Enterprise Linux 6 поддерживает файловые системы с максимальным размером 16 ТБ и файлы размером до 16 ТБ. Другие достоинства ext4:
- уменьшение размера метаданных за счет использования экстентов;
- отложенное выделение блоков;
- контрольные суммы журналов.
64-разрядная файловая система XFS включает функции журналирования и оптимально подходит для организации больших файлов и файловых систем на одном компьютере. XFS изначально была рассчитана для работы на больших серверах. Особенности XFS:
- отложенное выделение блоков;
- динамическое выделение узлов;
- индексация B-tree;
- онлайн-дефрагментация и увеличение размера файловой системы;
- комплексные алгоритмы предварительного чтения метаданных.
Обычно BIOS поддерживает диски размером до 2.2 ТБ. Системы Red Hat Enterprise Linux 6, использующие BIOS, могут поддерживать диски большего размера за счет использования глобальной таблицы разделов. Исключение составляют загрузочные диски — их размер не может превышать 2.2 ТБ. Дело в том, что BIOS изначально создавалась для IBM и, несмотря на то что она постепенно развивалась, UEFI (Unified Extensible Firmware Interface) лучше приспособлен для поддержки нового оборудования.
Важно
Важно
Глава 3. Анализ производительности
3.1. /proc
proc
предоставляет собой каталог, отражающий иерархическую структуру файлов состояния ядра Linux. Пользователи и программы могут обращаться к этому каталогу для получения информации о системе.
proc
также содержит информацию об оборудовании и текущих процессах. Большинство файлов в этом каталоге доступно только для чтения, но некоторые (в /proc/sys
) могут быть изменены.
3.2. Системные мониторы GNOME и KDE
Системный монитор GNOME возвращает информацию о системе и использовании ресурсов. Чтобы его открыть, выполните команду gnome-system-monitor
или в главном меню системы выберите Приложения > Системные > Системный монитор.
- Система
- Информация об операционной системе и оборудовании.
- Процессы
- Список активных процессов и их статус. Выбранные процессы могут быть остановлены, запущены, завершены, или можно изменить их приоритет.
- Ресурсы
- Диаграммы использования процессора, памяти, пространства подкачки и сети.
- Файловые системы
- Список файловых систем, включая их тип, каталог подключения, размер свободного и занятого пространства.
Системный монитор KDE позволяет наблюдать за нагрузкой системы и состоянием процессов. Чтобы его открыть, выполните команду ksysguard
или в главном меню выберите Приложения > Система > Системный монитор.
- Таблица процессов
- Список процессов в алфавитном порядке. Можно их отсортировать по другим критериям: по занятости процессора, памяти, владельцу или приоритету. Полученные результаты можно дополнительно отфильтровать.
- Загрузка системы
- Диаграмма использования ресурсов процессора, памяти, пространства подкачки и сети. Наведите курсор на интересующий график для получения подробной информации.
3.3. Команды мониторинга
top
top показывает изменения статистики системы и активности процессов в реальном времени. Формат результатов можно настроить с сохранением настроек после перезагрузки.
man top
.
ps
ps возвращает снимок состояния работающих процессов.
man ps
.
vmstat
vmstat позволяет получить подробную информацию об активности процессов, памяти, процессора, ввода-вывода устройств и пр.
man vmstat
.
sar
sar возвращает информацию об активности системы на текущий день. Стандартный формат включает статистику использования процессора через каждые 10 минут.
12:00:01 AM CPU %user %nice %system %iowait %steal %idle 12:10:01 AM all 0.10 0.00 0.15 2.96 0.00 96.79 12:20:01 AM all 0.09 0.00 0.13 3.16 0.00 96.61 12:30:01 AM all 0.09 0.00 0.14 2.11 0.00 97.66 ...
man sar
.
3.4. Tuned и ktune
default
- Стандартный профиль энергосбережения. Включает модули для процессора и дисков.
latency-performance
- Профиль для корректирования задержки ответа сервера. Отключает механизмы tuned и ktune, изменяет режим
cpuspeed
наperformance
. Для контроля дискового ввода-вывода используется планировщик deadline. В качестве обязательного значенияcpu_dma_latency
регистрируется0
. throughput-performance
- Профиль для коррекции производительности обработки данных. Рекомендуется при отсутствии доступа к большому хранилищу данных. Эквивалентно
latency-performance
за исключением:- Минимальный интервал
kernel.sched_min_granularity_ns
равен10
миллисекундам. - Значение
kernel.sched_wakeup_granularity_ns
(предварительная активация) равно15
миллисекундам. - Значение
vm.dirty_ratio
равно 40%. - Включены возможности прозрачного использования страниц большого размера.
enterprise-storage
- Этот профиль рекомендуется для конфигурации пространства данных для крупных серверов уровня предприятия, что включает защиту кэша за счет переключения на питание от батареи и управление кэшем на диске. Аналогичен профилю
throughput-performance
за исключением того, что повторное монтирование систем осуществляется с параметромbarrier=0
. virtual-guest
- Этот профиль рекомендуется для конфигурации пространства данных для крупных серверов уровня предприятия, что включает защиту кэша за счет переключения на питание от батареи и управление кэшем на диске. Аналогичен профилю
throughput-performance
за исключением следующих факторов:- значение
readahead
равно4x
, - файловые системы, которые не являются корневыми и загрузочными, монтируются с параметром
barrier=0
.
virtual-host
virtual-host
основан на профилеenterprise-storage
. Он уменьшает объем подкачки виртуальной памяти и допускает более агрессивный подход к записи «грязных» страниц. Этот профиль доступен в Red Hat Enterprise Linux 6.3 и рекомендуется для хостов виртуализации, включая KVM и Red Hat Enterprise Virtualization.
3.5. Профилирование приложений
3.5.1. SystemTap
3.5.2. OProfile
- Точность статистики не является стопроцентной, так анализ мог быть начат не с инструкции, вызвавшей прерывание, а с соседней.
- OProfile допускает, что процессы будут запускаться и останавливаться множество раз, и накапливает полученные результаты. При необходимости их можно очистить.
- OProfile идентифицирует процессы, которым не хватает процессорных ресурсов, но не определяет бездействующие процессы, ожидающие своей очереди.
/usr/share/doc/oprofile-<версия>
.
3.5.3. Valgrind
man valgrind
. Дополнительная документация:
/usr/share/doc/valgrind-<версия>/valgrind_manual.pdf
/usr/share/doc/valgrind-<версия>/html/index.html
3.5.4. Perf
perf stat
- Сбор стандартной статистики системных событий, включая сведения об инструкциях и временных циклах. Флаги помогут получить информацию о дополнительных событиях. В Red Hat Enterprise Linux 6.4 команда
perf stat
стала работать с контрольными группами. Подробную информацию можно найти на справочной страницеman perf-stat
. perf record
- Осуществляет сбор данных и сохраняет их в файл, анализ которого может быть выполнен с помощью
perf report
. Подробную информацию можно найти на справочной страницеman perf-record
. perf report
- Получает сведения о производительности из файла и формирует отчет. Подробную информацию можно найти на справочной странице
man perf-report
. perf list
- Возвращает список доступных событий. События могут отличаться в зависимости от оборудования мониторинга и конфигурации системы. Подробную информацию можно найти на справочной странице
man perf-list
. perf top
- Осуществляет сбор статистики в реальном времени аналогично top. Подробную информацию можно найти на справочной странице
man perf-top
.
3.6. Red Hat Enterprise MRG
- настройки питания, прерываний и обнаружения ошибок в BIOS;
- сетевые параметры, включая использование TCP и объединение прерываний;
- ведение журналов в файловых системах с журналированием;
- системное журналирование;
- определяет процессоры, которые будут обрабатывать прерывания и пользовательские процессы;
- использование пространства подкачки;
- обработка исключений нехватки памяти.
Глава 4. Процессор
Топология
Потоки
Прерывания
4.1. Топология процессоров
4.1.1. Топология NUMA
- Последовательные шины.
- Топологии NUMA.
- Какова топология системы?
- Где выполняется приложение?
- Где размещен ближайший банк памяти?
4.1.2. Коррекция производительности процессора
- Процессор (ядро 0-3) передает адрес памяти локальному контроллеру.
- Контроллер устанавливает доступ к памяти.
- Процессор выполняет операции чтения и записи в область памяти с заданным адресом.

Рисунок 4.1. Локальный и удаленный доступ к памяти
- Процессор (ядро 0-3) передает адрес памяти удаленному контроллеру.
- Удаленный контроллер памяти получает запрос доступа.
- Контроллер устанавливает доступ к локальному банку памяти.
- Процессор выполняет операции чтения и записи область памяти с заданным адресом.
- топологию системы (схему связи компонентов);
- процессорное ядро, на котором запускается программа;
- расположение банка памяти.
4.1.2.1. taskset
0x00000001
может обозначать процессор с номером 0, а 0x00000003
— процессоры 0 и 1.
# taskset -p маска PID
# taskset маска -- программа
-c
позволяет определить список или диапазон процессоров:
# taskset -c 0,5,7-9 -- myprogram
man taskset
.
4.1.2.2. numactl
numactl
выполняет процессы в соответствии с политикой распределения памяти. Политика определяет правила для заданного процесса и его дочерних процессов. numactl
получает топологию системы из /sys
.
/sys
содержит схему соединения процессоров, памяти и периферийных устройств. Так, например, /sys/devices/system/cpu
содержит информацию о процессорах, а /sys/devices/system/node
— об узлах NUMA и их взаимном расположении.
--show
- Возвращает настройки правил NUMA для текущего процесса. Пример:
numactl --show
. --hardware
- Возвращает список доступных узлов.
--membind
- Выделяет память только на заданных узлах. Если памяти недостаточно, команда вернет ошибку. Формат:
numactl --membind=список_узлов программа
. Список узлов может содержать разделенные запятой номера узлов и диапазоны. Подробную информацию можно найти на справочной страницеman numactl
. --cpunodebind
- Выполнение программы и дочерних процессов на процессорах, принадлежащих указанным узлам. Формат:
numactl --cpunodebind=список_узлов программа
. Список узлов содержит разделенные запятой номера узлов и диапазоны. Подробную информацию можно найти на справочной страницеman numactl
. --physcpubind
- Выполнение программы и дочерних процессов на указанных процессорах. Формат:
numactl --physcpubind=список_процессоров программа
. Список содержит разделенные запятой номера процессоров (номера можно получить из/proc/cpuinfo
.) Подробную информацию можно найти на справочной страницеman numactl
. --localalloc
- Память должна выделяться только на текущем узле.
--preferred
- Если возможно, память будет выделяться на заданном узле. В случае неудачи будут выбираться другие узлы. Формат:
numactl --preferred=номер_узла
. Подробную информацию можно найти на справочной страницеman numactl
.
man numa(3)
.
4.1.3. numastat
Важно
numastat
полностью совместима со своей ранней версией, их параметры и результаты работы могут значительно отличаться.
numastat
покажет число занятых страниц памяти и список событий для каждого узла NUMA.
numa_miss
и numa_foreign
.
Стандартная статистика
- numa_hit
- Число успешно выделенных страниц на узле.
- numa_miss
- Число страниц, которые должны были быть выделены на другом узле, но из-за нехватки памяти были выделены на текущем узле. Каждому событию
numa_miss
соответствует событиеnuma_foreign
на другом узле. - numa_foreign
- Число страниц, выделенных на другом узле, которые изначально были предназначены для текущего узла. Каждому событию
numa_foreign
соответствует событиеnuma_miss
на другом узле. - interleave_hit
- Число успешно выделенных страниц с использованием чередования.
- local_node
- Число успешно выделенных страниц памяти для локального процесса.
- other_node
- Число страниц, выделенных на этом узле процессу, выполняемому на другом узле.
-c
- Компактное представление таблицы данных. Обычно используется при наличии большого числа узлов NUMA, однако ширину столбцов и расстояние между ними предсказать невозможно. Размер памяти будет округляться до ближайшего мегабайта.
-m
- Возвращает статистику памяти для каждого узла. Формат аналогичен
/proc/meminfo
. -n
- Возвращает ту же информацию что и исходная версия
numastat
(numa_hit, numa_miss, numa_foreign, interleave_hit, local_node, other_node) в обновленном формате с использованием мегабайт в качестве единиц измерения. -p шаблон
- Возвращает информацию о распределении памяти в соответствии с заданным шаблоном. Если шаблон содержит цифры, numastat интерпретирует их как идентификатор процесса. В противном случае numastat будет искать совпадение в строках команд.За параметром
-p
следуют дополнительные фильтры. -s
- Сортировка результатов по убыванию, то есть процессы, потребляющие больше всего ресурсов в соответствии с содержимым столбца
total
, будут приведены в начале списка.Если дополнительно указать узел, таблица будет отсортирована по узлам. Пример:numastat -s2
Параметр и значение не должны разделяться пробелом. -v
- Подробный вывод.
-V
- Возвращает версию numastat.
-z
- Исключает строки и столбцы с нулевыми значениями. При этом значения, которые округляются до нуля, не будут отфильтрованы.
4.1.4. numad
/proc
и пытается поместить критические процессы на узлы со свободными ресурсами, где производительность будет максимальна. Минимальные требования составляют 50% ресурсов одного процессора и 300 МБ памяти. Необходимый уровень производительности поддерживается за счет переноса процессов между узлами NUMA по мере освобождения их ресурсов.
-w
на справочной странице man numad
.
4.1.4.1. Достоинства numad
4.1.4.2. Режимы работы
Примечание
- служба,
- исполняемый модуль.
4.1.4.2.1. numad как служба
# service numad start
# chkconfig numad on
4.1.4.2.2. numad как исполняемый модуль
# numad
/var/log/numad.log
.
# numad -S 0 -p PID
-p PID
- Добавляет заданный процесс в список обработки. Добавленный процесс будет обработан, только если он удовлетворяет минимальным требованиям обслуживания.
-S режим
- Параметр
-S
определяет режим проверки процессов. Так, значение0
ограничивает управление процессами, включенными в список обработки.
# numad -i 0
man numad
.
4.2. Планирование занятости процессоров
- Планирование в реальном времени
- SCHED_FIFO
- SCHED_RR
- Стандартное планирование
- SCHED_OTHER
- SCHED_BATCH
- SCHED_IDLE
4.2.1. Планирование в реальном времени
SCHED_FIFO
- Это правило присваивает потокам фиксированный приоритет от 1 до 99. Планировщик проверяет список потоков SCHED_FIFO и запускает поток с наивысшим приоритетом. Поток будет выполняться до тех пор, пока не завершит работу или не будет вытеснен другим потоком с более высоким приоритетом.Даже потоки с наименьшим приоритетом будут выполняться до потоков других типов. При наличии единственного потока, работающего в реальном времени, значение
SCHED_FIFO
будет игнорироваться. SCHED_RR
- Это циклический вариант правила
SCHED_FIFO
. Потокам также присваивается приоритет от 1 до 99, и потоки с одинаковым приоритетом будут последовательно выполняться в рамках выделенного интервала. Пользователь не может изменить интервал, но может его узнать при помощиsched_rr_get_interval(2)
. Обычно это правило применяется при наличии потоков с одинаковым приоритетом.
SCHED_FIFO
будут выполняться до тех пор, пока они не завершат работу или не будут вытеснены другими потоками с более высоким приоритетом. Не рекомендуется присваивать значение 99, так как высокий приоритет обычно имеют процессы миграции и мониторинга. Если они будут вытеснены другими процессами, это может привести к блокированию в однопроцессорных системах.
SCHED_FIFO
также предусматривает механизм ограничения, который предотвращает монопольное использование процессорных ресурсов. Его конфигурацию можно изменить с помощью:
/proc/sys/kernel/sched_rt_period_us
- Интервал времени в микросекундах, характеризующий 100% полосы пропускания. По умолчанию равен 1000000 мкс (1 сек.).
/proc/sys/kernel/sched_rt_runtime_us
- Интервал выполнения потоков реального времени (в микросекундах). По умолчанию равен 950000 мкс, что эквивалентно 0.95 сек.
4.2.2. Стандартное планирование
SCHED_OTHER
, SCHED_BATCH
и SCHED_IDLE
. При этом SCHED_BATCH
и SCHED_IDLE
предназначены для задач с низким приоритетом и подробно рассматриваться не будут.
SCHED_OTHER
илиSCHED_NORMAL
- Используется по умолчанию. Распределение ресурсов осуществляется при помощи планировщика CFS (Completely Fair Scheduler), который приоритизирует потоки в зависимости от значения
niceness
(более подробно об этом рассказывается в руководстве по развертыванию). Несмотря на то что пользователь в определенной мере может управлять приоритетом, его динамическое изменение возможно только при помощи CFS.
4.2.3. Выбор стратегии
SCHED_OTHER
и позволить системе управлять процессорными ресурсами самостоятельно.
SCHED_FIFO
. При обработке небольшого числа потоков оптимальной производительности можно достичь, выделив для их обслуживания отдельный узел NUMA.
4.3. Обработка запросов прерываний
/proc/interrupts
содержит статистику прерываний: номер прерывания, число прерываний этого типа, полученных каждым процессорным ядром, тип прерывания и список драйверов, обрабатывающих это прерывание. Подробную информацию можно найти на справочной странице man 5 proc
.
smp_affinity
, определяющий ядра, которые будут принимать участие в обслуживании. Его значение можно корректировать с целью улучшения производительности, привязывая прерывания и потоки к одним и тем же ядрам.
smp_affinity
определяется в /proc/irq/номер_прерывания/smp_affinity
в шестнадцатеричном формате. Для его просмотра и изменения необходимы права root.
# grep eth0 /proc/interrupts 32: 0 140 45 850264 PCI-MSI-edge eth0
smp_affinity
:
# cat /proc/irq/32/smp_affinity f
f
означает, что прерывание может обслуживаться на любом процессоре. Ниже этому параметру будет присвоено значение 1
, то есть прерывание будет обслуживаться на процессоре 0.
# echo 1 >/proc/irq/32/smp_affinity # cat /proc/irq/32/smp_affinity 1
# cat /proc/irq/40/smp_affinity ffffffff,ffffffff
smp_affinity
, ограничивающий обслуживание прерывания 40 последними 32 ядрами в 64-ядерной системе:
# echo 0xffffffff,00000000 > /proc/irq/40/smp_affinity # cat /proc/irq/40/smp_affinity ffffffff,00000000
Примечание
4.4. NUMA в Red Hat Enterprise Linux 6
4.4.1. Масштабирование
4.4.1.1. Топология
- Определение топологии во время загрузки
- Получение информации об оборудовании, включая сведения о логических процессорах, гиперпотоках, ядрах, сокетах, узлах NUMA и времени сообщения между узлами.
- Планировщик CFS
- Новый режим планирования обеспечивает равномерное распределение процессорных ресурсов. В комбинации с определением топологии это позволяет планировать выполнение процессов на ядрах в пределах одного сокета, исключая необходимость обращения к другим сокетам и сохраняя содержимое кэша.
malloc
malloc
теперь оптимизирует выделение памяти, предпочитая выбирать фрагменты, расположенные как можно ближе к ядру, на котором выполняется процесс.- Выделение памяти буферу skbuff
- Также оптимизирует выделение памяти, предпочитая выбирать фрагменты, расположенные как можно ближе к ядру, обслуживающему прерывания.
- Привязка прерываний устройств
- Драйверы устройств регистрируют информацию о процессорах, обрабатывающих прерывания. В дальнейшем можно ограничить их обслуживание процессорами одного сокета, что позволит поддерживать состояние кэша и уменьшая необходимость сообщения между разными сокетами.
4.4.1.2. Синхронизация в многопроцессорном окружении
- Блокировка RCU (Read-Copy-Update)
- Обычно приблизительно 90% блокировок обслуживают операции чтения. Блокировка RCU исключает необходимость получения эксклюзивного доступа для чтения. Этот режим используется при выделении страниц из кэша.
- Алгоритмы распределения памяти процессоров и сокетов
- Многие алгоритмы были обновлены и позволяют точно координировать работу процессорных ядер в одном сокете. Вместо спин-блокировок теперь используются методы индивидуального блокирования сокетов, а обновленные карты выделения памяти и списки страниц позволяют более эффективно использовать структуры карт данных.
4.4.2. Виртуализация
- Привязка процессоров
- С целью оптимизации использования локального кэша и сокращения числа обращений к удаленной памяти виртуальные системы могут быть привязаны к конкретному сокету.
- Большие страницы THP
- Использование больших страниц (Hugepages) позволяет сократить конкуренцию блокировок и уменьшить число операций управления памятью в буфере трансляции адресов (TLB, Translation Lookaside Buffer), что может повысить производительность виртуальных машин на 20%.
- Ввод-вывод на уровне ядра
- Подсистема ввода-вывода для виртуальных систем теперь реализована на уровне ядра, что значительно сокращает взаимодействие между узлами и время на переключение контекста и синхронизацию.
Глава 5. Память
5.1. HugeTLB
/usr/share/doc/kernel-doc-версия/Documentation/vm/hugetlbpage.txt
5.2. Увеличение размера страниц
- увеличение числа записей в модуле управления памятью;
- увеличение размера страниц.
5.3. Профилирование памяти при помощи Valgrind
valgrind --tool=утилита программа
memcheck
, massif
, cachegrind
. Следом за утилитой введите имя анализируемой программы. В режиме диагностики программа выполняется намного медленнее.
man valgrind
, а также в файлах:
/usr/share/doc/valgrind-версия/valgrind_manual.pdf
/usr/share/doc/valgrind-версия/html/index.html
.
5.3.1. Memcheck
valgrind
не содержит параметр --tool
, по умолчанию будет выбрана утилита memcheck
. Memcheck поможет обнаружить те ошибки, которые другие инструменты не могут диагностировать, включая использование неопределенных и неинициализированных значений, некорректное освобождение памяти кучи, пересечение указателей и утечки памяти. Во время диагностики программы будут работать в 10-30 раз медленнее.
/usr/share/doc/valgrind-version/valgrind_manual.pdf
.
--leak-check
- Поиск утечек памяти после завершения программы клиента. По умолчанию имеет значение
summary
и возвращает число обнаруженных утечек. Другие значения включаютyes
иfull
, и возвращают информацию об индивидуальных утечках, аno
отключает проверку. --undef-value-errors
yes
включает сообщения об ошибках для неинициализированных значений, аno
их отключает.--ignore-ranges
- Игнорируемые диапазоны. Пример:
--ignore-ranges=0xPP-0xQQ,0xRR-0xSS
.
/usr/share/doc/valgrind-версия/valgrind_manual.pdf
.
5.3.2. Cachegrind
# valgrind --tool=cachegrind программа
- чтение кэша инструкциями первого уровня и промахи чтения;
- чтение кэша и памяти, промахи чтения, промахи чтения кэша последнего уровня;
- запись в кэш и память, промахи записи, промахи записи в кэш последнего уровня;
- выполненные и неверно предсказанные условные ветвления:
- выполненные и неверно предсказанные непрямые переходы.
cachegrind.out.PID
(pid — идентификатор тестируемого процесса). Для анализа этого файла используется cg_annotate:
# cg_annotate cachegrind.out.PID
Примечание
# cg_diff первый_профиль второй_профиль
--I1
- Размер, ассоциативность, размер строк кэша инструкций первого уровня. Формат:
--I1=размер,ассоциативность,размер_строк
. --D1
- Размер, ассоциативность, размер строк кэша данных первого уровня. Формат:
--I1=размер,ассоциативность,размер_строк
. --LL
- Размер, ассоциативность, размер строк кэша последнего уровня. Формат:
--I1=размер,ассоциативность,размер_строк
. --cache-sim
- Включает и отключает сбор статистики попадания и промахов кэша. По умолчанию используется значение
yes
.Отключение обоих параметров--cache-sim
и--branch-sim
отменит сбор статистики. --branch-sim
- Включает и отключает сбор статистики об инструкциях ветвления и числе неверных предсказаний. По умолчанию используется значение
no
, так как подобный анализ замедляет Cachegrind примерно на 25%.Одновременное отключение параметров--cache-sim
и--branch-sim
полностью отменит сбор статистики.
/usr/share/doc/valgrind-версия/valgrind_manual.pdf
.
5.3.3. Massif
# valgrind --tool=massif программа
massif.out.pid
, где pid — идентификатор тестируемого процесса.
ms_print
генерирует график выделения памяти:
# ms_print massif.out.PID
--heap
- Включает и отключает сбор статистики памяти кучи. Возможные значения —
yes
(по умолчанию) иno
. --heap-admin
- Определяет размер административного блока в байтах (по умолчанию
8
). --stacks
- Включает и отключает сбор статистики стека. Возможные значения —
yes
иno
(по умолчанию). Активация этой возможности значительно замедляет работу Massif. Изначально подразумевается, что стек имеет нулевой размер, что облегчает определение размера секции стека, используемой программой. --time-unit
- Задает единицы времени. Доступные значения:
i
(по выполненным инструкциям, используется по умолчанию),ms
(в миллисекундах) иB
(в байтах). Этот параметр определяет формат единиц на графикеms_print
.
/usr/share/doc/valgrind-версия/valgrind_manual.pdf
.
5.4. Параметры производительности в /proc
overcommit_memory
значение 1
, выполните:
# echo 1 > /proc/sys/vm/overcommit_memory
sysctl
переопределяет параметры с сохранением результатов. За дальнейшей информацией обратитесь к руководству по развертыванию по адресу http://access.redhat.com/site/documentation/Red_Hat_Enterprise_Linux/.
Параметры памяти
/proc/sys/vm/
.
overcommit_memory
- Определяет условия разрешения и отказа запросов больших объемов памяти. Возможные значения:
0
(по умолчанию) — ядро использует эвристический алгоритм для расчета перерасхода памяти, принимая во внимание объем доступной памяти и число неверных запросов. Но поскольку выделение памяти осуществляется на основе эвристического, а не точного алгоритма, это может привести к превышению допустимой нагрузки на память.1
— ядро не обрабатывает перерасход памяти. При этом вероятность превышения нагрузки на память возрастает, но в то же время увеличивается производительность задач, активно использующих память.2
— отказ обработки запросов, запрашивающих память, размер которой превышает суммарный размер памяти пространства подкачки и ОЗУ в соответствии сovercommit_ratio
.Примечание
Этот параметр должен использоваться в только в тех системах, где размер пространства подкачки превышает общий размер физической памяти.
overcommit_ratio
- Если
overcommit_memory
равен2
, определяет процентную часть физической памяти (см. описаниеovercommit_memory
). По умолчанию равен50
. max_map_count
- Максимальное число регионов памяти, доступных процессу. По умолчанию равно
65530
. nr_hugepages
- Число страниц большого размера. По умолчанию равно 0. Выделение больших страниц возможно только при наличии достаточного числа следующих друг за другом свободных страниц. Зарезервированные этим параметром страницы не могут использоваться для других целей. За дальнейшей информацией обратитесь к документации в
/usr/share/doc/kernel-doc-версия_ядра/Documentation/vm/hugetlbpage.txt
Параметры ядра
/proc/sys/kernel/
.
msgmax
- Максимальный размер сообщения в очереди (в байтах). По умолчанию равен
65536
. Это значение не может превышаетmsgmnb
. msgmnb
- Максимальный размер очереди сообщений (в байтах). По умолчанию равен
65536
. msgmni
- Максимальное число идентификаторов очередей сообщений (число очередей). Для 64-разрядной архитектуры по умолчанию равно
1985
, а для 32-разрядной —1736
. shmall
- Размер общей памяти (в байтах), которая может быть использоваться в заданный момент. Для 64-разрядной архитектуры по умолчанию равен
4294967296
, а для 32-разрядной —268435456
. shmmax
- Максимальный размер сегмента общей памяти (в байтах). Для 64-разрядной архитектуры по умолчанию равен
68719476736
, а для 32-разрядной —4294967295
. shmmni
- Максимальное число совместно используемых сегментов памяти. По умолчанию равно
4096
. threads-max
- Максимальное число одновременно выполняемых потоков. По умолчанию эквивалентно
max_threads
. Формула расчета:max_threads = mempages / (8 * РАЗМЕР_ПОТОКА / РАЗМЕР_СТРАНИЦЫ )
Минимальное значениеthreads-max
равно20
.
Параметры файловой системы
/proc/sys/fs/
.
aio-max-nr
- Максимальное число событий в асинхронных контекстах ввода-вывода. По умолчанию равно
65536
. При изменении этого значения размеры структур данных ядра не изменяются автоматически. file-max
- Возвращает максимальное число дескрипторов файлов в ядре. По умолчанию эквивалентно
files_stat.max_files
, в качестве значения которого выбирается большее из двух —(mempages * (РАЗМЕР_СТРАНИЦЫ / 1024)) / 10
илиNR_FILE
(8192 в Red Hat Enterprise Linux). Увеличение этого значения может уменьшить вероятность ошибок, связанных с нехваткой дескрипторов файлов.
Параметры обработки нехватки памяти
/proc/sys/vm/panic_on_oom
значение 0
, что вызовет функцию oom_killer
при нехватке памяти, которая остановит несанкционированные процессы.
oom_killer
будет останавливать. Он размещается в /proc/PID/
(PID — идентификатор процесса).
oom_adj
- Значение в диапазоне от
-16
до15
определяетoom_score
процесса. Чем большеoom_score
, тем больше вероятность того, чтоoom_killer
остановит процесс. Значение-17
отключаетoom_killer
для процесса.Важно
Дочерние процессы наследуютoom_score
родительского процесса. Так, например, еслиsshd
не используетoom_killer
, то процессы, запущенные в рамках его сеанса, также не будут использовать. Это может иметь отрицательный эффект, так какoom_killer
не сможет освободить память таких процессов.
5.5. Виртуальная память
swappiness
- Значение от 0 до 100 определяет процент подкачки. Высокие значения означают, что предпочтение будет отдаваться производительности системы, агрессивно подкачивая страницы из физической памяти. Низкие значения избегают подкачки с целью уменьшения задержки обслуживания. По умолчанию равно
60
. min_free_kbytes
- Минимальный размер свободной памяти (в килобайтах). При достижении этого порога начнут выделяться резервные страницы.
Предупреждение
Порог не должен быть слишком высоким или слишком низким.Слишком низкое значениеmin_free_kbytes
будет препятствовать освобождению памяти, что завершится зависанием системы и остановкой множества процессов.В то же время слишком высокий порог (5-10% системной памяти) быстро приведет к нехватке памяти. Linux обычно использует всю доступную оперативную память для кэширования данных файловой системы, а высокий порог означает, что на освобождение памяти будет тратится слишком много времени. dirty_ratio
- Процент «грязных» данных по отношению к общему размеру памяти, при достижении которого начнется их запись (при помощи pdflush). По умолчанию равно
20
процентам. dirty_background_ratio
- Процент «грязных» данных по отношению к общему размеру памяти, при достижении которого начнется их запись в фоновом режиме (при помощи pdflush). По умолчанию равно
10
процентам. drop_caches
- Очищает кэш, тем самым освобождая память. Допустимые значения:
- 1
- Освобождает память кэша страниц.
- 2
- Освобождает память кэша индексных дескрипторов и записей каталогов.
- 3
- Освобождает память всех вышеперечисленных типов.
Эта операция не является разрушающей. Так как «грязные» объекты не освобождают память, предварительно рекомендуется выполнитьsync
.Важно
Не рекомендуется освобождать память с помощьюdrop_caches
в критических окружениях.
swappiness
значение 50
, выполните:
# echo 50 > /proc/sys/vm/swappiness
sysctl
переопределяет параметры с сохранением результатов. За дальнейшей информацией обратитесь к руководству по развертыванию по адресу http://access.redhat.com/site/documentation/Red_Hat_Enterprise_Linux/.
Глава 6. Ввод-вывод
6.1. Характеристики
- Твердотельные накопители (SSD, Solid State Disks) теперь определяются автоматически, что положительно сказывается на производительности планировщика ввода-вывода в силу эффективного использования высокоскоростного ввода-вывода SSD-дисков.
- Ядро теперь поддерживает освобождение блоков при удалении файлов, что позволяет передавать информацию о незанятых блоках накопителю. Это увеличивает эффективность работы накопителей, поддерживающих инициализацию логических блоков (виртуальную адресацию) за счет более точного контроля используемого пространства.
- Улучшена производительность барьеров файловой системы.
- Вместо
pdflush
теперь используются потоки очистки отдельных устройств, что значительно облегчает масштабирование в схемах с большим количеством LUN.
6.2. Анализ

Рисунок 6.1. Вывод aio-stress для 1 потока и 1 файла
- aio-stress,
- iozone,
- fio.
6.3. Инструменты
si
(в пространство подкачки), so
(из пространства подкачки), bi
(в блочное устройство), bo
(из блочного устройства), wa
(время ожидания). si
и so
служат индикаторами нагрузки на память, особенно если пространство подкачки расположено на том же устройстве что и раздел данных. si
и bi
содержат информацию об операциях чтения, а so
и bo
об операциях записи. В качестве единиц измерения используются килобайты. wa
возвращает время простоя и сообщает, какая часть очереди ожидает завершения операции ввода-вывода.
cache
и bo
увеличиваются, после чего cache
уменьшается, а free
увеличивается, это означает, что система осуществляет запись и освобождает кэш страниц.
avgqu-sz
) поможет оценить производительность. Так, если средний размер очереди равен 1, а размер запросов — 4 КБ, производительность не может быть высокой.
8,64 3 1 0.000000000 4162 Q RM 73992 + 8 [fs_mark] 8,64 3 0 0.000012707 0 m N cfq4162S / alloced 8,64 3 2 0.000013433 4162 G RM 73992 + 8 [fs_mark] 8,64 3 3 0.000015813 4162 P N [fs_mark] 8,64 3 4 0.000017347 4162 I R 73992 + 8 [fs_mark] 8,64 3 0 0.000018632 0 m N cfq4162S / insert_request 8,64 3 0 0.000019655 0 m N cfq4162S / add_to_rr 8,64 3 0 0.000021945 0 m N cfq4162S / idle=0 8,64 3 5 0.000023460 4162 U N [fs_mark] 1 8,64 3 0 0.000025761 0 m N cfq workload slice:300 8,64 3 0 0.000027137 0 m N cfq4162S / set_active wl_prio:0 wl_type:2 8,64 3 0 0.000028588 0 m N cfq4162S / fifo=(null) 8,64 3 0 0.000029468 0 m N cfq4162S / dispatch_insert 8,64 3 0 0.000031359 0 m N cfq4162S / dispatched a request 8,64 3 0 0.000032306 0 m N cfq4162S / activate rq, drv=1 8,64 3 6 0.000032735 4162 D R 73992 + 8 [fs_mark] 8,64 1 1 0.004276637 0 C R 73992 + 8 [0]
Total (sde): Reads Queued: 19, 76KiB Writes Queued: 142,183, 568,732KiB Read Dispatches: 19, 76KiB Write Dispatches: 25,440, 568,732KiB Reads Requeued: 0 Writes Requeued: 125 Reads Completed: 19, 76KiB Writes Completed: 25,315, 568,732KiB Read Merges: 0, 0KiB Write Merges: 116,868, 467,472KiB IO unplugs: 20,087 Timer unplugs: 0
- Q — запросы к блочному устройству поставлены в очередь;
- G — запрос получен;Полученный запрос не может быть объединен с существующим и будет обслуживаться отдельно.
- M — запрос объединен с существующим.
- I — запрос добавлен в очередь к устройству;
- D — запрос передан устройству;
- C — запрос обработан;
- P — очередь к блочному устройству закрыта с целью объединения запросов;
- U — очередь к блочному устройству открыта, передача составных запросов устройству разрешена.
- Q2Q — интервал передачи запросов блочной подсистеме;
- Q2G — время от добавления операции в очередь блочного ввода-вывода до выдачи запроса обслуживания;
- G2I — время от выдачи запроса до его добавления в очередь устройства;
- Q2M — время с момента добавления операции в очередь блочного ввода-вывода до его слияния с существующим запросом;
- I2D — время нахождения запроса в очереди устройства (с момента поступления запроса в очередь до его передачи устройству);
- M2D — время с момента слияния запросов до их передачи устройству;
- D2C — время обслуживания запроса устройством;
- Q2C — общее время нахождения запроса в блочной подсистеме.

Рисунок 6.2. Пример вывода seekwatcher
6.4. Планировщики
6.4.1. CFQ
ionice
или программно с помощью ioprio_set
. По умолчанию процессы обслуживаются в порядке очереди (best effort). Процессы классов RT и BE дополнительно могут иметь приоритет от 0 до 7 (чем меньше значение, тем выше приоритет). Процессы класса RT имеют наивысший приоритет, поэтому нужно его использовать с большой осторожностью, потому что это может значительно ограничить время обслуживания менее приоритетных процессов. Процессы BE имеют приоритет 4. Бездействующие процессы (idle) обслуживаются в последнюю очередь.
/sys/block/устройство/queue/iosched/
.
slice_idle = 0 quantum = 64 group_idle = 1
group_idle
=1, вероятность простоев не исключена, но это будет происходить намного реже.
Параметры
back_seek_max
- Обратный поиск характеризуется более длительными задержками и негативно влияет на производительность. Этот параметр ограничивает расстояние для обратного поиска (в килобайтах). По умолчанию составляет
16
КБ. back_seek_penalty
- Так как обратный поиск характеризуется низкой эффективностью, за его выполнение будет назначаться штраф. Представим, например, что головка диска расположена на позиции 1024 КБ, а очередь обслуживания содержит два запроса — к позициям 1008 КБ и 1040 КБ. Оба запроса одинаково удалены от текущего расположения. Однако с учетом штрафа на обратный поиск (по умолчанию 2), запрос обращения к позиции 1040 КБ будет выполнен первым.
fifo_expire_async
- Максимальное время ожидания обслуживания асинхронной записи (через буфер). По умолчанию равно
250
миллисекундам. После его истечения один запрос будет перенесен в очередь для передачи. fifo_expire_sync
- Аналогично
fifo_expire_async
, но для синхронных запросов. По умолчанию равно125
мс. group_idle
- Переводит CFQ в режим ожидания после обслуживания последнего процесса в cgroup. Должен быть равен
1
при использовании равноценных групп cgroup, и при этомslice_idle
равен0
. group_isolation
1
включает изоляцию групп, даже если при этом пострадает производительность. Изоляция групп позволяет равномерно обрабатывать нагрузку, которая поступает последовательно и случайно. Если изоляция отключена (0
), нагрузка будет обрабатываться последовательно. Подробную информацию можно найти вDocumentation/cgroups/blkio-controller.txt
.low_latency
- Если равно
1
(по умолчанию), CFQ предоставляет процессам максимальное время ожидания (300 миллисекунд). Это позволяет обслуживать запросы более равномерно, но за счет снижения скорости. Значение0
отключает ожидание. quantum
- Этот параметр контролирует число запросов ввода-вывода, передаваемых хранилищу за один раз, и тем самым ограничивает длину очереди. По умолчанию равен
8
. Следует соблюдать осторожность при увеличении значения, так как это может отрицательно повлиять на производительность при высоких уровнях нагрузки. slice_async
- Контролирует интервал времени, предоставляемый процессам, запрашивающим асинхронный ввод-вывод. По умолчанию равен
40
миллисекундам. slice_idle
- Определяет время ожидания поступления запросов. В Red Hat Enterprise Linux 6.1 и предыдущих выпусках равно
8
миллисекундам, а начиная с Red Hat Enterprise Linux 6.2 —0
. Нулевое значение может ухудшить производительность внешних RAID-накопителей, так как возрастет общее число операций поиска. Для других типов накопителей рекомендуется использовать положительное значение. slice_sync
- Контролирует интервал времени, предоставляемый процессам, запрашивающиму синхронный вводв-вывод. По умолчанию равен
100
миллисекундам.
6.4.2. Deadline
Параметры
fifo_batch
- Число операций чтения и записи в пакете. По умолчанию равно
16
. Увеличение значения может улучшить производительность, но и увеличить задержку. front_merges
- Значение
0
может быть присвоено, если вы уверены, что уровень нагрузки не будет требовать объединения запросов в начале очереди. В противном случае рекомендуется оставить1
. read_expire
- Максимальное время ожидания обслуживания запроса чтения (в миллисекундах). По умолчанию равно
500
мс. write_expire
- Максимальное время ожидания обслуживания запроса записи (в миллисекундах). По умолчанию равно
5000
мс. writes_starved
- Определяет приоритет операций чтения, то есть число пакетов чтения, которые будут обслужены, прежде чем будет обработан пакет записи.
6.4.3. Noop
Параметры в /sys/block/sdX/queue
- add_random
- В некоторых случаях издержки обслуживания ввода-вывода для
/dev/random
измеримы. Тогда этот параметр рекомендуется обнулить. max_sectors_kb
- Этот параметр изменяет максимальный размер запроса и по умолчанию составляет
512
килобайт. Минимально допустимый размер ограничивается размером логического блока, а максимальный размер ограничивается значениемmax_hw_sectors_kb
. Производительность некоторых SSD-дисков может снизиться, если размер запросов превышает размер внутренних блоков SSD. В таких случаях рекомендуется уменьшить значениеmax_hw_sectors_kb
до размера блока. Производительность на этом уровне можно протестировать с помощью iozone и aio-stress, изменяя размер записи, например с512
Б до1
МБ. nomerges
- Отключает слияние запросов, что используется для отладки. Слияние запросов способствует улучшению производительности, но его отключение поможет оценить число операций ввода-вывода, которое может быть обработано без необходимости отключения предварительного чтения или выполнения случайного ввода-вывода.
nr_requests
- Число запросов чтения или записи в очереди. По умолчанию равно
128
, то есть очередь может содержать 128 запросов чтения и 128 запросов записи. Если очередь заполнена, процесс перейдет в состояние ожидания, а при освобождении места в очереди он будет пробужден.При проектировании приложений, чувствительных к задержкам, рекомендуется уменьшитьnr_requests
, тем самым ограничив длину очереди команд. После выделения числа запросов, определенных параметромnr_requests
, процессы, все еще ожидающие обслуживания, будут переведены в состояние ожидания. Это обеспечивает их равномерное обслуживание и не позволяет одному процессу использовать все ресурсы. optimal_io_size
- Иногда накопители предоставляют информацию об оптимальном размере сегмента ввода-вывода. Это типично для программных и аппаратных RAID, где оптимальный размер равен размеру сегмента чередования. Следует придерживаться значений, кратных рекомендуемым.
read_ahead_kb
- Если приложение осуществляет чтение данных из файлов последовательно, операционная система может использовать алгоритм упреждения чтения. Этот алгоритм считывает больше данных, чем было запрошено, и помещает их в кэш, что экономит время на обращение к диску. Недостаток этого подхода состоит в том, что существует вероятность того, что данные не понадобятся, но они уже занимают место в кэше и будут вытеснены только тогда, когда нагрузка на память возрастет. В свою очередь, при наличии нескольких подобных процессов нагрузка на память возрастает значительно быстрее.Для многопутевых устройств рекомендуется увеличить это значение, например до
8192
килобайт, так как они обычно включают в свой состав несколько физических устройств. Для начала можно присвоитьread_ahead_kb
значение128
и корректировать его по мере необходимости. rotational
- SSD-диски не используют вращающиеся пластины в отличие от традиционных жестких дисков. Если устройство не определяет флаг, сообщающий о наличии движущихся деталей, может потребоваться обнулить параметр
rotational
вручную. Нулевое значение отключает использование алгоритмов снижения времени поиска данных, так как SSD-диски в этом не нуждаются. rq_affinity
- Значение
1
принуждает обработку операций на том же процессоре, где они были сгенерированы. Это может повысить эффективность кэширования данных.
Глава 7. Файловые системы
7.1. Характеристики производительности файловых систем
7.1.1. Параметры форматирования
Размер блока может быть задан на стадии mkfs
. При этом верхний предел определяется максимальным размером страниц, а нижний предел зависит от типа файловой системы. Обычно стандартного размера должно быть достаточно.
Если в основе системы лежат дисковые массивы (например, RAID5), производительность может быть улучшена за счет выравнивания метаданных в соответствии с геометрией массива. Для программных RAID-массивов (LVM и MD) это будет сделано автоматически, в то время как в других ситуациях администратор должен будет определить геометрию вручную в строке команды mkfs
.
В файловых системах с журналированием (ext4 и XFS) при интенсивном чтении и записи метаданных обращение к журналам возрастает. Чтобы сократить время поиска, можно разместить журнал на отдельном накопителе. Однако если его скорость меньше скорости диска файловой системы, выигрыш будет минимален.
Предупреждение
mkfs
, а устройства журналов определяются во время монтирования. За подробной информацией обратитесь к справочным страницам mke2fs(8)
, mkfs.xfs(8)
и mount(8)
.
7.1.2. Параметры монтирования
Барьер записи — механизм ядра, отвечающий за порядок записи метаданных. При отключении энергии файловые системы с барьерами сохраняют состояние данных, переданных при помощи fsync()
. Red Hat Enterprise Linux включает барьеры по умолчанию.
fsync()
или часто создают и удаляют небольшие файлы. Для стабильных накопителей, не использующих непостоянный кэш, а также для некритичных приложений функциональность барьеров можно отключить с помощью параметра nobarrier
. Более подробно об этом рассказывается в руководстве по управлению накопителями.
Обычно время доступа для чтения файлов (atime
) можно изменить в метаданных дескриптора inode, что требует выполнения дополнительной операции записи. Если нет необходимости в точном определении atime
, при монтировании файловой системы можно добавить параметр noatime
. В большинстве случаев, однако, atime
не добавляет значительную задержку, так в ядре Red Hat Enterprise Linux 6 уже по умолчанию включен режим relatime
. В этом режиме atime
будет обновляться , если предыдущее время доступа меньше времени изменения файла (mtime
) или времени изменения статуса (ctime
).
Примечание
noatime
будет автоматически включен параметр nodiratime
, поэтому отдельно его устанавливать не требуется.
Упреждающее чтение ускоряет доступ за счет предварительного чтения данных и размещения их в кэше страниц. При интенсивной нагрузке это может значительно улучшить производительность.
# blockdev -getra устройство
# blockdev -setra N устройство
blockdev
значение не будет сохраняться между перезагрузками. Рекомендуется создать сценарий init.d
, чтобы восстановить его при запуске системы.
7.1.3. Обслуживание файловой системы
Блоки, не используемые файловой системой, можно освободить. Это помогает освободить пространство в файловых системах на SSD-дисках и в динамически созданных томах.
fstrim
удаляет неиспользуемые блоки в соответствии с заданными критериями. Эти операции можно использовать в файловых системах XFS и ext4 в версиях Red Hat Enterprise Linux 6.2 и выше при условии, что они поддерживаются на уровне физических устройств. Параметр /sys/block/устройство/queue/discard_max_bytes
поможет это проверить: если его значение не равно нулю, удаление поддерживается.
-o discard
(или указать его в строке команды mount
в /etc/fstab
). Удаление будет выполняться без участия пользователя. Блоки, переходящие из занятого состояние в свободное, будут автоматически удаляться в ext4 (начиная с Red Hat Enterprise Linux 6.2) и в XFS (начиная с Red Hat Enterprise Linux 6.4).
7.1.4. Производительность приложений
Файловые системы ext4, XFS позволяют заранее выделить пространство при помощи вызова fallocate(2)
. Это поможет уменьшить фрагментацию, тем самым улучшив производительность. fallocate(2)
отмечает заданный диапазон как выделенный и инициализирует его нулями.
7.2. Профили производительности
latency-performance
- Профиль для коррекции задержки ответа сервера. Отключает механизмы tuned и ktune, изменяет режим
cpuspeed
наperformance
. Для контроля дискового ввода-вывода используется планировщик с алгоритмом deadline. В качестве обязательного значенияcpu_dma_latency
используется0
. throughput-performance
- Профиль для коррекции производительности обработки данных. Рекомендуется при отсутствии доступа к большому хранилищу данных. Эквивалентно
latency-performance
за исключением:- Минимальный интервал
kernel.sched_min_granularity_ns
равен10
миллисекундам. - Значение
kernel.sched_wakeup_granularity_ns
равно15
миллисекундам. - Значение
vm.dirty_ratio
равно 40%. - Включены возможности прозрачного использования страниц большого размера.
enterprise-storage
- Этот профиль рекомендуется для конфигурации пространства данных для крупных серверов уровня предприятия, что включает защиту кэша за счет переключения на питание от батареи и управление кэшем на диске. Аналогичен профилю
throughput-performance
за исключением следующих факторов:- значение
readahead
равно4x
; - файловые системы, которые не являются корневыми и загрузочными, монтируются с параметром
barrier=0
.
man tuned-adm
и к руководству по управлению энергопотреблением на сайте http://access.redhat.com/site/documentation/Red_Hat_Enterprise_Linux/.
7.3. Файловые системы
7.3.1. Ext4
Примечание
В файловых системах большого размера инициализация таблиц inode в ходе работы mkfs.ext4
может занять длительное время. Параметр -E lazy_itable_init=1
может отложить его выполнение. При этом процессы ядра будут по-прежнему инициализировать файловую систему после ее монтирования. Скорость инициализации контролируется с помощью параметра -o init_itable=n
команды mount
. Значение n
по умолчанию равно 10
.
В некоторых случаях приложения не могут корректно выполнить синхронизацию fsync()
после переименования файла, его изменения или перезаписи; в таких случаях ext4 будет по умолчанию синхронизировать файлы. Операции fsync()
могут занимать много времени, поэтому не рекомендуется автоматически использовать этот вид синхронизации. Параметр -o noauto_da_alloc
команды mount
ее отключает, после чего синхронизацию надо будет выполнять вручную при помощи fsync()
.
Обычно операции обращения к журналам имеют более высокий приоритет по сравнению с обычным вводом-выводом. Параметр journal_ioprio=n
команды mount
контролирует это поведение. Допустимые значения включают от 0 до 7 (чем меньше значение, тем выше приоритет). По умолчанию journal_ioprio=3
.
mkfs.ext4(8)
, mount(8)
и в файле документации Documentation/filesystems/ext4.txt
для пакета kernel-doc.
7.3.2. XFS
mkfs
изменяют ширину дерева, что может изменить характеристики масштабирования подсистем.
7.3.2.1. Основы коррекции производительности XFS
mkfs.xfs
автоматически подберет размер сегмента чередования, но возможно, его надо будет определить вручную на аппаратных массивов.
inode64
. Исключение составляют файловые системы NFS-сервера и устаревшие 32-разрядные клиенты NFS, которым нужен доступ к файловой системе.
logbsize
рекомендуется присвоить значение 256 КБ (максимум). По умолчанию он равен MAX
(32 КБ).
7.3.2.2. Дополнительные функции коррекции производительности XFS
XFS косвенно накладывает ограничения на число файлов в файловой системе, но этот предел настолько высокий, что практически не может быть достигнут. Если заранее известно, что стандартного размера будет недостаточно, его можно увеличить с помощью mkfs.xfs
. В свою очередь, размер существующей файловой системы можно нарастить при помощи xfs_growfs
.
Размер блока каталогов имеет фиксированную величину, которая определяется в строке mkfs
, и не может быть изменен. Минимальный размер равен размеру блока файловой системы, который по умолчанию равен MAX
(4 КБ). Обычно в его уменьшении нет необходимости.
В отличие от других файловых систем, XFS может параллельно выполнять операции выделения и освобождения экстентов и дескрипторов inode при условии, что они выполняются в разных линейных группах.
XFS может хранить некоторые атрибуты в дескрипторе inode. Чтение и изменение таких атрибутов осуществляется вместе с чтением дескриптора и не требует дополнительных операций, что положительно сказывается на производительности.
Изменение метаданных со временем приводит к росту журнала, размер которого служит своего рода критерием в определении допустимой частоты их изменения. Дело в том, что ведение журналов осуществляется циклически, то есть прежде чем новые данные смогут быть добавлены в журнал, существующие данные должны быть сохранены на диск. Поиск несохраненной информации и ее запись занимает некоторое время. Исходный размер журнала зависит от размера файловой системы и обычно не нуждается в изменении.
mkfs
по умолчанию размещает журнал в начале сегмента чередования массива, на основе которого построена файловая система. В свою очередь, для аппаратных RAID-массивов эту информацию надо будет определить. Такое расположение журнала исключает необходимость выполнения лишних операций при записи изменений на диск.
logbsize
позволяет изменить размер буфера в памяти. По умолчанию он равен MAX
(32 КБ), а максимальный размер составляет 256 КБ. В большинстве случаев большой размер помогает улучшить производительность, но при интенсивном выполнении fsync буфер меньшего размера может оказаться эффективнее.
delaylog
уменьшает число операций записи в журнал, накапливая изменения и сохраняя их за один раз. Несмотря на то что этот подход требует больше памяти для хранения изменений и увеличивает риск их потери в случае сбоя, он значительно улучшает скорость изменения метаданных и облегчает масштабирование. Этот параметр не нарушает целостность метаданных при выполнении fsync
, fdatasync
и sync
.
7.4. Кластеризация
7.4.1. GFS 2
- Заранее выделить место для файлов и каталогов при помощи
fallocate
. - Минимизировать области, которые будут использоваться совместно. Например, если несколько узлов монтируют одну и ту же файловую систему, но обращаются к разным каталогам, перемещение одного каталога в другую файловую систему поможет улучшить производительность.
- Выбрать оптимальный размер и число групп ресурсов в зависимости от среднего размера файлов и свободного пространства в системе. Это определяет вероятность одновременного обращения узлов к группе ресурсов. Но следует помнить, что слишком большое число групп может замедлить выделение блоков, в то время как недостаточное их количество приведет к конкуренции во время освобождения блоков. Обычно эти характеристики подбираются экспериментальным путем.
- При выборе оборудования следует принимать во внимание требования файловой системы и особенности ввода-вывода кластерных узлов.
- Использовать SSD-диски.
- Подобрать размер файловой системы в соответствии с ожидаемым уровнем нагрузки таким образом, чтобы ее занятость не превышала 80%. Небольшие файловые системы не требуют много времени на проверку и резервное копирование, но при больших нагрузках подвергаются фрагментации.
- Для интенсивной нагрузки рекомендуется увеличить размер журналов. Несмотря на то что журналы будут использовать больше памяти, производительность улучшится, так как запись на диск будет осуществляться реже.
- Синхронизация часов на узлах GFS2 позволит избежать проблем в работе сетевых приложений. Для этой цели рекомендуется выбрать протокол NTP.
- Если время доступа к файлам и каталогам некритично, файловая система должна быть смонтирована с параметрами
noatime
иnodiratime
.Примечание
Для GFS2 рекомендуется выбратьnoatime
. - При наличии квот следует уменьшить частоту их синхронизации или предпочесть грубую синхронизацию.
Примечание
Нестрогие квоты допускают превышение заданного порога. Чтобы его минимизировать, GFS2 будет динамически сокращать интервал синхронизации по мере приближения к предельному значению.
Глава 8. Сетевое окружение
8.1. Производительность сети
8.1.1. RPS (Receive Packet Steering)
softirq
, поступающую в очередь rx
сетевой карты, между процессорами, что позволяет обслуживать запросы параллельно.
/sys/class/net/ethX/queues/rx-N/rps_cpus
, заменив ethX
именем сетевого устройства (например, eth1
, eth2
), а rx-N
обозначением очереди. Пакеты, поступающие в очередь rx-N
устройства ethX
, будут обрабатываться на заданных процессорах. При выборе процессоров следует учитывать схему привязки кэша[4].
8.1.2. RFS (Receive Flow Steering)
/proc/sys/net/core/rps_sock_flow_entries
- Максимальное число потоков, перенаправляемых заданному процессору. Это общесистемное значение.
/sys/class/net/ethX/queues/rx-N/rps_flow_cnt
- Максимальное число потоков, направляемых в очередь
rx-N
устройстваethX
. Общее число потоков не может превышать/proc/sys/net/core/rps_sock_flow_entries
.
8.1.3. Поддержка тонких потоков TCP в getsockopt
getsockopt
теперь поддерживает два новых флага:
- TCP_THIN_DUPACK
- Разрешает динамический переход в режим обработки тонких потоков после получения одного подтверждения dupACK.
- TCP_THIN_LINEAR_TIMEOUTS
- Включает динамический таймаут для тонких потоков.
file:///usr/share/doc/kernel-doc-версия/Documentation/networking/ip-sysctl.txt
и file:///usr/share/doc/kernel-doc-версия/Documentation/networking/tcp-thin.txt
.
8.1.4. Поддержка прозрачного прокси
file:///usr/share/doc/kernel-doc-версия/Documentation/networking/tproxy.txt
.
8.2. Оптимизация параметров сети
- netstat
- Утилита командной строки, возвращающая информацию о соединениях, таблицах маршрутизации, замаскированных подключениях, многоадресных схемах и статистику интерфейсов из
/proc/net/
./proc/net/dev
(информация об устройстве)/proc/net/tcp
(информация о TCP-сокете)/proc/net/unix
(информация о сокете домена Unix)
Подробную информацию можно найти на справочной страницеman netstat
. - dropwatch
- Утилита для отслеживания потери пакетов. Подробную информацию можно найти на справочной странице
man dropwatch
. - ip
- Утилита для управления и наблюдения за устройствами, правилами маршрутизации и туннелями. Подробную информацию можно найти на справочной странице
man ip
. - ethtool
- Утилита для просмотра и изменения настроек сетевой карты. Подробную информацию можно найти на справочной странице
man ethtool
. - /proc/net/snmp
- Содержит управляющую информацию IP, ICMP, TCP, UDP для агента
snmp
в формате ASCII.
/proc/net/snmp
служит знаком переполнения очереди сокетов.
8.2.1. Размер буфера сокета
- rmem_default
- Определяет размер буфера, который будет использоваться по умолчанию. Чтобы его изменить, выполните команду:
sysctl -w net.core.rmem_default=N
В этой командеN
— размер буфера в байтах. Значение установленного параметра можно получить из/proc/sys/net/core/rmem_default
. Стоит помнить, что стандартный размер не может быть большеrmem_max
(в/proc/sys/net/core/rmem_max
). Если же он должен быть больше текущего максимума, надо изменитьrmem_max
. - SO_RCVBUF
- Параметр сокета, определяющий размер буфера поступающих данных. Подробную информацию можно найти на справочной странице
man 7 socket
.Его значение можно просмотреть с помощьюgetsockopt
и изменить с помощьюsetsockopt
. Подробную информацию можно найти на справочной страницеman setsockopt
.
8.3. Обзор получения пакетов

Рисунок 8.1. Прохождение данных из сети
- Оборудование получает пакет. Сетевая карта получает пакет из сети. В зависимости от конфигурации драйвера он может быть помещен в буфер внутренней памяти устройства или в кольцевой буфер.
- Аппаратное прерывание. Сетевая карта генерирует запрос прерывания, после чего будет назначено программное прерывание.
- Программное прерывание. На этом этапе, собственно, и начинается процесс получения пакета в контексте
softirq
.Обслуживание прерывания на том же процессоре, где обрабатывается аппаратный запрос, минимизирует нагрузку. Ядро перемещает пакет из буфера в сетевой стек, откуда он может быть перенаправлен, удален или передан ожидающему сокету.Полученный сокетом пакет будет добавлен к приложению, привязанному к сокету. Этот процесс будет повторяться до тех пор, пока не будет достигнут пределdev_weight
, или до тех пор, пока буфер сетевой карты не будет освобожден (см. Раздел 8.4.1, «Буфер сетевой карты»). - Получение пакета приложением. Приложение извлекает пакет из очереди сокета при помощи вызовов POSIX (
read
,recv
,recvfrom
). На этом этапе данные удаляются из сетевого стека.
8.3.1. Привязка процессоров и кэша
8.4. Диагностика потерь пакетов
8.4.1. Буфер сетевой карты
softirq
. Опросить состояние очереди можно следующим образом:
ethtool -S ethX
ethX
именем устройства. Эта команда вернет число потерянных на ethX
пакетов, что обычно является следствием переполнения очереди.
- Входящий трафик
- Можно замедлить входящий трафик (добавить фильтры, уменьшить число многоадресных групп и т.п.)
- Длина очереди
- Можно увеличить длину очереди. При этом также потребуется увеличить число буферов в очереди. Для этого надо изменить параметры
rx
иtx
дляethX
:ethtool --set-ring ethX
Подробную информацию можно найти на справочной страницеman ethtool
. - Вес устройства
- Скорость освобождения очереди можно контролировать с помощью весового значения устройства. Вес определяет максимальное число пакетов, получаемых сетевой картой в контексте одного прерывания
softirq
. Его значение хранится в/proc/sys/net/core/dev_weight
.
8.4.2. Очередь сокета
softirq
. Приложения получают данные из очереди при помощи вызовов read
, recvfrom
и т.п.
netstat
. Так, например, столбец Recv-Q
содержит длину очереди. Переполнение очереди предотвращается уже рассмотренными способами (см. Раздел 8.4.1, «Буфер сетевой карты»).
- Входящий трафик
- Этот подход предусматривает снижение скорости поступления пакетов (добавить фильтры, заранее отбрасывать пакеты и т.п.). Дополнительно можно уменьшить весовое значение устройства[6].
- Длина очереди
- Чтобы увеличить длину очереди, надо изменить параметр ядра
rmem_default
или параметр сокетаSO_RCVBUF
(см. Раздел 8.2, «Оптимизация параметров сети»). - Частота программных вызовов
- По возможности следует сократить число вызовов из приложения. Это можно сделать за счет увеличения вызовов POSIX (
recv
,read
и т.п.).
8.5. Многоадресная рассылка
softirq
и занимает продолжительное время.
softirq
снижает число обслуживаемых приложений в загруженных системах, поэтому с увеличением потери пакетов увеличивается число прослушивающих приложений.
/proc/sys/net/core/dev_weight
(см. Раздел 8.4.1, «Буфер сетевой карты»).
Приложение A. История переиздания
История переиздания | |||||
---|---|---|---|---|---|
Издание 4.0-22.2.400 | 2013-10-31 | Rüdiger Landmann | |||
| |||||
Издание 4.0-22.2 | Mon Jul 1 2013 | Yuliya Poyarkova | |||
| |||||
Издание 4.0-22.1 | Thu Apr 18 2013 | Chester Cheng | |||
| |||||
Издание 4.0-22 | Fri Feb 15 2013 | Laura Bailey | |||
| |||||
Издание 4.0-19 | Wed Jan 16 2013 | Laura Bailey | |||
| |||||
Издание 4.0-18 | Tue Nov 27 2012 | Laura Bailey | |||
| |||||
Издание 4.0-17 | Mon Nov 19 2012 | Laura Bailey | |||
| |||||
Издание 4.0-16 | Thu Nov 08 2012 | Laura Bailey | |||
| |||||
Издание 4.0-15 | Wed Oct 17 2012 | Laura Bailey | |||
| |||||
Издание 4.0-13 | Wed Oct 17 2012 | Laura Bailey | |||
| |||||
Издание 4.0-12 | Tue Oct 16 2012 | Laura Bailey | |||
| |||||
Издание 4.0-9 | Tue Oct 9 2012 | Laura Bailey | |||
| |||||
Издание 4.0-6 | Thu Oct 4 2012 | Laura Bailey | |||
| |||||
Издание 4.0-3 | Tue Sep 18 2012 | Laura Bailey | |||
| |||||
Издание 4.0-2 | Mon Sep 10 2012 | Laura Bailey | |||
| |||||
Издание 3.0-15 | Thursday March 22 2012 | Laura Bailey | |||
| |||||
Издание 3.0-10 | Friday March 02 2012 | Laura Bailey | |||
| |||||
Издание 3.0-8 | Thursday February 02 2012 | Laura Bailey | |||
| |||||
Издание 3.0-5 | Tuesday January 17 2012 | Laura Bailey | |||
| |||||
Издание 3.0-3 | Wednesday January 11 2012 | Laura Bailey | |||
| |||||
Издание 1.0-0 | Friday December 02 2011 | Laura Bailey | |||
|