Эта страница была переведена сообществом и не обязательно является актуальной. Обратитесь к справочной версии.

Эта страница была переведена сообществом и не обязательно является актуальной. Обратитесь к справочной версии.

Эта страница была переведена сообществом и не обязательно является актуальной. Обратитесь к справочной версии.

Спонсор
Производительность

Производительность

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

# Количество потоков и worker-скриптов

По умолчанию FrankenPHP запускает потоков и worker-скриптов (в worker режиме) вдвое больше, чем количество доступных процессорных ядер.

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

Чтобы найти подходящие параметры, лучше всего провести нагрузочные тесты, имитирующие реальный трафик.
Хорошими инструментами для этого являются k6 и Gatling.

Чтобы настроить количество потоков, используйте опцию num_threads в директивах php_server и php.
Для изменения количества worker-скриптов используйте опцию num в секции worker директивы frankenphp.

# Worker режим

Включение Worker режима значительно улучшает производительность,
но ваше приложение должно быть адаптировано для совместимости с этим режимом:
необходимо создать worker-скрипт и убедиться, что приложение не имеет утечек памяти.

# Избегайте использования musl

Статические бинарники, которые мы предоставляем, а также Alpine Linux-вариант официальных Docker-образов используют библиотеку musl libc.

Известно, что PHP значительно медленнее работает с этой библиотекой по сравнению с традиционной GNU libc, особенно при компиляции в ZTS режиме (потокобезопасный режим), который требуется для FrankenPHP.

Кроме того, некоторые ошибки проявляются исключительно при использовании musl.

В производственной среде настоятельно рекомендуется использовать glibc.

Это можно сделать, используя Debian Docker-образы (по умолчанию) и компилируя FrankenPHP из исходников.

В качестве альтернативы мы предоставляем статические бинарники, скомпилированные с аллокатором mimalloc, что делает FrankenPHP+musl быстрее (но всё же медленнее, чем FrankenPHP+glibc).

# Настройка среды выполнения Go

FrankenPHP написан на языке Go.

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

Рекомендуется установить переменную окружения GODEBUG в значение cgocheck=0 (по умолчанию в Docker-образах FrankenPHP).

Если вы запускаете FrankenPHP в контейнерах (Docker, Kubernetes, LXC и т.д.) и ограничиваете доступную память, установите переменную окружения GOMEMLIMIT в значение доступного объёма памяти.

Для более детальной информации ознакомьтесь с документацией Go по этой теме.

# file_server

По умолчанию директива php_server автоматически настраивает файловый сервер для обслуживания статических файлов (ресурсов), хранящихся в корневой директории.

Эта функция удобна, но имеет издержки. Чтобы отключить её, используйте следующую конфигурацию:

php_server {
    file_server off
}

# Плейсхолдеры

Вы можете использовать плейсхолдеры в директивах root и env.
Однако это предотвращает кеширование значений и существенно снижает производительность.

По возможности избегайте использования плейсхолдеров в этих директивах.

# resolve_root_symlink

По умолчанию, если корневая директория документа является символьной ссылкой, она автоматически разрешается FrankenPHP (это необходимо для корректной работы PHP).
Если корневая директория документа не является символьной ссылкой, вы можете отключить эту функцию.

php_server {
    resolve_root_symlink false
}

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

# Логи

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

# Производительность PHP

FrankenPHP использует официальный интерпретатор PHP.
Все стандартные оптимизации производительности PHP применимы к FrankenPHP.

В частности:

Для более детальной информации ознакомьтесь с документацией Symfony о производительности (большинство советов полезны даже если вы не используете Symfony).

Редактировать эту страницу