У нас есть API для работы с изображениями PHP, написанный в Code Igniter на основе imagemagic. У нас есть API, лежащее в основе nginx/php-fpm. Мы знаем, что часть Imagemagic тяжелая, но мы стараемся сделать общую пропускную способность все выше и выше.
Мы просмотрели более 30 статей по оптимизации Nginx. Мы смогли увеличить производительность с 300 запросов/минуту до 350 запросов/минуту, в основном следуя статьям и выполняя оптимизации TCP.
Этим мы серьезно повлияли на время загрузки сервера. Я могу сказать, что средней нагрузки нет, так как это новый ящик, и он основан на Nginx. У нас были Apache workers (менее 300 запросов/минуту). Теперь при 350req/m у нас средняя нагрузка 20. Это слишком много, и мы хотим улучшить.
Когда мы используем htop для исследования процессов, обычно мы видим около 20 процессов php-fpm, которые интенсивно используют все 16 ЦП, а память составляет где-то 2 ГБ из 24 ГБ.
Мы стремимся радикально снизить нагрузку на систему. Я хотел бы, чтобы опытные пользователи поделились своими знаниями, где искать, что пробовать. Я опубликую любые цифры, которые вы запросите, но я не хотел заполнять этим пост в начале.
Как бы вы поступили, чтобы снизить нагрузку на систему, сохранив при этом пропускную способность?
решение1
Поскольку мы установили, что это проблема чистого CPU-пожирателя (без iowait), то я действительно не вижу способа сохранить ту же пропускную способность без добавления дополнительных ресурсов. Либо уменьшите максимальное количество PHP-процессов, либо добавьте больше ядер CPU.
Или заставить разработчиков использовать что-то другое, а не ImageMagick..
решение2
Если у вас повторяются запросы, вы можете проверить кэш fastcgi (http://wiki.nginx.org/HttpFastcgiModule) или используйте Varnish перед nginx.
Это позволит вам кэшировать обработанные изображения и не придется снова выполнять тяжелые процессы ЦП.
решение3
Поскольку в вашем вопросе указано, что процессы PHP-FPM находятся в TOP-процессоре, я полагаю, что вы используете библиотеки PHP ImageMagick (http://php.net/imagick).
Попросите своего разработчика(ов) протестировать сценарий, в котором обработка изображений выполняется непосредственно двоичным файлом ImageMagick (например, /usr/bin/[compare, import, display ...].
Если использование двоичного файла напрямую работает, то используйте функцию php exec() и инкапсулируйте вызов двоичных файлов ImageMagick, а затем посмотрите, как это будет работать (с точки зрения загрузки ЦП и продолжительности).
@Дополнительная информация:https://stackoverflow.com/questions/4323672/how-do-i-get-imagemagick-installed
решение4
Пути разработчиков
- попробуйте уменьшить нагрузку на PHP при обработке изображений.
- попробуйте использовать меньше ресурсов для обработки изображений. Используйте подготовленные изображения или измените некоторые операции с меньшими требованиями к производительности
Административный путь
- использовать более мощные процессоры