Рейтинг:1

Мне просто пришлось увеличить время ожидания с 30 до 60, потому что я не могу понять, почему наш самый большой запрос такой медленный. (Nginx + Php-fpm работает на gke)

флаг tr

версия php-fpm: 7.4 версия нгинкс: 1.19.0

Работаем на gke, kubernetes; наши узлы имеют 10 процессоров и 24 ГБ оперативной памяти, и мы запрашиваем 2 процессора (ограничение 3) для наших модулей, которые запускают наш стек Laravel (nginx + php-fpm). Два сервиса имеют общий модуль, но являются отдельными контейнерами (один для nginx, один для php). Причина, по которой они используют общий модуль, заключается в том, что он засоряет нашу сеть для связи php -> nginx из отдельных модулей (мы использовали nginx / php в отдельных службах/развертываниях).

Кроме того, nginx и php совместно используют соединение через общий файл, который используется как том: e

      - имя: php-сокет
        пустойКаталог: {}
        томМаунты:
        - имя: php-сокет
          Путь монтирования: / носок

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

Но это подводит меня к моему вопросу: почему этот конкретный запрос такой медленный? Я знаю, что это много данных, но это не так. большие данные. Я полагаю, что это 3 МБ без сжатия, но в итоге получается gzip <1 МБ:

изображение, показывающее запросы 247 КБ с временем 47 с

Но это занимает много времени, больше нашего первоначального таймаута в 30 секунд.

Мы знали, что в нашей базе данных будет слишком много данных для экспорта данных за год для 3000 пользователей, поэтому мы кэшируем этот ответ в Redis.И глядя на журналы PHP, мы получаем доступ к кешу и начинаем возвращать ответ менее чем за 1/4 секунды.

Где-то между php -> nginx -> клиент занимает слишком много времени.

Сначала я подумал, что это из-за того, что мы сжимаем большой объем данных; отключение gzip не помогло. Я даже подумал, что это может быть буферизация файлов, которую может выполнять nginx, поэтому я обновил наши нод-диски со 100 ГБ до 200 ГБ и даже с жесткого диска на SSD. Это не помогло. Мы даже неоднократно узнавали, что мы часто являемся крайним случаем, когда дело доходит до конфигурации, поэтому я попытался установить для fastcgi_buffers, proxy_buffers и gzip_buffers безумно высокие значения памяти:

    keepalive_timeout 300;
    fastcgi_send_timeout 300;
    fastcgi_read_timeout 300;
    fastcgi_connect_timeout 120;

    # Попробуйте увеличить размер буфера для загрузки больших оценок
    fastcgi_buffering включен;
    fastcgi_buffers 50000 4k;
    fastcgi_busy_buffers_size 4098 КБ;

    client_max_body_size 128M;
    client_body_buffer_size 45M;

    client_header_buffer_size 16 КБ;
    large_client_header_buffers 32 4k;

    proxy_buffers 50000 4k;
    proxy_buffer_size 4098k;
    proxy_busy_buffers_size 4098k;

    ##
    # Настройки Gzip
    ##

    gzip включен;
    gzip_disable "msie6";
    gzip_vary включен;
    gzip_proxy любой;
    gzip_comp_level 6;
    gzip_buffers 50000 4k;
    gzip_http_версия 1.1;
    gzip_min_length 64;
    gzip_types text/обычный текст/приложение css/приложение json/x-javascript text/xml application/xml application/xml+rss text/javascript application/vnd.ms-fontobject application/x-font-ttf font/opentype image/svg+ xml-изображение/x-иконка;

но это тоже не помогло.

Медленный журнал PHP:

[08-Jul-2021 18:09:48] [pool www] pid 120 - - 
8 июля 2021 г., 11:09:48.478 script_filename = /var/www/public/index.php - - 
8 июля 2021 г., 11:09:48.478 [0x00007fe3cc81baf0] runQueryCallback() /var/www/vendor/laravel/framework/src/Illuminate/Database/Connection.php:629 - - 
8 июля 2021 г., 11:09:48.478 [0x00007fe3cc81b9b0] run() /var/www/vendor/laravel/framework/src/Illuminate/Database/Connection.php:338 - - 
8 июля 2021 г., 11:09:48.478 [0x00007fe3cc81b910] select() /var/www/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php:2159 - - 
8 июля 2021 г., 11:09:48.478 [0x00007fe3cc81b860] runSelect() /var/www/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php:2147 - - 
8 июля 2021 г., 11:09:48.478 [0x00007fe3cc81b760] Illuminate\Database\Query\{closure}() /var/www/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php:2619 - - 
8 июля 2021 г., 11:09:48.478 [0x00007fe3cc81b660] 
8 июля 2021 г., 11:09:48.478 [0x00007fe3cc81b540] get() /var/www/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php:546 - - 
8 июля 2021 г., 11:09:48.478 [0x00007fe3cc81b3c0] getModels() /var/www/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php:530 - - 
8 июля 2021 г., 11:09:48.478 [0x00007fe3cc81b240] get() /var/www/vendor/laravel/framework/src/Illuminate/Database/Concerns/BuildsQueries.php:143 - - 
8 июля 2021 г., 11:09:48.478 [0x00007fe3cc81b1b0] first() /var/www/app/Models/User.php:232 - - 
8 июля 2021 г., 11:09:48.478 [0x00007fe3cc81b070] getAccountAttribute() /var/www/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php:454 - - 
8 июля 2021 г., 11:09:48.478 [0x00007fe3cc81afc0] mutateAttribute() /var/www/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php:350 - - 
8 июля 2021 г., 11:09:48.478 [0x00007fe3cc81ae90] getAttributeValue() /var/www/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php:323 - - 
8 июля 2021 г., 11:09:48.478 [0x00007fe3cc81ada0] getAttribute() /var/www/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php:1550 - - 
8 июля 2021 г., 11:09:48.478 [0x00007fe3cc81acb0] offsetExists() /var/www/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php:1595 - - 
8 июля 2021 г., 11:09:48.478 [0x00007fe3cc81ac40] __isset() неизвестно:0 - - 
8 июля 2021 г., 11:09:48.478 [0x00007fff466902c0] ???() /var/www/app/Models/User.php:236 - - 
8 июля 2021 г., 11:09:48.478 [0x00007fe3cc81abb0] getAccountTypeAttribute() /var/www/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php:454 - - 
8 июля 2021 г., 11:09:48.478 [0x00007fe3cc81ab00] mutateAttribute() /var/www/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php:466 - - 
8 июля 2021 г., 11:09:48.478 [0x00007fe3cc81aa40] mutateAttributeForArray() /var/www/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php:111 - - 
8 июля 2021 г., 11:09:48.478 [08-Jul-2021 18:09:48] ВНИМАНИЕ: завершена трассировка 120 - - 
8 июля 2021 г., 11:09:48.477 [08-Jul-2021 18:09:48] ВНИМАНИЕ: [pool www] child 120, script '/var/www/public/index.php' (запрос: "GET / index.php?clientTimezone=America%2FLos_Angeles") выполняется слишком медленно (6,203325 с), протоколирование - - 
8 июля 2021 г., 11:09:48.477 [08-Jul-2021 18:09:48] ВНИМАНИЕ: ребенок 120 остановлен для отслеживания - - 
8 июля 2021 г. @ 11:09:48.477 [08-Jul-2021 18:09:48] ВНИМАНИЕ: собирается отследить 120

У кого-нибудь есть другие идеи?

Michael Hampton avatar
флаг cz
Вы читали медленный журнал? Это очень четко указывает на вашу базу данных как на источник проблемы. Вот где вы должны искать дальше.
PoorBob avatar
флаг tr
Спасибо, я только что смог понять, что мы обращались к базе данных N раз для каждого отношения, даже к кэшированному ответу при сериализации Json для окончательного оператора возврата.
PoorBob avatar
флаг tr
Честно говоря, больше похоже на 3*N^2. Ух ты. Теперь намного быстрее. Теперь мы загружаем исходный 46-секундный ответ за 2 секунды.
Рейтинг:1
флаг tr

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

Ответить или комментировать

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