Основа операционной системы Linux: ядро

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

Способы оптимизации и ускорения работы процессора

Все манипуляции по улучшению качества работы ЦП можно поделить на две группы:

  • Оптимизация. Основной акцент делается на грамотное распределение уже доступных ресурсов ядер и системы, дабы добиться максимальной производительности. В ходе оптимизации трудно нанести серьёзный вред ЦП, но и прирост производительности, как правило, не очень высокий.
  • Разгон. Манипуляции непосредственно с самим процессором через специальное ПО или BIOS для повышения его тактовой частоты. Прирост производительности в этом случае получается весьма ощутимым, но и возрастает риск повредить процессор и другие компоненты компьютера в ходе неудачного разгона.

Worker VS Prefork

Worker

С этим MPM мы улучшаем нашу производительность за счет снижения потребления памяти. Apache запускается как одиночный процесс и запускает множество потоков серверного процесса. Мы можем ограничить количество потоков через директиву apache — ThreadsPerChild.

Преимущества:

  • Сервер может обслуживать больше клиентов с меньшими ресурсами.

Недостатки:

  • Крах одного процесса нарушит работу сразу ВСЕХ потоков принадлежащих процессу.
  • Не совместимо с установкой php в виде модуля (mod_php), потребуется установить fastcgi (запуск PHP как независимого процесса).
  • Требует больше конфигурирования.

Директивы влияющие на производительность модуля worker:

  • MinSpareThreads: Минимальное количество запасных потоков. В зависимости от значения Apache сохраняет минимальное количество ресурсов для обработки запроса, таким образом новым пользователям не придется ожидать ответа сервера пока он выделит им ресурсы.
  • MaxSpareThreads: Максимальное количество запасных потоков.
  • ThreadsPerChild: Постояное число потоков создаваемых дочерним процессом.
  • ThreadLimit: Максимальное число потоков сконфигурированных в ThreadsPerChild для всего процесса apache.

Основная настройка среднего вебсервера с 2-3 гигабайтами памяти:

12345678 <ifModule worker.c>StartServers 4MaxClients 320MinSpareThreads 40MaxSpareThreads 80ThreadsPerChild 40MaxRequestsPerChild 0</ifModule>

Prefork

С модулем prefork существует основной процесс и на каждый запрос apache создает еще один подпроцесс. Родительский процесс стартует от имени root,  и каждый дочерний подпроцесс запускается от имени и группы согласно заданным директивам  apache. Таким образом получается изоляция для каждого запущенного процесса, так что проблема одиночного процесса не будет вам сниться в ночных кошмарах 😉

Плюсы:

  • Не требуется специализированной настройки.
  • Совместимо с mod_php.
  • Изоляция проблемных запросов.
  • Совместимость с непоточными возможностями.

Минусы:

  • Большая нагрузка на процессор и память.
  • Хуже масштабируемость.

Директивы влияющие на производительность модуля prefork:

  • MinSpareServers: Минимальное число дочерних процессов находящихся в ожидании.
  • MaxSpareServers: Максимальное число дочерних процессов в ожидании.
  • MaxRequestPerChild: Устанаваливает предел запросов обрабатываемых дочерними процессами. После превышения лимита процесс умирает, что избавляет нас от утечек памяти.

Основная настройка среднего вебсервера с 2-3 гигабайтами памяти:

12345678 <ifModule prefork.c>StartServers 4MinSpareServers 25MaxSpareServers 50ServerLimit 270MaxClients 270MaxRequestsPerChild 10000</ifModule>

Основная конфигурация Apache

  • MaxClients: максимальное количество запросов которое сервер будет обрабатывать одновремено. Все запросы превышающие это число будут поставлены в очередь на основе числа заданного в директиве ListenBacklog. Оптимальное число может быть разным в зависимости от того сколько памяти у вашего сервера, посчитать его можно так:[(Всего памяти — Память используемая другими процессами) / размер памяти каждого процесса apache или его потока] Для того чтобы узнать размер процесса :
    1 # ps -ylC httpd —sort rss
  • ServerLimit: Для модуля prefork устанавливает максимальное значение для MaxClients на весь процесс apache. При использовании модуля worker используется в сочетании с директивой ThreadLimit. Минумум этого значения должен быть таким же как и MaxClients, иначе эта директива не будет иметь эффекта.
  • TimeOut: Время которое Apache ждет три вещи: 1- Полное время получения запроса GET. 2- Интервал времени между TCP пакета в POST или PUT запросах. 3- Интервал времени между ACK для ответных пакетов TCP. По хорошему это значение должно быть в районе 30 секунд до закрытия подключения, большее значение может повлиять на большее число выделеных, но не используемых ресурсов.
    1 TimeOut 30
  • KeepAlive: Обеспечивает несколько ответов на запросы через одно TCP подключение.
    1 KeepAlive On
  • MaxKeepAliveRequests: количество запросов на одно подключение. Вы можете вычислить это значение по тому сколько запросов делает один посетитеть, число может оказаться огромным, но не выставляйте его слишком большим, одна атака может положить положить весь процесс в одной сессии.
    1 MaxKeepAliveRequests 70
  • KeepAliveTimeout: Количество секунд в течении которых Apache ждет подзапрос до того как закроет подключение. Как только запрос будет получен значение таймаута изменится на то которое задано в директиве TimeOut.
    1 KeepAliveTimeout 2
  • Отключение выполнения файла .htacess запрещает apache проверять существование файла .htaccess на каждом уровне переданного пути.
    123 <directory />AllowOverride None</directory>
  • Включение символьных ссылок:
    123 <directory />Options FollowSymLinks</directory>
  • Запрет апачу проверять кто является владельцем символьной ссылки.
    123 <directory /document/path>Options +FollowSymLinks -SymLinksIfOwnerMatch</directory>
Читайте также:  Как можно скорее обновите iOS и iPadOS до версии 14.4

Если вы настроены решительно и хотите еще больше оттюнинговать ваш Apache то вам сюда: #core

История реализации механизмов live patching

Первой рабочей реализацией исправления ядра на лету была Ksplice. Этот проект был частью университетских исследований MIT. Для продвижения новой технологии четверо студентов создали компанию Ksplice, Inc. Oracle приобрели компанию Ksplice и сделали сервис одним из основных компонентов своего дистрибутива Oracle Linux.

В 2014 году Red Hat создала Kpatch и выпустила его под лицензией GPLv2. В том же году SUSE объявил о выходе kGraft. Обе технологии очень похожи с небольшими отличиями. Оба инструмента нацелены в первую очередь на подмену функций с использованием встроенного механизма ядра Ftrace. Патч для наложения в обоих случаях оформляется как подгружаемый модуль ядра. Тем не менее, как в механизме применения патчей, так и в их формате и процедуре их подготовки у Kpatch и kGraft есть существенные различия. В частности, при применении патчей Kpatch проверяет, что ни один из процессов не выполняет функции, которые будут обновлены. Для этого приходится ненадолго останавливать все процессы в системе. kGraft же работает с каждым процессом отдельно – некоторые из них при этом могут использовать старые варианты функций, некоторые – уже новые. Постепенно все процессы в системе переходят на использование новых функций. При этом нет необходимости их останавливать. Если kGraft требует создания патча вручную, Kpatch позволяет создавать патчи как вручную, так и автоматически.

Коммерческие предложения

Поскольку эта функция пользуется большим спросом, большинство дистрибутивов Linux предлагают такую возможность только в качестве платного дополнения. Такие технологии, как Ksplice, Kpatch и kGraft, коммерчески интересны для поставщиков. Типичный пользователь Livepatch готов платить за ее использование.

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

Как установить новую версию ядра в Ubuntu

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

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

$ uname –r

Для более полной выдачи информации вы можете набрать в командной строке:

$ uname –mrs

или

$ uname -a

Последняя команда выводит вообще всю информацию, из которой вы сможете узнать, например, о версии ядра (к примеру, ), разрядности операционной системы (x86_64 – 64-битная) и о некоторых других параметрах.

Перед обновлением самого ядра рекомендуется выполнить обновление системы до соответствующей ветки (branch):

$ sudo apt-get dist-upgrade

Теперь перейдем к обновлению версии самого ядра – для этого вам необходимо использовать утилиту update-kernel, получить и установить которую вы можете при помощи следующих команд:

$ sudo apt-get update $ sudo apt-get install update-kernel $ sudo update-kernel

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

Теперь необходимо обновить загрузчик ядра:

$ sudo update-grub

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

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

Читайте также:  Как использовать Django, PostgreSQL и Docker

Оптимизация ядер и памяти с помощью MSConfig

Совет изменения настроек в системной утилите MSConfig основан на допущении, что Windows при загрузке не использует все ядра процессора и мегабайты оперативной памяти. Якобы нужно указать их нужное количество с помощью «секретной» настройки, чтобы компьютер быстрее включался и всё быстрее работало.

До «секретной» опции можно добраться так: Пуск — Выполнить (в Windows 10 используйте поле поиска вместо Выполнить) — msconfig — OK.

Оптимизация ядер и памяти с помощью MSConfig

Нужно нажать Дополнительные параметры, чтобы открыть параметры загрузки Windows и там будут вожделенные «суперсекретные» опции:

Сейчас ничего не настроено

Пока очумелые ручки не добрались до настроек, здесь ничего указано не будет, галочки проставлены не будут. С чего бы разработчикам Windows ограничивать производительность системы?

Оптимизация ядер и памяти с помощью MSConfig

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

На компьютере восьмиядерный процессор и 8 Гб оперативной памяти

И после перезагрузки компьютер начнет использовать все ресурсы. Это противоречит третьему тезису о том, что Microsoft не ограничивает производительность изначально.

Оптимизация ядер и памяти с помощью MSConfig

Другие вспоминают про оперативную память. «Блог мастера ПК» утверждает, что с ней та же беда.

Начало совета

Я обрезал часть текста, чтобы не было длинного скриншота

Оптимизация ядер и памяти с помощью MSConfig

Он советует указать не только количество ядер, но и размер памяти. А в конце говорит, что можно снять галочку.

Стоп. Где логика? Устанавливается опция, после отключается, как такая манипуляция может на что-то влиять в принципе?

Откуда миф? Полагаю, дело не только в незнании матчасти советчиков и отсутствии логического мышления, но и неоднозначной официальной справке по MSConfig. В статье MSConfig the System Configuration Tool на официальном сайте Microsoft описание опций действительно оставляет место домыслам, если не знать контекста:

Оптимизация ядер и памяти с помощью MSConfig

Перевод: «Если вы нажмете на Advanced Options (в любой ОС), вы можете установить такие параметры, как количество процессоров, выделенных для операционной системы при загрузке, или максимальный объем оперативной памяти. (В нормальном состоянии не отмечено)».

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

На самом деле Windows всегда использует все процессоры и ядра процессоров и всю оперативную память. Никто не думал ограничивать систему, да еще во время загрузки.

Опции в msconfig нужны программистам для тестирования программ, чтобы ограничить доступные ресурсы, сымитировав медленный ПК на быстром.

Оптимизация ядер и памяти с помощью MSConfig

Если задуматься о репутационных потерях, о штрафах и прочем, возникает понимание, что миф о настройке в MSConfig — полная чушь. В каком бреду можно утверждать,  что Windows не задействует все возможные ресурсы при загрузке компьютера? Ведь в интересах разработчиков Windows сделать так, чтобы компьютер включался как можно быстрее без шаманств в настройках. Вводить ограничения глупо.

Некоторые «гении» пытаются доказать, что опция «Число процессоров» ускоряет компьютер, потому что при значении 1 игры начинают тормозить. Логики в этом аргументе нет. При включенном лимите на одно ядро производительность действительно снижается (особенно это заметно в играх), но по умолчанию ограничения выключены и программы вольны использовать все ядра, как им вздумается. То есть опции в MSConfig работают так, как задумано — позволяют при желании пользователя ограничивать ресурсы ПК.

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

Оптимизация ядер и памяти с помощью MSConfig

Для самых непонятливых: просто снимите галочки.

Не имеет никакого значения, что там в полях — одно ядро или миллион. Не важно, что там в поле «Максимум памяти». Во что вы играете, насколько старое у вас железо — тоже не имеет никакого значения. Просто снимите все галки, нажмите ОК и живите спокойно дальше. Нет никаких тайных настроек в MSConfig для «разблокирования» процессорных ядер и памяти.

Оптимизация ядер и памяти с помощью MSConfig

Шаг Настройка ядра с помощью Sysctl

Иногда у администраторов Linux возникает желание немного «настроить» ядро. Эта настройка может включать в себя изменение в распределении памяти, включение каких-либо сетевых функций или возможность подключения к сети и даже установку защиты от хакеров.

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

Читайте также:  Что такое графические оболочки в Linux — KDE, Gnome и прочее

При использовании systctl нужно быть крайне осторожными, потому что без нужных знаний и опыта вы можете легко сломать систему. Она может перестать загружаться или станет непригодной для использования. Теперь давайте посмотрим на содержимое sysctl:

sysctl -a | less

Шаг Настройка ядра с помощью Sysctl

Чтобы просмотреть файл конфигурации для sysctl, мы можем получить его по адресу /etc/:

less /etc/

Один из способов, которым можно использовать sysctl для взлома — включить ipforwarding () для атак типа «человек-посередине». И наоборот, с точки зрения защиты от атак мы можем отключить эхо-запросы ICMP (_echo_ignore_all). Это затруднит работу хакерам по поиску нашей системы, но, к сожалению, не даст абсолютную защиту.

Конфигурирование и создание

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

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

сейчас мы запустим команду make oldconfig. Она сохранит имеющиеся

настройки и сообщит относительно новых возможностей. Однако, все еще

много неясных вопросов. Не бойтесь, если что-то вам неясно. Это

нормально. Просто используйте значения, предлагаемые по умолчанию.

Как только вы закончите выполнять команду make oldconfig, все будет готово для создания нового ядра. Эта часть легче:

$ make -j4 && sudo make modules_install

Настройка -j4 указывает количество имеющихся у вас процессоров; подробности сморите по ссылке «О многоядерных машинах» 10.

Дополнительная информация

В число современных публикаций, охватывающих концепции и конструкции операци­онных систем с конкретными ссылками на системы UNIX, входят труды [Tanenbaum, 2007], [Tanenbaum & Woodhull, 2006] и [Vahalia, 1996]. В последнем подробно описаны архитектуры виртуальной памяти. Издание [Goodheart & Сох, 1994] предоставляет по­дробную информацию, касающуюся System V Release 4. Публикация [Maxwell, 1999] содержит аннотированный перечень избранных частей ядра Linux 2.2.5. В издании [Lions, 1996] представлен детально разобранный исходный код Sixth Edition UNIX, который и сегодня остается полезным источником информации о внутреннем устройстве UNIX. В публикации [Bovet & Cesati, 2005] дается описание реализации ядра Linux 2.6.

Вас заинтересует / Intresting for you: Linux: как инсталлировать прог… 626 просмотров Дэйзи ак-Макарова Sun, 11 Nov 2018, 11:54:59 Команда man Linux: чтение стра… 633 просмотров Дэйзи ак-Макарова Sun, 11 Nov 2018, 09:36:51 Файловая система /proc в Linux 662 просмотров Fortan Fri, 22 Feb 2019, 06:05:18 LILO и GRUB — выбираем и настр… 2258 просмотров Андрей Волков Thu, 22 Nov 2018, 15:21:00 Author: Андрей ВолковДругие статьи автора:

  • Автономные базы данных: назначение, сфера применения и преимущества
  • Обзор Oracle ASM Dynamic Volume Manager (Oracle ADVM)
  • Обзор Couchbase: умная и эффективная NoSQL база данных

Сложность в освоении текстов

Кривая затрат, необходимых для того, чтобы детально изучить ядро Linux, становится все круче и длиннее, так как система постоянно усложняется, и при этом увеличивается ее объем.

Правильное толкование программ – это достаточно серьезная проблема в наши дни, и заключается она в том, что далеко не всегда достаточно просто иметь собственные исходники. В том случае, если система или же программа пишется на относительно низкоуровневом языке, таком как Cobol, Fortran или C, а также имеет некачественную документацию, то в таком случае любые основные проектные решения полностью растворяются в мелочах кодирования, вследствие чего им требуется полная реконструкция. В таких случаях ценность более эффективной документации, включая детальное описание архитектуры, а также спецификацию интерфейса, в конечном итоге может быть даже выше по сравнению с ценностью самого исходного текста.

Одним из возможных подходов предложил Линус Торвальдс, которым и осуществлялась разработка ядра Linux. Он предложил полную ясность исходного кода, то есть предоставление предельно четкой структуры, удобных интерфейсов, а также следования принципу «делать немного, но делать качественно».

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