- Настройка ядра linux
- Как выполняется настройка?
- Настройка ядра Linux
- abi.vsyscall32
- debug.exception-trace
- dev.cdrom.autoclose
- dev.cdrom.autoeject
- dev.hpet.max-user-freq
- fs.aio-nr
- fs.file-max
- fs.inotify.max_queued_events
- fs.inotify.max_user_instances
- fs.inotify.max_user_watches
- cad_pid
- kernel.ctrl-alt-del
- kernel.domainname
- kernel.hostname
- kernel.modules_disabled
- kernel.panic
- kernel.pid_max
- kernel.random.boot_id
- kernel.random.uuid
- kernel.randomize_va_space
- kernel.sysrq
- kernel.threads-max
- net.ipv4.icmp_echo_ignore_all
- net.ipv4.icmp_echo_ignore_broadcasts
- net.ipv4.ip_default_ttl
- net.ipv4.ip_forward
- net.ipv4.ip_local_port_range
- net.ipv4.tcp_rfc1337
- net.ipv4.tcp_fin_timeout
- net.ipv4.tcp_keepalive_time
- net.core.rmem_default
- net.core.rmem_max
- net.core.wmem_default
- net.core.wmem_max
- net.ipv4.tcp_rmem
- vm.dirty_background_ratio
- vm.dirty_ratio
- vm.laptop_mode
- vm.swappiness
- Выводы
- Настройка параметров ядра Linux для оптимизации PostgreSQL
- SHMMAX / SHMALL
- Возможные ошибки неправильной конфигурации
- Понимание различий в определениях
- Большие страницы (Huge Pages)
- Скрипт определения количества больших страниц
- vm.swappiness
Настройка ядра linux
Ядро Linux — очень гибкая вещь, позволяющая настроить очень много параметров. Такие параметры, как поддерживаемые устройства и функции настраиваются при сборке ядра. Но сегодня не будет рассматриваться компиляция ядра Linux. Мы поговорим о более тонкой настройке параметров ядра на лету, прямо во время его работы.
Да, мы не можем включать добавлять неподдерживаемые модули и драйвера устройств, но мы можем настроить такие параметры ядра Linux, как особенности работы процессора, памяти, виртуального пространства памяти, планировщика ядра, сетевой стек и многое другое. Все эти настройки доступны через файловую систему proc. Мы рассматривали подробно ее в предыдущей статье, теперь же остановимся только на директории /proc/sys, с помощью которой мы и будем настраивать ядро.
Как выполняется настройка?
Здесь все предельно просто. В этом каталоге и его подкаталогах лежат файлы, это и есть параметры, а значения в файлах нам и нужно изменять. Для этого можно использовать самую простую конструкцию из команды echo и оператора перенаправления вывода:
Значение 1 будет записано в файл ipv4_forward. Но измененные таким способом параметры не сохраняются после перезагрузки. Перед тем как рассматривать как сохранить параметры ядра linux из proc рассмотрим еще один способ их модификации.
Для работы с параметрами ядра есть утилита sysctl. Она представляет все параметры в виде переменных. Имена этих переменных соответствуют адресу файла в папке /proc/sys только слеш заменен точкой. Например:
Вы можете установить значение параметра такой командой:
Но это изменение тоже не сохранится, чтобы сохранить настройку после перезагрузки нужно добавить опцию -w:
Вы можете также сразу посмотреть все доступные переменные с помощью опции -a:
Все эти переменные сохраняются в обычные конфигурационные файлы для сохранения между перезагрузками. Переменные, в зависимости от назначения распределяются между этими файлами:
Вы также можете вручную добавлять переменные и их значения в эти файлы. Если вы хотите вернуть значения переменных до состояния сохраненного в файлах и удалить свои изменения выполните:
Теперь вы знаете как работать с переменными, дальше мы рассмотрим значение некоторых, самых важных переменных, с помощью которых может быть выполнена настройка ядра linux.
Настройка ядра Linux
abi.vsyscall32
Если установлено 1, разрешает выполнение 32 битных программ в 64 битной системе. По умолчанию включено, можете отключить, а затем попробовать запустить, например, skype.
debug.exception-trace
При возникновении ошибки в ядре выводить значения регистров процессора и стек вызовов процедур. По умолчанию включено.
dev.cdrom.autoclose
Ваш CDROM будет автоматически закрыт при попытке его монтирования, по умолчанию отключено.
dev.cdrom.autoeject
CDROM будет открыт после размонтирования содержащегося там диска с помощью команды umount.
dev.hpet.max-user-freq
Максимальная частота генерации прерываний от системного таймера High Precision Event Timer (HPET), который пришел на замену таймеру реального времени RTC. По умолчанию 64.
fs.aio-nr
Количество асинхронных операций ввода и вывода в вашей файловой системе.
fs.file-max
Максимальное количество дескрипторов файлов, которые может создать и обрабатывать ядро. Если вы часто получаете сообщения об ошибке из-за невозможности создать дескриптор файла увеличьте этот лимит. По умолчанию установлено значение 10 % от вашей оперативной памяти.
fs.inotify.max_queued_events
Подсистема ядра inotify позволяет следить за изменениями в файловой системе. Этот параметр устанавливает максимальное количество событий, которые могут находиться в очереди, перед тем как их обработает программа.
fs.inotify.max_user_instances
Максимальное количество объектов inotify, которые может создать один пользователь.
fs.inotify.max_user_watches
Максимальное количество файлов и директорий, за которыми может наблюдать один объект inotify.
cad_pid
PID процесса, который получит сигнал, если будет нажато сочетание клавиш Ctrl+Alt+Del
kernel.ctrl-alt-del
Если значение параметра 0, система отправляет сигнал процессу Init или тому, который вы назначили в предыдущей переменной, чтобы выполнить правильную перезагрузку. Если значение больше нуля, будет выполнена немедленная перезагрузка.
kernel.domainname
Позволяет установить доменное имя NIS (Network Internet Services) и YP (Yellow Pages). Но не путайте это доменное имя с DNS, это совсем разные вещи.
kernel.hostname
Имя вашего компьютера. Это самый простой способ изменить имя компьютера прямо сейчас, без перезагрузки.
kernel.modules_disabled
Позволяет отключить загрузку модулей ядра.
kernel.panic
Указывает количество секунд после ошибки в ядре (kernel panic) до перезагрузки.
kernel.pid_max
Максимальное значение PID процесса. Когда PID достигает этого значения, ядро переходит опять к минимальному. Значения больше этого не выделяются.
kernel.random.boot_id
Этот файл доступен только для чтения и содержит уникальный, случайный идентификатор загрузки. Генерируется для каждой загрузки.
kernel.random.uuid
При каждом запросе генерирует случайный UUID. Тоже доступен только для чтения.
kernel.randomize_va_space
Рандомизация адресного пространства это функция увеличивающая безопасность вашей системы. Она защищает от атак на переполнение буфера. По умолчанию включена.
kernel.sysrq
Позволяет включить или отключить управление ядром с помощью SysRQ. Доступны такие параметры:
- 0 — отключить все функции
- 1 — разрешить все функции
- 2 — разрешить настройку уровня логгирования
- 4 — разрешить управление клавиатурой
- 8 — разрешить получение отладочных сообщений и дампов
- 16 — разрешить команду sync
- 32 — разрешить перемонтирование файловых систем в read-only
- 64 — разрешить завершение процессов
- 128 — разрешить перезагрузку, выключение
- 256 — разрешить управление планировщиком
kernel.threads-max
Максимальное количество запущенных потоков для процессов.
net.ipv4.icmp_echo_ignore_all
Если включено, ядро будет игнорировать все icmp запросы. Рекомендуется для защиты от DDOS атак.
net.ipv4.icmp_echo_ignore_broadcasts
Так же, как и в предыдущем варианте, только игнорироваться будут только широковещательные icmp запросы.
net.ipv4.ip_default_ttl
Максимальное количество узлов, через которые может пройти отправленный пакет перед тем, как достигнет цели.
net.ipv4.ip_forward
Разрешить проходящие пакеты через этот компьютер. Обычно такая настройка параметров ядра Linux нужна для роутеров.
net.ipv4.ip_local_port_range
Диапазон локальных портов, которые могут быть использованы вашими программами.
net.ipv4.tcp_rfc1337
Установите 1 чтобы защитить компьютер от атаки TCP TimeWait.
net.ipv4.tcp_fin_timeout
Таймаут ожидания завершения соединения после отправки пакета FIN. Рекомендовано 15.
net.ipv4.tcp_keepalive_time
Поддерживать соединение активным определенное время, например, 300 секунд. По истечении этого времени TCP соединение будет разорвано.
net.core.rmem_default
Указывает размер по умолчанию буфера для сокета получения данных по сети.
net.core.rmem_max
Максимальный размер буфера сокета для получения данных по сети.
net.core.wmem_default
Размер сокета по умолчанию для отправки данных по сети.
net.core.wmem_max
Максимальный размер буфера сокета для отправки данных по сети.
net.ipv4.tcp_rmem
Количество памяти, доступной для работы TCP.
vm.dirty_background_ratio
Указывает процент от общей системной памяти, когда фоновый демон pdflush записи данных начнет переписывать кешированные данные на диск. По умолчанию установлено 10, но в быстрых системах такое частое сбрасывание не нужно, поэтому этот параметр можно увеличить.
vm.dirty_ratio
Похожий параметр. Только на этот раз он указывает сколько общей оперативной памяти должно быть занято, чтобы процесс, который ведет запись данных на диск инициировал запись кэшированных данных непосредственно на жесткий диск.
vm.laptop_mode
Функция laptop mode позволяет не сразу записывать данные на жесткий диск после запроса, а хранить их указанное время в оперативной памяти. Может быть полезно если вы экономите заряд батареи и не хотите, чтобы жесткий диск всегда вращался.
vm.swappiness
Устанавливает процент свободной памяти, по достижении которого данные начинают переноситься на swap раздел, для систем с большим количеством памяти рекомендовано значение 10.
Выводы
Мы рассмотрели далеко не все параметры ядра linux, здесь описаны лишь самые интересные из них. Более подробную информацию и еще больше переменных вы можете найти в официальной документации по ядру Linux. И будьте осторожны, конфигурация ядра Linux — дело серьезное. Если я упустил какой-то важный параметр, напишите в комментариях!
Источник
Настройка параметров ядра Linux для оптимизации PostgreSQL
Оптимальная производительность PostgreSQL зависит от правильно определенных параметров операционной системы. Плохо настроенные параметры ядра ОС могут привести к снижению производительности сервера базы данных. Поэтому обязательно, чтобы эти параметры были настроены в соответствии с сервером базы данных и его рабочей нагрузкой. В этом посте мы обсудим некоторые важные параметры ядра Linux, которые могут повлиять на производительность сервера базы данных и способы их настройки.
SHMMAX / SHMALL
SHMMAX — это параметр ядра, используемый для определения максимального размера одного сегмента разделяемой памяти (shared memory), который может выделить процесс Linux. До версии 9.2 PostgreSQL использовал System V (SysV), для которой требуется настройка SHMMAX. После 9.2 PostgreSQL переключился на разделяемую память POSIX. Так что теперь требуется меньше байтов разделяемой памяти System V.
До версии 9.3 SHMMAX был наиболее важным параметром ядра. Значение SHMMAX задается в байтах.
Аналогично, SHMALL — это еще один параметр ядра, используемый для определения
общесистемного объема страниц разделяемой памяти (shared memory). Чтобы просмотреть текущие значения SHMMAX, SHMALL или SHMMIN, используйте команду ipcs.
SHM* Details — Linux
SHM* Details — MacOS X
PostgreSQL использует System V IPC для выделения разделяемой памяти. Этот параметр является одним из наиболее важных параметров ядра. Всякий раз, когда вы получаете следующие сообщения об ошибках, это означает, что у вас более старая версия PostgreSQL и у вас очень низкое значение SHMMAX. Ожидается, что пользователи будут корректировать и увеличивать значение в соответствии с разделяемой памятью, которую они собираются использовать.
Возможные ошибки неправильной конфигурации
Если SHMMAX настроен неправильно, вы можете получить ошибку при попытке инициализировать кластер PostgreSQL с помощью команды initdb.
initdb Failure
DETAIL: Failed system call was shmget(key=1, size=2072576, 03600).
HINT: This error usually means that PostgreSQL’s request for a shared memory segment exceeded your kernel’s SHMMAX parameter.
You can either reduce the request size or reconfigure the kernel with larger SHMMAX. To reduce the request size (currently 2072576 bytes),
reduce PostgreSQL’s shared memory usage, perhaps by reducing shared_buffers or max_connections.
If the request size is already small, it’s possible that it is less than your kernel’s SHMMIN parameter,
in which case raising the request size or reconfiguring SHMMIN is called for.
The PostgreSQL documentation contains more information about shared memory configuration. child process exited with exit code 1
Аналогично, вы можете получить ошибку при запуске сервера PostgreSQL используя команду pg_ctl.
pg_ctl Failure
DETAIL: Failed system call was shmget(key=5432001, size=14385152, 03600).
HINT: This error usually means that PostgreSQL’s request for a shared memory segment exceeded your kernel’s SHMMAX parameter.
You can either reduce the request size or reconfigure the kernel with larger SHMMAX.; To reduce the request size (currently 14385152 bytes), reduce PostgreSQL’s shared memory usage, perhaps by reducing shared_buffers or max_connections.
If the request size is already small, it’s possible that it is less than your kernel’s SHMMIN parameter,
in which case raising the request size or reconfiguring SHMMIN is called for.
The PostgreSQL documentation contains more information about shared memory configuration.
Понимание различий в определениях
Определение параметров SHMMAX/SHMALL немного отличается в Linux и MacOS X:
- Linux: kernel.shmmax, kernel.shmall
- MacOS X: kern.sysv.shmmax, kern.sysv.shmall
Команда sysctl может быть использована для временного изменения значения. Чтобы установить постоянные значения, добавьте запись в /etc/sysctl.conf. Подробности приведены ниже.
Изменение параметров ядра на MacOS X
Изменение параметров ядра на Linux
Не забудьте: чтобы сделать изменения постоянными, добавьте эти значения в /etc/sysctl.conf
Большие страницы (Huge Pages)
В Linux по умолчанию используются страницы памяти 4 КБ, в BSD — Super Pages, а в Windows — Large Pages. Страница — это часть оперативной памяти, выделенная процессу. Процесс может иметь несколько страниц в зависимости от требований к памяти. Чем больше памяти требуется процессу, тем больше страниц ему выделено. ОС поддерживает таблицу выделения страниц для процессов. Чем меньше размер страницы, тем больше таблица, тем больше времени требуется для поиска страницы в этой таблице страниц. Поэтому большие страницы позволяют использовать большой объем памяти с уменьшенными накладными расходами; меньше просмотров страниц, меньше ошибок страниц, более быстрые операции чтения/записи через большие буферы. Как результат — улучшение производительности.
PostgreSQL поддерживает большие страницы только в Linux. По умолчанию Linux использует 4 КБ страниц памяти, поэтому в случаях, когда операций с памятью слишком много, необходимо устанавливать страницы большего размера. Наблюдается прирост производительности при использовании больших страниц размером 2 МБ и до 1 ГБ. Размер большой страницы может быть установлен во время загрузки. Вы можете легко проверить параметры большой страницы и их использование на вашем Linux-компьютере, используя команду cat /proc/meminfo | grep -i huge.
Получение информации о больших страницах (только на Linux)
В этом примере, хотя размер большой страницы установлен в 2048 (2 МБ), общее количество больших страниц имеет значение 0. Это означает, что большие страницы отключены.
Скрипт определения количества больших страниц
Это простой скрипт возвращает необходимое количество больших страниц. Запустите скрипт на вашем сервере Linux, пока работает PostgreSQL. Убедитесь, что для переменной среды $PGDATA задан каталог данных PostgreSQL.
Получение цифры требуемых больших страниц
Вывод скрипта выглядит следующим образом:
Рекомендуемое значение больших страниц — 88, поэтому вы должны установить значение 88.
Установка больших страниц
Проверьте большие страницы сейчас, вы увидите, что большие страницы не используются (HugePages_Free = HugePages_Total).
Снова информация о больших страницах (только на Linux)
Теперь задайте параметр huge_pages «on» в $PGDATA/postgresql.conf и перезапустите сервер.
И снова информация о больших страницах (только на Linux)
Теперь вы можете видеть, что используются очень мало больших страниц. Давайте теперь попробуем добавить некоторые данные в базу данных.
Некоторые операции с базой данных для утилизации больших страниц
Давайте посмотрим, используем ли мы сейчас больше больших страниц, чем раньше.
Еще раз информация о больших страницах (только на Linux)
Теперь вы можете видеть, что большинство больших страниц используется.
Примечание: примерное значение для HugePages, используемое здесь, очень низкое, что не является нормальным значением для машины на продуктовой среде. Пожалуйста, оцените необходимое количество страниц для вашей системы и установите их соответственно в зависимости от нагрузки и ресурсов.
vm.swappiness
vm.swappiness — это еще один параметр ядра, который может влиять на производительность базы данных. Этот параметр используется для управления поведением подкачки (swappiness) (подкачки страниц в память и из нее) в Linux. Значение варьируется от 0 до 100. Он определяет, сколько памяти будет выгружено или выгружено. Ноль означает отключение обмена, а 100 означает агрессивный обмен.
Вы можете получить хорошую производительность, установив более низкие значения.
Установка значения 0 в более новых ядрах может привести к тому, что OOM Killer (процесс очистки памяти в Linux) убьет процесс. Таким образом, можно безопасно установить значение 1, если хотите минимизировать подкачку. Значение по умолчанию в Linux — 60. Более высокое значение заставляет MMU (блок управления памятью) использовать больше пространства подкачки, чем ОЗУ, тогда как более низкое значение сохраняет больше данных/кода в памяти.
Меньшее значение — хорошая ставка на улучшение производительности в PostgreSQL.
Источник