Основы оптимизации Linux

По умолчанию ядро Linux оптимизировано для общих случаев использования. Поэтому большинство серверов Linux работают достаточно хорошо без какой-либо дальнейшей оптимизации. Однако если вы действительно хотите добиться максимальной производительности вашего сервера, вам необходимо применить некоторые навыки оптимизации системы. В этой статье вы узнаете, как это сделать.

Понимание основ оптимизации системы

Ядро Linux предлагает сложную структуру, позволяющую вашему серверу вести себя наилучшим образом. По умолчанию он настроен на среднюю рабочую нагрузку. На многих серверах средняя рабочая нагрузка просто недостаточно хороша, поэтому доступны некоторые расширенные возможности настройки Linux.

Внося изменения в настройки Linux, вы можете значительно повысить производительность вашего сервера. Однако существует и риск. Также относительно легко настроить сервер таким образом, что производительность будет ухудшаться, а не улучшаться. Именно поэтому настройка производительности Linux должна выполняться экспертами, которые знают, что они делают.

Чтобы научиться настраивать производительность Linux, нужно знать намного больше, чем в этой статье. Тем не менее эта статья даст вам фундамент для дальнейшего изучения и применения оптимизации системы.

Для начала, настройка производительности требует много исследований. Например на основе этой статьи: top, iostat, vmstat и pidstat. Мониторим Linux. После проведения исследования вы можете спокойно приступить к оптимизации производительности.

Но сначала вы должны усвоить некоторые правила:
  1. Никогда не пробуйте настройки на рабочем сервере. Используйте тестовую систему для испытаний и к рабочим серверам применяйте только те параметры, которые вы проверили.
  2. Меняйте одну настройку за раз и тщательно её проверяйте. Хорошее тестирование обычно означает повторение одного и того же теста три раза. Если после выполнения трех тестов вы убедились, что производительность улучшилась, значит можно применить на рабочем сервере.
  3. Составьте план перед началом. Слишком большая оптимизация производительности происходит без хорошего плана, в результате чего администратор на самом деле не работает над повышением производительности, а меняет случайные настройки, надеясь, что из этого получится что-то хорошее.

Понимание файловой системы /proc

Ключ к настройке производительности Linux находится в файловой системе /proc. Эта файловая система предлагает интерфейс к ядру Linux и может использоваться для анализа текущего состояния ядра и внесения изменений в различные настройки. Далее вы узнаете, как получить информацию об оптимизации производительности из файловой системы /proc и как оптимизировать ее производительность.
Многие, если не все системные утилиты (включая lscpu, uname, top, ps, lsmod и многие другие) получают информацию, которую они показывают, из файловой системы /proc. Так что, если вам не очень нравится чтение из файловой системы /proc, просто убедитесь, что вы нашли подходящий инструмент.

Использование / proc для анализа производительности

Файловая система /proc содержит много файлов, которые предоставляют информацию о текущем состоянии производительности сервера Linux. Большинство утилит для анализа производительности получают информацию из файловой системы /proc. В таблице 1 представлен обзор важных, связанных с производительностью файлы.

Таблица 1
 meminfo 
Подробная информация об использовании памяти.

 cmdline 
Строка, которая используется для загрузки текущего образа ядра. Полезно знать, какие параметры загрузки были указаны в приглашении загрузчика GRUB 2, что позволяет идентифицировать параметры загрузки, которые были введены вручную.

 cpuinfo
Подробная информация о процессоре и его функциях.

 partitions
Перечисляет все устройства хранения и разделы на этих устройствах хранения.

 sysrq-trigger
Потенциально опасный файл, который можно использовать для отправки низкоуровневых инструкций ядру.

 modules 
Перечисляет все модули ядра, которые в данный момент загружены.

 kcore 
Указывает на текущее состояние системной памяти.


Помимо файлов конфигурации, упомянутых в таблице 1, существуют также каталоги идентификаторов процессов (PID). Каждый процесс, работающий в Linux, имеет уникальный PID, и каждый из этих процессов создает свою собственную среду. Хотя это нелегко для чтения, эта среда доступна через каталоги PID.

В этих каталогах вы найдете, например, файл состояния, содержащий подробную информацию об использовании памяти, или файл окружения, который дает обзор всех переменных среды, которые используются процессом.

В листинге 1 показано, как может выглядеть содержимое файла состояния. Обратите внимание, что он содержит информацию, которую нельзя легко показать каким-либо другим способом, включая количество переключений контекста, которые были сделаны в отношении этого конкретного процесса.

Листинг 1

Использование /proc/sys для настройки производительности Linux

Ключом к оптимизации производительности Linux является каталог /proc/sys. В этом каталоге вы найдете настраиваемые элементы, разделенные на разные категории. В Таблице 2 содержится обзор этих элементов.

Таблица 2

ЭлементОбъяснение
abi Это двоичный интерфейс приложения. Он используется для предоставления интерфейса приложениям, в частности приложениям с открытым исходным кодом. Вы, вероятно, никогда не будете использовать это для оптимизации.
crypto Криптографический интерфейс, который обеспечивает криптографию для определенных служб, таких как IPsec и dm-crypt. Используется редко для оптимизации производительности Linux.
debug Когда в ядре Linux включены функции отладки, этот каталог содержит настраиваемые параметры. Не часто используется для обычных задач системного администратора.
dev Содержит несколько настраиваемых параметров, связанных с устройствами.
fs Интерфейс к виртуальной файловой системе. Содержит несколько полезных настроек, таких как file-max, в которых указывается максимальное количество файлов, которые могут быть открыты одновременно.
kernelИнтерфейс ядра. Содержит много полезных настроек.
net Сетевой интерфейс. Содержит много полезных настроек.
sunrpc Интерфейс sunrpc. Содержит несколько полезных настроек, связанных с общим доступом к файлам NFS.
vm Интерфейс виртуальной памяти. Содержит много полезных настроек.

Чтобы оптимизировать систему Linux, каталог /proc/sys содержит много параметров.

Есть два способа, чтобы изменить параметр:
  • Используйте echo для записи нового параметра в настраиваемый файл ядра.
  • Используйте sysctl -w, чтобы записать параметр в настраиваемое ядро.
При оптимизации ядра Linux вы всегда должны сначала записать параметр в файловую систему /proc/sys непостоянным способом. Затем вы проверяете, работает ли он.

После того, как вы вы убедились, что всё работает, вы можете сделать его постоянным, как описано в следующем разделе. В упражнении 1 вы узнаете, как временно изменить значение имени хоста, поддерживаемое ядром. Обратите внимание, что это всего лишь пример того, как изменить системное имя хоста, которое в настоящее время известно ядру Linux. Для внесения постоянных изменений в имя хоста используйте команду hostnamectl.

Упражнение 1. Временное изменение настроек в /proc
В этом упражнении вы временно измените настройку в /proc.
  1. Войдите под root и выполните uname -a. Команда покажет текущее имя хоста.
  2. Введите cat /proc/sys/kernel/hostname. Это показывает то же имя хоста.
  3. Введите  echo something.example.com > /proc/sys/kernel/hostname. Эта команда запишет новое имя хоста в настройки ядра, не делая его постоянным.
  4. Введите uname -a. Вы увидите, что имя хоста изменилось.
  5. Перезагрузите сервер, чтобы вернуться к настройкам по умолчанию.

Использование sysctl для автоматизации параметров оптимизации системы

Чтобы постоянно изменять настройки ядра, вам нужно записать их в sysctl. Sysctl - это служба, которая считывает несколько файлов конфигурации, которые применяются во время загрузки системы. В этом разделе вы узнаете, как работать с sysctl.

Во время загрузки служба systemd-sysctl запускается. Этот сервис читает конфигурацию sysctl. Эта конфигурация предлагается через различные файлы:
  • Файл /etc/sysctl.conf - это файл конфигурации по умолчанию. На RHEL или CentOS этот файл больше не должен использоваться.
  • Каталог /usr/lib/sysctl.d используется для параметров оптимизации по умолчанию. Содержимое этого каталога предназначено для управления через RPM, а не вручную, поэтому не вносите в него никаких изменений.
  • Каталог /etc/sysctl.d используется для пользовательских параметров. Если у вас есть какие-либо изменения, это нужно сделать здесь.
Параметры, которые вы вводите в файлы конфигурации sysctl, напрямую связаны с содержимым файловой системы /proc/sys. Переменные sysctl - это имена файлов, связанные с каталогом /proc/sys, но вместо косой черты в качестве разделителя каталогов используется точка.

Итак, файл /proc/sys/vm/swappiness упоминается как vm.swappiness в sysctl.

Чтобы получить представление обо всех доступных настройках, вы можете использовать команду sysctl -a. Эта команда выводит список всех доступных настроек. Она предлагает простой способ найти конкретные параметры, особенно когда совместно используется с grep или совместно с less. После того, как вы нашли переменную, которую хотите установить, вам нужно поместить ее в файл конфигурации sysctl.

В листинге 3 показан частичный вывод команды sysctl -a.

Листинг 3


Расположение по умолчанию для всех настраиваемых параметров - это каталог /etc/sysctl.d. В этом каталоге вы должны создать файл с именем, оканчивающимся на .conf. В этом файле вы поместите переменную со значением, которое вы хотите установить для настройки. В строках, в которые вы их помещаете, вы сначала вводите имя настраиваемого элемента, затем пробел, затем знак =, затем еще один пробел и предполагаемое значение.

Вы не должны помещать содержимое в файл /etc/sysctl.conf или в каталог /usr/lib/sysctl.d; оба места считаются управляемыми системой.

Команда sysctl также предлагает несколько полезных опций. В таблице 3 представлен их обзор, а в упражнении 2 вы узнаете, как применять некоторые параметры.

Таблица 3
ОпцияОбъяснение
 -aПоказывает все настройки.
 --systemПоказывает все параметры, которые были изменены с помощью sysctl.
 -p <filename>Загружает значения из указанного <filename>. Используйте это для активации изменений, которые вы только что внесли в файл sysctl. Если имя файла не указано, используется файл etc/sysctl.conf.
 -wЗаписывает новое значение параметра. Это имеет тот же эффект, что и использование echo для записи значения в переменную.
 -xНичего не делает. Эта информация не поможет вам; Я просто хотел поделиться, что у этой команды есть определенный параметр, который ничего не делает.

Упражнение 2. Изменение параметров ядра через sysctl
В этом упражнении вы узнаете, как применять параметры sysctl. Цель этого упражнения - не научить вас оптимизировать ваш сервер, а просто чтобы показать вам, как работает sysctl.

  1. Выполните ping localhost. Вы должны получить ответ от localhost.
  2. Выполните sysctl -a | grep icmp. Команда покажет все настраиваемые параметры sysctl и отфильтрует параметры, в имени которых есть icmp. Команда выведет параметр net.ipv4.icmp_echo_ignore_all, который можно использовать для игнорирования всех запросов ping.
  3. Выполните echo 1> /proc/sys/net/ipv4/icmp_echo_ignore_all. Это временно устанавит значение настраиваемого параметра равным 1, что указывает вашему серверу не реагировать на пинг-пакеты.
  4. Выполните ping localhost, чтобы убедиться, что ping больше не работает.
  5. Выполните sysctl -w "net.ipv4.icmp_echo_ignore_all = 0" и снова пропингуйте localhost. Теперь должно работать снова.
  6. Перезагрузитесь и проверьте. Вы заметите, что настройка не была постоянной.
  7. С помощью редактора создайте файл /etc/sysctl.d/ping.conf и добавьте в файл строку: net.ipv4.icmp_echo_ignore_all = 1.
  8. Перезагрузите компьютер еще раз и проверьте, можете ли вы пропинговать свой сервер. Вы заметите, что это больше не работает.
Таблица 4 показывает мой личный выбор полезных параметров, я рекомендую запомнить их; они настолько распространены, что вы также можете увидеть их на боевой машине.

ПараметрДля чего используется
 net.ipv4.ip_forwardУстановите 1, чтобы включить пересылку пакетов между сетевыми интерфейсами.
 net.ipv4.icmp_echo_ignore_allУстановите 1, чтобы отключить все пинги.
 net.ipv4.icmp_echo_ignore_broadcastsУстановите 1, чтобы отключить широковещательный пинг.
 vm.swappinessИспользуйте значение от 0 до 100, чтобы увеличить готовность вашего сервера к свопингу данных.
 kernel.hostnameУстановите имя хоста системы.

Подводим итоги

В этой статье вы узнали, как оптимизировать сервер с помощью sysctl. Вы узнали, как организована файловая система /proc и как вручную настраивать параметры ядра, отображая новые значения в файловой системе /proc/sys. Вы также узнали, как оптимизировать сервер с помощью команды sysctl и сделать настройки постоянными, работая с соответствующими файлами конфигурации.

Добавить комментарий