системные настройки высоконагруженного сервера
Настройки Linux по-умолчанию не годятся для высоких нагрузок. Под высокими нагрузками я понимаю от 10000 запросов в секунду. В данной статье рассмотрим два «переключателя», покрутив которые мы добьемся от сервера устойчивости и отзывчивости при высоких нагрузках. Эти переключатели: limits.conf и sysctl.conf
limits.conf
Это конфигурационный файл для pam_limits.so модуля. Он определяет ulimit лимиты для пользователей и групп. В Linux есть системные вызовы: getrlimit() и setrlimit() для получения и установления лимитов на системные ресурсы. Конфигурация по-умолчанию лежит в /etc/security/limits.conf. Также присутствует возможность добавлять отдельные конфиги для приложений в /etc/security/limits.d. Для того, чтобы сервер держал большую нагрузку, нужно увеличить некоторые лимиты. Посмотрим, какие лимиты у нас стоят по-умолчанию. Запустим под рутом.
Обратим внимание на open files, max user processes и max locked memory. Это стандартные ограничения, которые нужно убрать, если хотим держаться под нагрузкой. Перед изменениями хочу предупредить, что если железо недостаточно мощное, то ваш сервер может подвергнуться атаке типа fork bomb, так что аккуратно раздавайте права на сервере.
Приведем /etc/security/limits.conf к такому виду.
В файле мы устанавливаем мягкий и жесткий лимиты на количество запущенных процессов, открытых файлов (читай портов) для всех пользователей и неограниченный лок памяти для рута.
Хочу поподробнее рассказать, почему для открытых файлов было выбрано ограничение в 1048576. Это волшебное число захардкожено в ядре, чтоб поставить больше, нужно пересобирать ядро. Более развернуто на эту тему отвечают на stackoverflow и вот здесь.
Изменения вступят в силу или после перезагрузки или после нового логина или создания сессии ssh. Проверить, включается ли модуль pam_limits можно в файлах /etc/pam.d Для Debian есть статья в wiki на эту тему: https://wiki.debian.org/Limits
sysctl.conf
В /etc/sysctl.conf настраиваются параметры ядра, модулей и других подсистем. По сути, можно вручную менять значения псевдо-фс /proc, но такие изменения не сохранятся после перезагрузки, поэтому будем сразу вносить изменения в этот конфиг файл.
Для пользователей systemd этот файл уже не играет роли. Если вы вдруг используете systemd, вам нужно править файлы в /etc/sysctl.d/. Подробнее читайте на http://www.freedesktop.org/software/systemd/man/sysctl.d.html
Вот пример моего sysctl.conf для высоконагруженной системы.
Подробно про все опции, можно прочитать в
Или, например, здесь. А тут написано как люди выдерживают миллион pps в секунду и приведены примеры используемых sysctl.conf
После изменения sysctl.conf применим наши правки.
После перезагрузки все изменения будут применяться автоматически.
Заключение
Все вышеописанное применялось мной на работе для высоконагруженного сервера, который перед выкаткой в прод тестировался замечательным Yandex танком и держал нагрузку порядка 20000 rps. Стоит учесть, что сам по себе Linux не обеспечит вам стойкости под нагрузкой, если ваш софт ломается при 100 rps. Тут уже вас может спасти балансировка нагрузки. Смотрите в сторону HAProxy, LVS, Keepalived. Удачного прохождения высоких нагрузок!
limits.conf и лимиты потребления ресурсов для пользователей в Linux
Прежде всего, как выяснить процессы каких пользователей потребляют больше всего ресурсов CPU оперативной памяти.
Для текущего момента посмотреть процессы можно при помощи утилиты ps
ps aux —sort=%cpu | grep -v ‘root’ | head -n 35
ps aux —sort=%mem | grep -v ‘root’ | head -n 35
Команды выведут сортированные списки процессов в одной из колонок каждого списка будет указано имя пользователя. Процессы, запущенные от имени root показываться не будут и выведутся только 35 самых активных процессов.
Подобным образом статистику посмотреть не удасться, например, для веб-сервера с mod_php, однаако в большинстве случаев это как раз та информация, которая нужна для того чтобы выбрать пользователей для которых нужно предусмотреть ограничения.
Ограничения нужны на нагруженных серверах, они существует у каждого хостинг провайдера.
Лимитировать количество процессов можно используя механизм ядра cgroups — на практике проще всего установить ограничения отредактировав файл /etc/security/limits.conf и перезагрузив сервер.
Изменять /etc/security/limits.conf может только пользователь root или другой пользователь работающий из под sudo.
Файл хорошо задокументирован, вся необходимая информация находится в нем в комментариях
В общем виде любое правило выглядит так:
domain — это пользователь или группа, для которых лимитируем ресурсы
type — тип ограничения: soft или hard, ограничение soft может быть переопределено пользователем.
item — ресурс, который ограничиваем — обычно это cpu (в минутах) или as — максимальное количество оперативной памяти (в Кб); также можно задать nice level, который не сможет быть превышен процессами пользователя/группы (минимум 20, максимум -19); здесь же можно задать chroot (только для debian)
item — само численное значение
Как уже упоминалось — для того чтобы изменения вступили в силу нужна перезагрузка.
ulimit в Linux и ограничение ресурсов для пользователя
Soft лимиты пользователь может переопределить используя ulimit
Выполнение команды с аргументом -a выведет актуальные ограничения
ulimit -as 1500000
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 14685
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 14685
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
Ключи из вывода можно брать и использовать в командах, которые будут задавать ограничения для текущей терминальной сессии.
Дополнительно следует указывать тип ограничения:
-H — hard
-S — soft
Если не указывать ничего лимиты будут заданы жестко. hard здесь можно задать для текущего пользователя даже без прав root, но изменения не сохранятся после перезагрузки и чтобы ограничения были установлены постоянно нужно редактировать файл, который был рассмотрен ранее.
Создадим ограничение по оперативной памяти в 1500 Мб для пользователя
Выполнив ulimit -Hm сейчас можно увидеть, что ограничение установлено. Получить ту же информацию можно просмотрев лимиты для процесса
Можно указывать идентификатор любого процесса, запущенного от имени пользователя, для которого задали ограничение по памяти
5 мин для чтения Управление ресурсами системы с помощью команды Ulimit
Главное меню » Linux » Команды Linux и команды Shell » Управление ресурсами системы с помощью команды Ulimit
Что такое ulimit в Linux?
Ulimit – это встроенная команда оболочки, предназначенная для отображения, распределения и ограничения ресурсов. Для любой системы важно регулировать эти типы контроля.
Этот тип управления может быть применен на глобальном, групповом и пользовательском уровнях. Помимо обеспечения бесперебойной обработки задач, он не позволяет нежелательным процессам поглощать системные ресурсы, такие как оперативная память и мощность процессора.
Ulimit связан с файлом конфигурации безопасности. Ваше точное местоположение может отличаться, но обычно это что-то вроде /etc/security/limits.conf. Ulimit позволяет нам быстро редактировать эту конфигурацию.
Мягкие и жесткие ограничения
Как пользователь, вы можете настроить свои параметры ulimit.
Вы можете быть удивлены, зачем даже устанавливать лимит, если пользователь может его изменить. Здесь вступают в игру мягкие и жесткие ограничения.
Таким образом, с точки зрения администратора, вы можете предпочесть, чтобы ваш пользователь колебался вокруг определенного значения. Это будет ваш мягкий предел (скажем, 25).
Затем вы можете установить жесткий предел, который не может быть превышен этим пользователем (50). Пользователь будет уполномочен увеличить свой лимит с 25 до 50.
Использование ulimit в Linux
Вот синтаксис для команды ulimit:
Показать все ограничения для любого пользователя
Вы можете отобразить все виды ограничений для указанного пользователя следующим образом:
Флаг -a будет отображать все параметры и их конфигурацию для конкретного имени пользователя.
Если вы опустите user_name, он покажет ограничения для вас. Позвольте мне показать вам ограничения, установленные для меня по умолчанию:
Ваши значения по умолчанию могут отличаться от наших, конечно. В этом представлении отображается описание, назначенный флаг (который можно использовать для изменения ограничений) и конфигурация.
Отображать жесткие и мягкие ограничения
Также возможно видеть любой из этих соответствующих пределов с флагом.
Чтобы отобразить мягкие ограничения, используйте опцию -S:
Для отображения жестких ограничений используйте опцию -H:
Полезнее сочетать их с конкретными флагами сверху. Поэтому, если вы хотите проверить жесткое ограничение на максимальное количество пользовательских процессов, введите:
Изменить ограничения (временно)
Теперь давайте изменим это значение на 31500 для демонстрационных целей и еще раз проверим жесткий лимит.
Стоит отметить, что любые изменения, которые ваша привилегия позволяет вам, будут только временно записаны и затронут вашу текущую оболочку.
Чтобы подтвердить это, мы вышли из своей оболочки и создал новый терминал и получил исходное значение по умолчанию.
В следующем разделе показано, как сделать изменения постоянными.
Внесение постоянных изменений в ulimit
Как мы упоминали в начале статьи, ulimit регулируется /etc/security/limits.conf. Если вы хотите внести какие-либо постоянные изменения в ограничения любого пользователя, вам нужно будет внести изменения в файл безопасности как root.
При редактировании вам необходимо включить эти четыре элемента:
Вот текст, который мы добавили к файлу, чтобы установить жесткое ограничение на количество процессов для пользователя destroyer (т.е. нашей учетной записи):
Помните, что рекомендуется не включать корневую учетную запись, если вы не полностью осведомлены о возможных последствиях. Мы сделали это на виртуальной машине, поэтому вам не нужно делать это самостоятельно.
Как видите, предел для «destroyer» был изменен на 20000.
Как узнать, какое ключевое слово использовать для редактирования файла /etc/security/limits.conf? Ну, вот таблица, которая включает в себя возможные ключевые слова элемента и их описания:
Ключевое слово предмета | Описание |
---|---|
core | ограничивает размер файла ядра (КБ) |
data | максимальный размер данных (КБ) |
fsize | максимальный размер файла (КБ) |
memlock | Максимальное адресное пространство заблокировано в памяти (КБ) |
nofile | максимальное количество открытых файловых дескрипторов |
rss | максимальный размер резидентного набора (КБ) |
stack | максимальный размер стека (КБ) |
cpu | максимальное время процессора (MIN) |
nproc | максимальное количество процессов |
as | ограничение адресного пространства (КБ) |
maxlogins | максимальное количество логинов для этого пользователя |
maxsyslogins | максимальное количество входов в систему |
priority | приоритет для запуска пользовательского процесса с |
locks | максимальное количество блокировок файлов, которые может хранить пользователь |
sigpending | максимальное количество ожидающих сигналов |
msgqueue | – максимальная память, используемая очередями сообщений POSIX (в байтах) |
nice | Максимальный приоритет можно повысить до значений: [-20, 19] |
rtprio | максимальный приоритет в реальном времени |
chroot | изменить корень на каталог (специфичный для Debian) |
Тип лимита | Описание |
---|---|
hard | жесткий предел |
soft | мягкий предел |
– | жесткий и мягкий предел |
Изменить ulimit для групп
Изменение групповой политики очень похоже на то, что вы видели в предыдущем разделе, но перед названием группы вы добавите символ @.
Вот пример, где мы установили максимальное число входов в систему для студента группы 4, отредактировав файл /etc/security/limits.conf:
Вывод
Надеюсь, вам понравился этот краткий учебник по Linux-команде ulimit.
Если у вас есть какие-либо комментарии или вопросы, оставьте их ниже. Если у вас есть предложения по темам, которые вы бы хотели охватить, не стесняйтесь также оставлять их.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.