Ubuntu настройка sysctl conf

Обновлено: 07.07.2024

Тюнинг параметров системы применяется для повышения отзывчивости и производительности сервера. Не спешите покупать новое железо, возможно все дело в софте. Для начала проанализируйте нагрузку на сервер и протестируйте свой веб-сайт на нагрузку.

Файловая система

Для начала стоит убедиться, что вы используете файловую систему ext4:

Будет отображаться в столбце Type

Если же файловая система Ext3, то рекомендуется перевести ее в Ext4 — более производительную и улучшенную версию.

Виртуальная память

Для выполнения трудоемких задач используется виртуальная память ( swap ) — когда заполняется RAM, часть программы переносится на жесткий диск. Таким образом можно использовать больше ОЗУ, чем есть в системе.

Подход не имеет смысла в системах с большим объемом RAM, тем более, что оперативная память быстрее постоянной. Swap также не рекомендуется использовать на сервере с SSD-дисками — он существенно снижает срок службы хранилища (частые процессы записи и чтения).

Ubuntu по умолчанию выгружает данные при заполнении ОЗУ на 40%.

Для настройки swap используется параметр vm.swappiness , значение которого нужно вписать или отредактировать в файле конфигурации sysctl.conf :

Файл подкачки задействуется только если свободно 10% оперативной памяти

После этого нужно сохранить файл и перезагрузить систему. Для проверки, что новый параметр задействован нужно выполнить:

В первом случае применяет выводит все параметры файла, во втором — выбирает нужный параметр среди всех возможных переменных

Кэширование позволяет улучшить производительность системы. Но если веб-сервер производит большое количество операций чтения/записи, то дополнительное кэширование может замедлять I/O.

Параметры кэширования можно настроить:

Количество данных, которые ожидают записи можно просмотреть так:

878 “грязных” страниц ожидает записи

Чтобы уменьшить размер кэша для уменьшения вероятности потери важных данных при сбое и минимизации возможных задержек записи/чтения необходимо отредактировать параметры vm.dirty_background_ratio и vm.dirty_ratio:

Значения записываются sysctl.conf

Смешанная среда IPv4/IPv6 может вносить сбои в работу подключенных к Сети программ из-за непреднамеренного взаимодействия протоколов. К примеру при неудачной попытке подключения apt или ssh к сети IPv6, несовместимости устройств.

Для отключения IPv6 нужно выполнить:

Временное отключение IPv6 на всех интерфейсах

А для перманентного отключения протокола нужно отредактировать файл /etc/sysctl.conf :

Для применения новых параметров достаточно ввести sudo sysctl -p /etc/sysctl.conf

Процессы

Фоновые процессы могут серьезно “засорить” системную память. На помощь придет утилита sysv-rc-conf:

sudo aptitude install sysv-rc-conf
Установка инструмента

sysv-rc-conf позволяет отключать ненужные сервисы для ускорения и оптимизации ресурсов системы.

После чистой установки Ubuntu Server содержит минимум сервисов, только самое нужное. Но если сервер используется длительное время, то список процессов может быть обширным и будет зависеть от программ, которые вы сами устанавливали.

Если же используется десктопная версия, то вот небольшой список сервисов, которые можно отключить (если система работает в качестве сервера):

  • alsa и alsa-utils — звуковые подсистемы;
  • atd — планировщик, не нужен, если есть cron;
  • bluez-utiles — служба Bluetooth;
  • cupsys — подсистема управления принтером;
  • dns-clean — служба очистки DNS при использовании dial-up;
  • fetchmail — служба доставки электронной почты;
  • gdm — менеджер рабочего стола (GUI);
  • gdomap — служба поддержки GNUstep;
  • hibernate — служба гибернации;
  • hotkey-setup — поддержка горячих клавиш;
  • hotplug и hotplug-net — горячее подключение устройств;
  • ifrename — служба именования сетевых интерфейсов;
  • laptop-mode — режим ноутбука, не нужен на сервере;
  • ppp и ppp-dns — службы для соединения через модем;
  • winbind, smbd и nmbd — часть Samba, нужен для общего доступа с устройствами под Windows.

Главная рекомендация — не отключайте неизвестные процессы, пользуйтесь мануалом и Google.

Самое главное

Этот текст был написан несколько лет назад. С тех пор упомянутые здесь инструменты и софт могли получить обновления. Пожалуйста, проверяйте их актуальность.

Highload нужны авторы технических текстов. Вы наш человек, если разбираетесь в разработке, знаете языки программирования и умеете просто писать о сложном!
Откликнуться на вакансию можно здесь .

Анализ медленных запросов (профилирование) в MySQL с помощью Percona Toolkit

Sysctl предоставляет нам интерфейс, который позволяет изучить и изменить несколько сотен параметров ядра в Linux или BSD. Изменения вступают в силу немедленно, и даже есть способ сделать так, чтобы они сохранялись и после перезагрузки. Sysctl используется и для изменения параметров ядра во время его работы. Параметры доступны и перечислены в каталоге /proc/sys/. Сам каталог /proc представляет из себя виртуальную файловую систему procfs позволяющую получить доступ к информации о системных процессах непосредственно из ядра. Поскольку procfs является виртуальной файловой системой, она не использует в своей работе никаких накопителей данных и её действие ограничивается только оперативной памятью. Procfs помимо GNU/Linux также поддерживается такими операционными системами как: Solaris, BSD, QNX, IBM AIX. Вы можете использовать команду sysctl как для чтения так и записи. Говоря короче команда sysctl используется для просмотра текущих параметров ядра и их корректировки.

Внимание. Неверное изменение файла sysctl.conf может нарушить работу вашей систем.

Итак, все параметры хранятся в файле /etc/sysctl.conf, его-то и будем редактировать. Для начала сделаем его бэкап следующей командой:

Открываем файл для редактирования:

Если на вашей машине установлено более 512 Мб оперативной памяти, добавляем следующие строки.

Если ширина вашего канала около 10Mbps, можно добавить следующие параметры:

Игнорировать фальшивые ошибки ICMP

Не принимать пересылку ICMP

Принимать пересылку ICMP только от шлюзов, перечисленных в нашем листе шлюзов:

Не отправлять пересылку ICMP (мы не роутер):

Не принимать IP источника маршрута пакетов (мы не роутер):

Если вы используете Wifi или 3.5G-модем, впишите следующие строки:

Для предотвращения SYN-атак добавляем:

Вести лог марсианских пакетов:

Если вы хотите отключить пересылку пакетов:

Для увеличения максимального числа открытых файлов используйте следующие настройки:

Разрешить пересылку пакетов по ip4 и ip6:

Включить защиту от spoof-атак:

Далее сохраняем изменения и выходим из редактора. Для применения изменений «на лету»даём команду:


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


Правим sysctl.conf

Обычно файл /etc/sysctl.conf - пустой, а если нет. Необходимо добавить в конец файла следующие строки.

Не принимать и не отправлять ICMP-пакеты перенаправления. ICMP-перенаправления могут быть использованы злоумышленником для изменения таблиц маршрутизации. Целесообразно установить значение (нуль). Единица имеет смысл только для хостов, использующихся в качестве маршрутизаторов.

Целочисленное значение параметра tcp_max_orphans определяет максимальное число допустимых в системе TCP сокетов, не связанных каким-либо идентификатором пользовательского файла (user file handle). При достижении порогового значения "осиротевшие" (orphan) соединения незамедлительно сбрасываются с выдачей предупреждения. Этот порог помогает предотвращать только простые атаки DDoS. Не следует уменьшать пороговое значение (скорее увеличить его в соответствии с требованиями системы - например, после добавления памяти. Каждое orphan-соединение поглощает около 64 Кбайт не сбрасываемой на диск (unswappable) памяти>.

Параметр tcp_fin_timeout определяет время сохранения сокета в состоянии FIN-WAIT-2 после его закрытия локальной стороной. Партнер может не закрыть это соединение никогда, поэтому следует закрыть его по своей инициативе по истечении тайм-аута. По умолчанию тайм-аут составляет 60 секунд. В ядрах серии 2.2 обычно использовалось значение 180 секунд и вы можете сохранить это значение, но не следует забывать, что на загруженных WEB-серверах вы рискуете израсходовать много памяти на сохранение полуразорванных мертвых соединений. Сокеты в состоянии FIN-WAIT-2 менее опасны, нежели FIN-WAIT-1, поскольку поглощают не более 1.5 Кбайт памяти, но они могут существовать дольше.

tcp_keepalive_time - переменная определяет как часто следует проверять соединение, если оно давно не используется. Значение переменной имеет смысл только для тех сокетов, которые были созданы с флагом SO_KEEPALIVE. Целочисленная переменная tcp_keepalive_intvl определяет интервал передачи проб. Произведение tcp_keepalive_probes * tcp_keepalive_intvl определяет время, по истечении которого соединение будет разорвано при отсутствии откликов. По умолчанию установлен интервал 75 секунд, т.е., время разрыва соединения при отсутствии откликов составит приблизительно 11 минут.

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

Целочисленное значение (1 байт) tcp_synack_retries определяет число попыток повтора передачи пакетов SYNACK для пассивных соединений TCP. Число попыток не должно превышать 255. Значение 5 соответствует приблизительно 180 секундам на выполнение попыток организации соединения.

Векторная переменная net.ipv4.tcp_mem определяется тремя значениями (минимум, режим нагрузки, максимум) cодержит общие настройки потребления памяти для протокола TCP. Эта переменная измеряется в страницах (обычно 4Кб), а не байтах.

  1. Минимум: пока общий размер памяти для структур протокола TCP менее этого количества страниц, операционная система ничего не делает.
  2. Режим нагрузки: как только количество страниц памяти, выделенное для работы протокола TCP, достигает этого значения, активируется режим работы под нагрузкой, при котором операционная система старается ограничивать выделение памяти. Этот режим сохраняется до тех пор, пока потребление памяти опять не достигнет минимального уровня.
  3. Максимум: максимальное количество страниц памяти, разрешенное для всех TCP сокетов.

Векторная переменная net.ipv4.tcp_wmem содержит 3 целых числа (минимум, по умолчанию, максимум), определяющих размер приемного буфера сокетов TCP.

  1. Минимум: каждый сокет TCP имеет право использовать эту память по факту своего создания. Возможность использования такого буфера гарантируется даже при достижении порога ограничения (moderate memory pressure). Размер минимального буфера по умолчанию составляет 8 Кбайт (8192).
  2. Значение по умолчанию: количество памяти, допустимое для буфера передачи сокета TCP по умолчанию. Это значение применяется взамен параметра /proc/sys/net/core/rmem_default, используемого другими протоколами. Значение используемого по умолчанию буфера обычно (по умолчанию) составляет 87830 байт. Это определяет размер окна 65535 с заданным по умолчанию значением tcp_adv_win_scale и tcp_app_win = 0, несколько меньший, нежели определяет принятое по умолчанию значение tcp_app_win.
  3. Максимум: максимальный размер буфера, который может быть автоматически выделен для приема сокету TCP. Это значение не отменяет максимума, заданного в файле /proc/sys/net/core/rmem_max. При "статическом" выделении памяти с помощью SO_RCVBUF этот параметр не имеет значения.

Целочисленной значение tcp_orphan_retries определяет число неудачных попыток, после которого уничтожается соединение TCP, закрытое на локальной стороне. По умолчанию используется значение 7, соответствующее приблизительно периоду от 50 секунд до 16 минут в зависимости от RTO. На сильно загруженных веб-серверах имеет смысл уменьшить значение этого параметра, поскольку закрытые соединения могут поглощать достаточно много ресурсов.

Максимальное количество соединений для работы механизма connection tracking (используется, например, iptables). При слишком маленьких значениях ядро начинает отвергать входящие подключения с соответствующей записью в системном логе.

Разрешает временные метки протокола TCP. Их наличие позволяет управлять работой протокола в условиях серьезных нагрузок.

Разрешить выборочные подтверждения протокола TCP. Опция необходима для эффективного использования всей доступной пропускной способности некоторых сетей.

Протокол, используемый для управления нагрузкой в сетях TCP. bic и cubic реализации, используемые по умолчанию, содержат баги в большинстве версий ядра RedHat и ее клонов. Рекомендуется использовать параметр htcp.

Не сохранять результаты измерений TCP соединения в кеше при его закрытии. В некоторых случаях помогает повысить производительность.

Актуально для ядер 2.4. По странной причине в ядрах 2.4, если в рамках TCP сессии произошел повтор передачи с уменьшенным размером окна, все соединения с данным хостом в следующие 10 минут будут иметь именно этот уменьшенный размер окна. Данная настройка позволяет этого избежать.

Активируем защиту от IP-спуфинга.

Запрещаем маршрутизацию от источника.

Увеличиваем диапазон локальных портов, доступных для установки исходящих подключений.

Разрешаем повторное использование TIME-WAIT сокетов в случаях, если протокол считает это безопасным.

Разрешаем динамическое изменение размера окна TCP стека.

Защищаемся от TIME_WAIT атак.

Запрещаем переадресацию пакетов, т.к. это не роутер.

Не отвечаем на ICMP ECHO запросы, переданные широковещательными пакетами.

Можно вообще не отвечать на ICMP ECHO запросы (сервер не будет пинговаться)

Максимальное число открытых сокетов, ждущих соединения. Имеет смысл увеличить значение по умолчанию.

Параметр определяет максимальное количество пакетов в очереди на обработку, если интерфейс получает пакеты быстрее, чем ядро может их обработать.

Что такое sysctl

Оглавление

Ядро Linux и его настройка

Ядро Linux — это основа операционной системы. В стандартных сборках Линукс, таких как Ubuntu, Debian, CentOS и т.д., нам не нужно самим собирать ядро ОС, это уже сделано разработчиками данных дистрибутивов. Однако, если у вас появилась необходимость собрать наиболее свежую версию ядра или сформировать свой собственный дистрибутив ОС Линукс, то перед вами встанет задача «как собрать ядро вручную». На этом этапе можно заложить в ядро такие базовые настройки ОС, которые именно вам будут нужны для работы.

Еще одна задача, с которой может столкнуться в своей работе начинающий системный администратор — это настройка ядра системы прямо в ходе работы, т.е. «на лету». Не все специалисты пользуются этими возможностями, некоторые предпочитают выполнить базовые настройки операционной системы, а затем настраивать уже сами приложения. Конечно же, с помощью таких изменений переменных параметров ядра «в ходе работы ОС», администратор не подключит какие-то драйвера новых устройств или новые модули, которые не поддерживаются данной системой, однако можно настроить сетевой стек, сделать оптимальные «установки под себя» параметров процессора, памяти, самого ядра ОС и т.д.

Все это можно выполнить, научившись работать с утилитой sysctl, которая применяется в FreeBSD и Linux. Если системный инженер подойдет грамотно к настройкам ядра с помощью sysctl (а не просто найдет типовые команды из мануалов на сайтах), то возможно будет достичь оптимальных результатов работы системы. Например, таким образом настраивают высоконагруженные серверные ОС или даже выстраивают грамотную защиту от DDoS атак.

В нашей статье постараемся дать понятия о принципах работы с sysctl linux, а также привести примеры наиболее часто используемых команд в настройке ядра Линукс.

Как работать с sysctl

Для начала работы нам необходимо вывести на экран все доступные опции, делается с помощью команды:

Вывод параметров sysctl -a

Просмотреть все параметры sysctl может любой пользователь Linux (в нашем примере показываем на Ubuntu 20), а вот изменять параметры ядра может только пользователь с правами root.

Также можно посмотреть значение одного параметра, который вас интересует в конкретный момент, например*:

Вывод конкретного параметра sysctl

*Примечание: данная команда разрешает или запрещает маршрутизацию пакетов.

Надо отметить, что если значение параметра равно 0, то функция запрещена, а если равно 1, то разрешена.

Для вывода списка сразу всех переменных, которые начинаются, к примеру с vm, наберите в терминале команду:

Вывод параметров, начинающихся с vm

Ниже разъясним основные опции команды sysctl:

man sysctl — выводит подробную документацию по данной команде;

Команда man sysctl

sysctl -n — выведет на экран только значения переменных;

sysctl -N — покажет вам только названия переменных, без их значений;

sysctl -A — показывает все доступные настройки ядра, но в табличной форме;

sysctl -w "переменная"="значение" — используется для изменения значения переменной;

sysctl -p — выводит на экран настройки из файла /etc/sysctl.conf (или другого указанного файла настроек).

Покажем на практике, как использовать данные команды системному администратору в своей работе.

Например, попробуем разрешить маршрутизацию пакетов, выполнив команду:

Если мы просто применим команду без опции -w, то сделанные изменения не сохранятся после перезагрузки ОС:

Как правило, все показанные нами переменные параметров ядра Линукс, хранятся в конфигурационном файле /etc/sysctl.conf.

Файл /etc/sysctl.conf

Однако, некоторые переменные могут быть записаны в следующих каталогах и файлах:

Для того, чтобы вернуть настройки ядра к состоянию «до сделанных вами изменений», необходимо выполнить команду:

Команда sysctl --system

Для начала, можно поэкспериментировать с настройками ядра в «ручном режиме» с помощью выполнения данных команд в терминале. Если сделанные вами настройки — «рабочие» и помогают в оптимизации работы ядра вашей ОС, то можете их внести на постоянной основе в файл /etc/sysctl.conf.

Виртуальная файловая система /proc

Существует еще один интересный способ для настройки параметров ядра Linux — это работа с директорией /proc/sys. Здесь мы используем команду echo для изменения значений параметров настроек ядра Линукс, а для вывода на экран этих значений используем cat.

Ниже покажем на простых примерах, как это можно сделать на практике (по аналогии с командами sysctl). Итак, выведем на экран значение параметра net.ipv4.ip_forward данным способом (на скриншоте ниже показано, как вывести значение данного параметра двумя способами):

вывод команды cat

Для изменения значения данного параметра с 0 на 1, выполним команду*:

*Изменения, сделанные таким способом, будут работать до первой перезагрузки ОС.

На скриншоте ниже показано, как вывести на экран и другие параметры настроек ядра Ubuntu, к слову, мы предоставляем VPS хостинг под эту операционную систему:

работа с директорией /proc/sys

Примеры некоторых параметров ядра Linux

Приведем некоторые наиболее важные и часто используемые переменные ядра Линукс и расскажем, что они означают и как их настроить:

    fs.file-max — показывает максимальное значение для дескрипторов файлов, создаваемых и обрабатываемых ядром Линукс. "По умолчанию" устанавливается число, равное 10% оперативной памяти компьютера.

Настройка параметра fs.file-max

Выше, мы привели только некоторые переменные настроек ядра Linux, для применения всех возможных параметров, рекомендуем изучать документацию на вашу ОС. Например, работая с переменными типа net. можно выставить оптимальные сетевые настройки для вашей операционной системы.

Заключение

В этой статье мы осветили достаточно актуальную тему для системного администратора, как настроить ядро ОС Linux «на лету» с помощью sysctl и виртуальной файловой системы /proc. Не каждый специалист знаком с методами гибкой настройки ядра ОС, поэтому, прежде чем применять «любые настройки из Интернета», необходимо глубоко изучить данный вопрос, посмотреть параметры конкретной ОС, поэкспериментировать с различными значениями переменных (не сохраняя их) и уже затем, получив положительный результат — применять эти методы на постоянной основе. Потому что, не всегда «настройки из мануалов в Интернете» подходят всем подряд пользователям Линукс, и любые изменения настроек ядра системы надо выполнять крайне осторожно.

Настройка веб-сервера на базе стека LEMP в Ubuntu Server 14.04 LTS. Часть 3. Усиление безопасности системы.

Настройка параметров sysctl

Добавляем в /etc/sysctl.conf некоторые параметры, которые помогут усилить стойкость системы перед всевозможными флуд-атаками:

Сохраним файл и применим его изменения в системе:

Настройка iptables

Защита от атак UDP flood

Атаки UDP flood основаны на массированной посылке UDP-пакетов на порты различных UDP-сервисов. Защиту можно реализовать путём изоляции UDP-сервисов от Интернет (если это возможно) или путём установки лимита количества соединений в единицу времени от каждого отдельно взятого внешнего IP. Например, если наружу выставлен DNS -сервис (порт UDP 53), можно попробовать настроить такое ограничение с помощью iptables следующим правилом:

Ограничение TCP подключений

Далее можно поставить ограничение по количеству одновременных соединений

Защита от атак SYN flood

Ограничиваем максимальное число «полуоткрытых» соединений с одного IP к конкретному порту (не больше 50 соединений на каждый IP):

Отбрасываем неправильно сформированные пакеты:

Не забываем сохранить правила iptables:

Защита от атак SYN flood (скрипт с netstat и ipset)

Предварительно проверить ситуацию на наличие присутствия SYN_RECV соединений можно посчитав их количество:

Другой пример. Просмотр количества полуоткрытых соединений в разрезе IP

Рассмотрим пример скрипта для зашиты от атак TCP SYN flood с использованием связки iptables + ipset + netstat. ipset - это расширение для iptables, которое позволяет работать с большими массивами данных, например IP-адресов, обработка которых может быть вызвана из правил iptables Чтобы установить расширение выполним:

После того как пакет установлен, создаём собственную цепочку ipset, например с названием «DOS-SRC»

Добавляем в iptables в цепочке INPUT правило блокирования всех пакетов для всех хостов, которые обнаруживаются в цепочке ipset «DOS-SRC»:

Сохраняем правила iptables:

Создадим каталоги для хранения вспомогательных файлов…

Каталог для хранения скрипта обновления цепочек ipset (ipset-DOS-SRC-refresh.sh):

Каталог для сохранения файла цепочек ipset (ipset.conf):

Создадим скрипт, с помощью которого будет обновляться созданная нами ранее цепочка ipset «DOS-SRC»:

Наполним скрипт содержимым:

Скрипт анализирует вывод команды netstat, выбирает соединения в состоянии SYN_RECV (признак SYN флуда) и добавляет эти IP в цепочку «DOS-SRC» утилиты ipset, а члены этой цепочки в свою очередь в режиме реального времени блокируется в iptables в цепочке INPUT.

Запустим скрипт для проверки того, что при его запуске из cron не возникнет проблем:

В файл /etc/rc.local добавляем строчку восстановления сохранённого списка заблокированных адресов после перезагрузки системы:

Впишем команду загрузки ранее сохранённых правил ipset из файла ipset.conf (строку добавлять нужно до команды загрузки основных правил iptables):

Теперь нам нужно настроить периодическое выполнение скрипта ipset-DOS-SRC-refresh.sh. Создадим для этого файл задачи cron:

Наполним его содержимым таким образом, чтобы наш скрипт выполнялся раз в минуту:

Через 10 минут проверим по логу, что наш скрипт успешно дёргается планировщиком cron

В логе должны присутствовать записи о выполнении скрипта через заданные нами интервалы времени:

Проверяем сохранение цепочек ipset при перезагрузке системы

Для проверки можно вручную добавить какой-то IP в созданную нами цепочку ipset, а затем посмотреть состояние всех цепочек ipset:

После этого перезагружаем сервер, чтобы убедиться в том, что правила успешно создаются в iptables и ipset в процессе загрузки системы.

Для удаления конкретного IP из цепочки ipset можно воспользоваться командой:

Проверяем работу механизма автоматической блокировки

Воспользуемся утилитой hping3, чтобы пофлудить на наш сервер по известному порту (предполагается что порт открыт) пакетами TCP SYN. Разумеется, флуд нужно выполнять с другого внешнего IP, отличного от IP нашего сервера.

где: S - отсылка флага SYN p 80 - номер атакуемого порта i u1 - интервал в 1 микросекунду между отправляемыми пакетами.

Согласно нашим настройкам, не более чем через 5 минут после начала атаки на нашем сервере в цепочке ipset должен будет появиться IP адрес злоумышленника, и как следствие, любой трафик с него будет заблокирован. Напомню, что проверить текущее состояние цепочек ipset, выполним:

Учётная запись root

Если ОС Ubuntu на вашем сервере развёрнута не вами самостоятельно, а вы взяли готовый шаблон преднастроенной виртуальной машины у хостера, то есть рекомендация перед началом использования системы убедиться в том, что учётная запись root выключена. Некоторые хостинг провайдеры могут включать эту учётную запись в Ubuntu.

Проверить состояние можно в файле /etc/shadow. Если учётная запись включена (не имеет признака «!»), выключить её можно командой:

Читайте также: