Привет. 

Сегодня хочу поговорить о том, как ускорить приложение через конфигурирование PHP-FPM.

Сейчас самый популярный (из тех с которыми я сталкивался) стек на котором поднимается PHP приложение это веб сервер nginx и процесс-менеджер php-fpm. 

Я хочу поднять простое приложение с Laravel проектом, которое устанавливается со всеми параметрами по умолчанию. Попробуем это приложение нагрузить пользователями с помощью простого Javascript скрипта и посмотрим как ему удастся справиться с нагрузкой и как мы можем повысить обрабатываемую нагрузку только конфигурированием php-fpm. В конце статьи можно будет найти ссылку на GitHub и попробовать своими руками.

Для начала посмотрим на стандартную конфигурацию php-fpm и попытаемся понять где могут быть проблемы в производительности с коробки.

Итак, у меня есть простое приложение на PHP с NGINX и PHP-FPM предустановленными в стандартных конфигурациях и маршрут Laravel.

Маршрут симулирует нагрузку через команду засыпания на одну секунду и возвращает простой json ответ.

Так же у меня есть Javascript файл который производит запрос на наш роут. Запускать его мы будем с помощью нагрузочной утилиты k6.

Для того чтобы провести нагрузочное тестирование давайте запустим утилиту k6 с пятью VU (virtual users) 

k6 run --vus 5 --duration 30s script.js 

Результат нагрузки:

Как видим в строке http_req_duration avg (среднее по всем показателям значение) равно 1.77 сек. Это сама нагрузка 1 секунда + время прохода запроса по сети и работа фреймворка. 

Давайте проведём еще один такой же тест но на 10и пользователях

k6 run --vus 10 --duration 30s script.js 

Результат нагрузки:

Как видим время возросло почти в два раза.

Давайте проведём еще один тест и будем разбираться в чём же дело.

На этот раз попробуем нагрузить сразу 50ью пользователями наше приложение.

k6 run --vus 50 --duration 30s script.js 

Результат нагрузки:

Как видим результат стал совсем грустным. В среднем клиенту приходится ждать ответа от сервера 15.48 секунд. Давайте разбираться в чём дело.

Для начала давайте узнаем какая сейчас конфигурация php-fpm. Сделать это можно с помощью команды php-fpm -tt

Эта команда выведет все параметры php-fpm, самые важные параметры я обвел рамкой.

Самый важный параметр - это pm.max_children он равен сейчас 5. Этот параметр сообщает нашему php-fpm сколько он может максимально запустить дочерних процессов (обработчиков) запросов. Иными словами сколько параллельно процессов будет обрабатывать входящую нагрузку.

Для лучшей наглядности я нарисовал небольшую схему.

Когда в наше приложение одномоментно приходит 50 клиентов они сначала обращаются в наш NGINX, он является просто прокси сервером и пробрасывает запросы сквозь себя на PHP-FPM (за исключением запросов за статическими ресурсами/файлами) и дальше PHP-FPM пытается обработать все запросы с помощью своих процессов (воркеров). Если же ситуация как у нас, когда PHP-FPM располагает только пятью воркерами, то первые 5 клиентов обрабатываются, а остальные 45 становятся в очередь и ждут, когда первые 5 обработаются. Как только первые 5 отработали, следующие 5 зашли на их место и оставшиеся 40 ждут в очереди. 

На этом этапе появляется две проблемы. Первая - мы заставляем таким образом ждать клиентов ответа, вторая - если время ожидания будет выше стандартного для NGINX в параметре fastcgi_read_timeout (стандартное 30 секунд) то мы можем получить 504 ошибку от NGINX. Вторую проблему мы можем исправить увеличив время ожидания, но это не спасет нас от первой проблемы.

Логичное решение проблемы - просто добавить воркеров для PHP-FPM и это вполне адекватная мысль, но стоит позаботиться о том, чтобы добавить достаточно воркеров и не добавить лишних воркеров, которые займут всю операционную память.

Давайте вернёмся к нашим конфигурационным параметрам и постараемся сделать правильную настройку.

Итак, нас интересуют следующие параметры:

pm = dynamic - php-fpm сам контролирует количество запущенных воркеров, при указанном параметре dynamic php-fpm будет в зависимости от нагрузки добавлять или удалять воркеры. Так же в этом параметре может быть значение static в таком случае количество воркеров будет статическим.

pm.max_children - максимальное количество процессов единовременно работающих. Часто это значение ставится в количестве 4 * на количество CPU. Для того чтобы узнать количество CPU можно воспользоваться командой lscpu.

Более правильно будет еще проверить количество свободной памяти, можно сделать это командой free -hl

Обязательно нужно понимать сколько памяти занимает один воркер. 

Это можно сделать с помощью команды htop и посмотреть среднее количество памяти которое занимают воркеры php-fpm 

pm.min_spare_servers - минимальное количество процессов в состоянии ожидания. Это количество нужно как резервное в случае внезапного появления нового количества клиентов. Чтобы клиенты не ждали пока новые процессы создадутся резервные процессы подхватят внезапную нагрузку. Значение обычно ставится в 2 * на количество CPU.

pm.max_spare_servers - максимальное количество процессов в состоянии ожидания. В случае если нет нагрузки на приложение php-fpm удалит лишние процессы с целью сохранить оперативную память.

Хорошо, давайте сконфигурируем наш PHP-FPM. 

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

whereis php-fpm

Ставим start_server в 24.

min_spare_servers в 12.

max_spare_servers в 24.

Перезапускаем докер.

И повторим нагрузочное тестирование с 50ью пользователями.

Результат нагрузки:

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

Так же еще можно посмотреть как отрабатывает php-fpm при установке pm стратегии в dynamic. Если вы запустите htop, то увидите стартовое количество воркеров

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

и после окончания теста снизится до начального.

Комментарии (53)


  1. Nnnnoooo
    05.09.2021 02:28
    +10

    Мне вот интересно, сейчас 2010 год, когда подобные статьи имели хоть как-то смысл?
    Все-таки такая статья с настройкой связки php-fpm + nginx это просто перебор для 2021 года, учитывая что это азы которые администратор обязан знать если он хоть каким-то боком имеет отношение к настройке пхп.


    Или статья создана просто чтобы был аккаунт с публикацией?


    1. IgorAlentyev
      05.09.2021 11:33
      +4

      Бывают же ситуации когда админа нет и сервер настраивает и поддерживает сам разработчик.


      1. Nnnnoooo
        05.09.2021 14:47
        -3

        Так как раз разработчик и обязан знать эти настройки. И не просто заучить значения, а понимать за что они отвечают и в каких случаях на какие менять.


        В других комментах ниже уже писали, что надо смотреть конкретный профиль приложения под нагрузкой а потом уже что-то менять.


        Но вот самый простой пример, когда данный конфиг просто не будет работать (даже при условии озвученной в статье конфигурации сервера): если в приложении есть обращения к сторонним веб ресурсам (например какое либо веб апи) или еще какие либо операции которые легко могут занять все воркеры. Даже при небольшом увеличении задержки от внешнего апи, есть шанс полностью приложить все приложение, а сервер будет вообще не загружен. Это не значит что надо ставить динамический пул, это о том что настройки надо менять осознанно исходя из конкретного приложения (иногда даже приходится несколько пхп пулов для одного приложения делать, только чтобы критичные операции работали независимо от некритичных)


        1. IgorAlentyev
          05.09.2021 17:21
          +1

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


          1. Nnnnoooo
            05.09.2021 17:46
            +3

            Нормальный разработчик должен знать принципы как работает сервис на котором выполняется код. почему-то ни у кого не возникает вопросов, что разработчик на ReactPHP обязан знать как запустить и настроить ReactPHP демона и обязан понимать что такое ивентлуп. А вот когда речь о классическом php-fpm — понимание его работы и настройки внезапно не требуется.


            Это имеет такое же отношение и к базе данных — разработчик обязан знать хотя бы в базовых понятиях как она работает (что такое индексы, как они работают, когда бывают блокировки и т.д.)
            Надеюсь не стоит объяснять что криво написанный код никакой админ не сможет заставить нормально работать.


            Но это речь только о нормальном разработчике, джуну на галере конечно это не надо.


            К тому же у меня был ответ на это заявление:


            Бывают же ситуации когда админа нет и сервер настраивает и поддерживает сам разработчик.

            В этом случае тем более разработчик обязан знать как настраивать и понимать что он делает. А не использовать такие "полезные" туториалы.


            P.S. Здесь речь именно о связки php-fpm + nginx (другие языки, другой деплой, могут быть свои нюансы)


          1. mSnus
            06.09.2021 04:33
            +3

            Фрилансерам это очень полезно. У них нет толпы девопсов и админов.. да и лучше быть грамотным, даже когда они есть


          1. Reshat
            13.09.2021 19:17

            Примерно с этого момента начинаются отличия кодера от инженера программного обеспечения.


    1. a0fs
      05.09.2021 13:07
      +6

      Не смотря на то что сейчас 2021 год, космические корабли уже вылетают за пределы нашей солнечной системы, интернет существует уже 52 года, 30 лет как существует World Wide Web, 20 лет как существует wikipedia и порождённая ей культура всяких wiki, не смотря на всё на это, в нашей многострадальной, богом хранимой стране (ну или по крайней мере на нашем великом и могучем языке) так и не смогли создать ресурс, на котором всё вот это собиралось бы и хранилось. Есть миллион бложеков, сотня-другая тысяч мануалов, подробно описывающих как подключить базовый репозитарий к убунте и установить php с настройками по умолчанию. Возможно среди них и затесалась та самая статья которая описывает все эти известные с древнейших времён прописные истины, очевидные каждому адепту *nix администрирования. Но она там утонула и чтобы её найти нужно провести полноценные археологические раскопки. А так базовые циферки прямо на хабре.

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


      1. 027
        05.09.2021 22:46
        +3

        Весной 2020 столкнулся с этой проблемой, когда студентов стали массово переводить на дистант. До этого у нас крутилась СДО Moodle на обычной VPS-ке средней паршивости (KVM / 6 Core / 4G), параллельно с основным сайтом, и каши не просила. На ней сидели какое-то курсы повышения и прочей переподготовки с малочисленными контингентами.

        По мере аврального выкатывания все новых курсов, уже для основной массы студентов, пришлось пройти последовательные стадии перехода:
        * bare metal (16 Core Xeon/ 16G);
        * два облачных сервера (32 Core / 32G каждый, один под nginx + php-fpm, другой под mysql);
        * уменьшение ресурсов до 24 Core / 16G и 8 Core / 24G по результатам трехмесячного мониторинга.

        Типичная нагрузка в рабочее время ≈100 запросов в секунду, в пиках до 300 и более. 2300 студентов. Какой-никакой, но хайлоад.

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

        Настраивать пришлось буквально всё: nginx, php, memcached, mysql и параметры ядра linux. Возникала, было, мысль написать статейку на хабр в помощь таким же бедолагам, да так и ушла. И от банальной непроходящей усталости от работы (мне этот мудль сбоку припека, админить пришлось просто потому, что больше некому. И от атмосферы на нынешнем хабре — администрация такой контент безразличен, сообщество же активно хейтит.

        Взять хотя бы этот пост: «разработчик должен знать! девопс должен знать! админ должен уметь это и намного больше!» — а откуда он должен все это познать, скромно умалчивается. Ну написал бы сам статью, раз такой крутой профессионал — но нет, одни пустые поучения: «обратитесь к специалисту», «работу должен делать профессионал». Спасибо, хоть, не «вон из профессии!»

        Провинциальный бюджетный вуз, какие там крутые *nix-админы и девопсы… Сисадмин у нас классический мышевоз-виндузятник, ничем помочь не мог. Нанять кого-то со стороны вне штатного расписания — величайший геморрой с бюрократией. Да и найди еще такого, не говоря уж, чтобы заинтересовать. В общем, сам себе сисадмин, крутись, как хочешь.


        1. 027
          05.09.2021 23:02

          P.S. Скажу еще, положа руку на сердце: ничего такого запредельно сложного для пользователя линукса со стажем в этой работе не оказалось. Трудность заключалась именно в отсутствии комплексного howto «как настроить вебсервер под внезапно подскочившую нагрузку» в условиях цейтнота.


          1. Nnnnoooo
            05.09.2021 23:04

            А вот скажите, а чем бы данная статья помогла в вашем случае?


            ответ

            ничем


            1. 027
              05.09.2021 23:08
              +1

              В моем случае — ничем. Но эта статья и не для подобных тяжелых случаев.
              Согласен, статья слабенькая, но зачем же автора ругать? Он хотя бы старался помочь таким, как он.
              Ни вы, ни я ничего такого не сделали.


              1. Nnnnoooo
                05.09.2021 23:12

                Так это же медвежья услуга!
                Вот еще раз повторюсь — это НИКАК не поможет новичкам, они просто скопируют все для своей вдски и угадайте что получится? Почему вдски — потому что именно с них начинают новички


                1. bondeg
                  07.09.2021 03:14

                  Почему никак? Довольно подробно расписано что и почему сделано, с примером. Новичку как раз самое то. А не сухое "ну вот тут поставим 42, потому что так будет хорошо".


                  1. Nnnnoooo
                    07.09.2021 12:51

                    уже в комментах несколько расписали что не так со статьей:


                    • цифры взяты с потолка (почему именно на 2 или на 4 умножать)
                    • если это статья для новичка, то сразу надо ббыло написать что это настройка только для выделенного сервера с большим количеством памяти, а для обычной вдски не подойдет (по многим причинам). Новичек скорее всего будет работать именно с вдск-ой

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


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


          1. Nnnnoooo
            05.09.2021 23:11

            комплексного howto «как настроить вебсервер под внезапно подскочувшую нагрузку» в условиях цейтнота.

            А не может быть одинакового howto ответа для разных приложений.


            Провинциальный бюджетный вуз, какие там крутые *nix-админы и девопсы… Сисадмин у нас классический мышевоз-виндузятник, ничем помочь не мог.

            Вам не кажется что именно в этом была проблема, а не в отсутствии howto?


            1. 027
              05.09.2021 23:16

              А не может быть одинакового howto ответа для разных приложений.
              Может. Если, конечно, это не тупой набор копипасты из командной строки.
              Вам не кажется что именно в этом была проблема, а не в отсутствии howto?
              Мне ничего не кажется, я просто знаю. Проблем в моем конкретном случае несколько, но ни к хабру, ни к теме howto по хайлоаду они не относятся.


              1. Nnnnoooo
                05.09.2021 23:20

                Может. Если, конечно, это не тупой набор копипасты из командной строки.

                Тогда это будет уже не howto, а целая книга по администрированию, мониторингу и отладке приложений :)


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


                1. 027
                  05.09.2021 23:22

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

                  (off)
                  А что за шняга с временем на редактирование — в этом свеженаписанном каменте остаток времени меньше 15 минут? Было же 30 раньше.

                  Проверил в другой статье — там 30 минут дается.


                  1. Nnnnoooo
                    05.09.2021 23:29

                    Это результат последних обновлений на хабре :(


                    1. 027
                      05.09.2021 23:37
                      +1

                      Черт его знает, пишу в старом интерфейса с компа. Новый, который с мобильного переделан, невыносимо кривой и тормозной.
                      Спасибо jarvis394 за его проект «habra.», там читать намного комфортнее.


    1. vanxant
      05.09.2021 14:00
      +3

      Лучше такие статьи, чем гуглопереводы разного шлака


      1. Nnnnoooo
        05.09.2021 14:21
        -1

        Ну это уже какая-то аксиома Эскобара получается.


    1. Mozhaiskiy
      05.09.2021 16:58
      +12

      А вот я с вами поспорю. Условный "хабр 2010" — это обилие дискуссий, руководств, методичек по настройкам, тонны объяснений азов (зачастую, не вполне правильных). Добрая часть ссылок на технические запросы гугла ведёт именно на те золотые посты. Но теперь ТЕ молодые люди, которые ТОГДА сидели на хабре, выросли и стали теперь мочить всё, что не укладывается в их идеальный мир узкого специалиста в крупной компании.

      Реально, какую статью не напишут — 100% будут волны хейта, что "так не делают", что "это азы", что "для этого нужен отдельный специалист в команде". В итоге Хабр скатился до тупого перевода новостей и ретро-воспоминаний, по факту перестав публиковать новые посты-инструкции на актуальные темы, поскольку не получает минусов и хейта только тот, кто ничего "опасного" не пишет.

      Блин, чуваки, вы тоже были молодыми и невежественными. Вы тоже делали конфиги копипастой из чужих мануалов. Давайте вообразим, что в условном 2005-2010-м все ваши проекты будут хейтить условные дяди, у которых 100500 сертификатов от IBM и Microsoft, и которые будут писать, что ваши велосипеды никому не нужны, что есть крупные команды и готовые библиотеки, что не надо лезть сюда со своим невежеством. Вы выросли, и стали считать, что весь мир вырос, поумнел и потяжелел вместе с вами, но это не так. Простите, но это называется страшным словом "старость".

      Вокруг вас тысячи инди-разработчиков, которые тянут свои проекты в одиночку. Вокруг куча народу пишет на PHP и сидит на Windows. Люди не рождаются со знанием Linux и Golang и не попадают после детского сада сразу в фирму с 300 разработчиками. Но Хабр стал таким, что эти люди боятся постить статьи со своим опытом. Боятся, что их захейтит токсичное комьюнити. Не даром говорят: спроси на английском на Stackoverflow — получишь ответ и пример. Спроси на русском на тостере — услышишь, что ты м*дак и руки у тебя из ж**ы и так вообще в 2021-м не делают. У меня иногда ощущение, что вместо российского IT-комьюнити я попадаю в какую-то советскую школу, где нужно помалкивать и уметь держать удар, чтобы тебя не заклевали.


      1. Nnnnoooo
        05.09.2021 17:12

        На старом хабре такие статьи уходили в глубокий минус. И причина довольно банальна — довольно низкий технический уровень.


        Здесь объективно довольно убогая инструкция, без объяснения того зачем это надо и без описания нюансов. И написано в стиле — делай именно так. И рассчитана на дальнейший копипаст. А зачем, почему и вообще будет ли это работать — это уже не важно.


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


        А данная статья кроме того что имеет очень низкий технический уровень, еще и в девопс хабе… ну просто нет слов.


        1. Mozhaiskiy
          07.09.2021 10:34
          +2

          Дорогой, а вы понимаете, что после фраз "убогая инструкция" и "довольно низкий технический уровень" человек, скорее всего, больше ничего постить на Хабре не будет?

          В "том самом 2010-м" в комментах было бы "классная статья, но я бы сделал ещё так.." и "а добавь ещё вот это, а то маловато", "спасибо, сохранил" и "поправлю неточность". Да, это инфантильно, но это мотивирует людей развиваться, писать дальше и сеет добро. Он статью прислал, блин, не в Science, не в Nature и не в ВАКовский журнал, чтобы ему накидали разгромной критики, а в соцсеть. Даже в комментах Попову про Bolgenos люди когда-то умудрялись писать, что "молодец, мало кто в твоём возрасте может сделать сборку, но так не делают, это стыдно".

          Вы реально в 2021-м хотите от Хабра уровня рецензируемого профессионального издания, где статья должна исходить от человека с опытом, с заслугами и не содержать скользких мест? А куда людям постить свои девелоперские опыты, где это обсуждать и как получать нетоксичную критику? Хабр был именно таким. Откройте любой пост лет 12-15 назад, да там половина постов уровня "как настроить PHP в Windows", половина комментов — смайлики от друзей, которые друг другу понавыдавали инвайтов. А сейчас даже RSND и VC стали дружелюбней для разработчика, чем "главный профессиональный ресурс рунета".

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


          1. Nnnnoooo
            07.09.2021 12:41

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


            1. Mozhaiskiy
              08.09.2021 13:00

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


              1. Nnnnoooo
                08.09.2021 14:35

                А сейчас тут холодно, неуютно и сплошные переводы новостей.

                То что сейчас хабр это площадка коммерсов и журналистов копирайтеров — это следствие политики администрации хабра. И данная статья никак не может улучшить эту ситуацию, вернее она только ее подтверждает — формально это рерайт перевод c английского из внутренностей php-fpm.conf. То что было добавлено куча бесполезных скриншотов, не делает эту статью лучше. Т.е. от данной сттьи на хабре теплее не станет.


                И еще судя по тому что автору не интересно участвовать в обсуждении, еще раз показывает что ему главное было сделать аккаунт со статьей и все, а что в статье и какого она качества — не важно.


    1. OnYourLips
      05.09.2021 22:03
      +1

      Сейчас, в 2021 после девопс-революции, это должен знать именно разработчик, а не админ. Потому что именно разработчик формирует результат своей работы в виде контейнера.


  1. anonymous
    00.00.0000 00:00


    1. hello_my_name_is_dany
      05.09.2021 04:16
      +2

      Автор под ускорением имел ввиду увеличение RPS, а не скорость обработки одного запроса


  1. DimNS
    05.09.2021 07:18
    +13

    Ну не знаю, мне как новичку в этом деле данная статья очень полезна, всё по существу, без воды и с реальным примером, а главное формулами, а не просто описанием параметров конфига. Просто автору надо было сделать статью с тегом tutorial и озаглавить что тутор для новичков, чтобы devops-отцы не канючили что это должен знать каждый ))


    1. TheCluster
      05.09.2021 09:07
      +4

      Какая-нибудь аналогичная статья, здесь или на другом сайте за 2009-2013 года ничем не хуже.


      1. catkaff
        06.09.2021 00:31

        "Какая-нибудь"... Вы в курсе, что обычно в таких случаях дают ссылки, а не плескают свой токсичный яд?


        1. Nnnnoooo
          06.09.2021 00:58

          поиск по хабру сразу находит это:
          https://habr.com/ru/company/southbridge/blog/460511/


          pm static м другие режимы раскрыты в разы полнее. Да перевод, но все равно лучше чем данная статья. Единственный минус — придется читать и думать, просто копипаст не получится сделать.


          По оптимизации php-fpm просто куча материалов в инете, главное определиться для чего нужно оптимизировать, для высокой нагрузки, для ограниченных ресурсов и т.д.


    1. mrBarabas
      05.09.2021 13:20

      Где Вы там формулы увидели, 4х и 2х от количества ядер - это не формула, это пальцем в небо. Нужно все тестить и все зависит от каждой конкретной ситуации, в большинстве случаев оно сработает, но там где нагрузка присутствует, хотя бы кратковременная - это уже время на настройку. Приведу пример из практики, впервые про эти настройки я узнал от гугла во время поиска причин проблем из логов (когда не хватает воркеров, то в лог пишется предупреждение), при чем проблема была на не самом посещаемом сайте из-за разогрева кеша - курл обходил 100+ страниц в несколько потоков при этом запускался на этом же сервере, то есть сетевых задержек не было. Сервер - обычная дешевая ВПСка с одним vCPU и 1Гб ОЗУ, сайт при этом не падал, но начинать тупить. Подняли лимиты на макс.количество воркеров, ещё раз и ещё несколько раз пока воркеров не стало хватать для обхода всех страниц и установили минимальное количество для обычной нагрузки. Поэтому, вместо установки 4х от чего-то и так далее нужно установить логи в 1 в php.ini и указать путь и периодически их просматривать, а потом уже делать вывода на основании того насколько сервер справляется.


      1. Nnnnoooo
        05.09.2021 14:20

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


    1. Nnnnoooo
      05.09.2021 14:18

      К чему тут девопсы-отцы. Я не девопс, администрированием занимаюсь только потому что мне надо чтобы мои проекты работали именно так как мне надо. И базовые настройки настройки php-fpm в связке с nginx-ом это первое что приходится узнавать.


      Пользы от этой статьи ровно ноль, я бы даже сказал что отрицательная польза, потому что какой-то новичок просто погуглив найдет эту "инструкцию" и решит "протюнить" например свой бложик на вордпресс на убитой вдс-ке. Надеюсь не стоит объяснять что у него после этого получится?


      Если бы статья была по типу описание полезных настроек php-fpm и nginx, которые может понадобится изменить (типа расширенного мануала с примерами, но только учитывая особенно пхп приложений). Вопросов бы не возникало.


      1. Nnnnoooo
        05.09.2021 14:29

        как же достало последнее обновление хабра, после которого нельзя редактировать свой пост :(


  1. Blumfontein
    05.09.2021 08:34
    +2

    Мы на сервере на 16vcpu и 16RAM не стесняемся и ставим до 300 static воркеров. С ОЗУ никогда проблем не было, потому что первым умирает CPU. Понятное дело 300 одновремнных запросов сервер не потащит, но зато бОльшее количество воркеров поможет сгладить некоторый воркер-leak приложения, которые всегда бывают.


  1. pOmelchenko
    05.09.2021 10:44
    +1

    В конкретно описанном случае решением так же может стать переход на swoole или roadrunner, так как команда laravel подготовила фрэймворк к таким штукам.

    https://laravel.com/docs/8.x/octane


    1. ainu
      05.09.2021 13:27

      В этом случае ожидаем статью вида "Я ускорил laravel на RR, поставив 20 воркеров в .rr.yaml вместо 8".


  1. Goodwinnew
    05.09.2021 11:04

    А смысл вообще обращать внимание на оперативную память и минимизировать число воркеров?

    Если нормальная виртуалка KVM (или свой реальный железный сервер) - там можно своп сделать на диске на 20-30 гиг (уже как правило NVMe) - при исчерпании оперативки (в пике запросов) всё будет работать, но немного медленнее. И то не сильно - так как часть страниц уже заранее собрана и сервер отдает кэш HTML.

    Если OpenVZ - то при исчерпании памяти будет краш (точнее будут выкинуты часть процессов) - но и изначально нет смысла использовать OpenVZ для таких нагруженных приложений, которые хотят одновременно много пользователей.

    И как выше правильно написали - "первым умирает CPU" :)


  1. Fafhrd
    05.09.2021 11:14

    sleep != нагрузка

    в реальности будет гораздо хуже


    1. vanxant
      05.09.2021 14:01

      Ну да, можно было миллион md5 посчитать в цикле


      1. ewolf
        05.09.2021 19:22

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


  1. karabanov
    05.09.2021 17:38
    +1

    Но зачем же текст публиковать в виде картинки? Такой текст нельзя скопировать, нельзя увеличить, нельзя найти встроенным поиском.

    Неужели действительно проще сделать скриншот, возможно как-то его обрезать, залить на хостинг и вставить ссылку, нежели чем скопировать и в ставить текст между тегами code?

    <?php
    echo "Example code";


  1. MrAlone
    05.09.2021 18:49

    Это где такой дефолтовый конфиг php-fpm?


    1. karabanov
      05.09.2021 19:49
      +1

      В Docker контейнере с php-fpm

      Например:

      docker run -it --rm php:7.4.23-fpm-buster php-fpm -tt


  1. 027
    05.09.2021 22:40

    del


  1. catkaff
    06.09.2021 00:28

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


  1. Nnnnoooo
    10.09.2021 11:51

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