laravel — использование процессора PHP и памяти

Я изучаю PHP и Laravel. Компания, в которой я работаю, имеет веб-приложение, построенное на чистом PHP. Я заметил, что когда вы выполняете что-то вроде обновления базы данных из большого CSV-файла, который требует значительных ресурсов процессора и памяти, с веб-приложением практически ничего нельзя сделать. Например, обновление чьей-либо учетной записи чем-то незначительным и не требующим значительных ресурсов процессора и памяти. В основном, делая первые кирпичи системы, пока это не будет сделано. Смотря на TOP на сервере Linux показывает использование процессора на уровне 99% и использование памяти значительно выше.

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

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

РЕДАКТИРОВАТЬ: И когда я говорю «брикет системы», я имею в виду сам сервер, так что веб-приложение администратора PHP и веб-приложение клиента Python действительно не отвечают на запросы.

1

Решение

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

<?php
session_start();

/* pre-game stuff that depends on $_SESSION */

session_write_close();

/* long-running stuff that doesn't need to update $_SESSION */

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

Приложение:

  1. Уволить любого, кто сделал эту схему из 956 столбцов, только для varchar.
  2. Если вставки будут такими медленными, я держу пари, что кто-то ушел и добавил слишком много индексов.
  3. Если вы работаете на самом дешевом экземпляре с общим процессором и общедоступным облаком, вы вполне можете использовать все свои ресурсы центрального процессора. Я перерисовал центральный процессор GCE микро-экземпляра, просто записав большой файл на быстрый диск.
1

Другие решения

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

Если мы говорим о веб-сайте, это шаги

  • DNS обновлен, поэтому он разрешает более 1 IP. Таким образом, не имеет значения, какой IP-адрес возвращается браузеру или один из серверов в пуле DNS умирает первым. Amazon Route 53 — это то, что мы используем. И это круто.

  • Далее идет веб-сервер. Когда IP-адрес «попал», запрос поступает на веб-сервер. Мы используем nginx (так как nginx это — как вы уже догадались — потрясающе). Поскольку в пуле DNS имеется несколько IP-адресов, доступно несколько веб-серверов. Опять же, не имеет значения, какой веб-сервер будет обрабатывать запрос клиента — избыточность для выигрыша.

  • nginx либо обслуживает статический контент, либо передает запрос в PHP, если выполняется правило. Мы используем php-fpm, Каждый из nginx серверы прокси HTTP-запрос к кластеру php-fpm узлы. На обычном языке — он выбирает еще один компьютер в кластере компьютеров, который обслуживает PHP. Не имеет значения, какой узел PHP будет обрабатывать запрос — избыточность для выигрыша.

  • PHP теперь выполняет некоторую работу, подключается к базе данных и — как вы уже догадались — он «говорит» с кластером баз данных. Базы данных синхронизированы, есть целые книги на эту тему, поэтому я не буду вдаваться в подробности. Опять же, неважно, какой БД получает запрос — избыточность для выигрыша (на самом деле есть много способов справиться с этим).

  • Серверы баз данных оптимизированный для типа работы, которую они делают — это означает, что они оптимизированы для чтения или письма. База данных или любое другое решение для хранения данных — это не бесконечная черная дыра, которую вы можете заполнить просто так. Вы должны тщательно выбрать, что сервер будет делать — он напишет? Будет ли он использоваться для чтения? Сколько писем это сделает? Сколько чтений это сделает? Каков план увеличения объема работы? По сути, вам нужно оптимизировать сервер базы данных — вы определенно не может использовать конфигурацию MySQL по умолчанию. Если у вас есть большие рабочие нагрузки, которые могут перегружать базу данных, вы используете механизм организации очередей, который может сопоставлять несколько вставок и сбрасывать их в одной транзакции — этот метод использует пропускную способность жестких дисков и обменивает ее на ввод-вывод (в основном это означает, что это хорошо и работает быстро).

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

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

3

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

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

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

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

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

Laravel очень хорошо поддерживает консольные задания или очереди в фреймворке.

2
По вопросам рекламы [email protected]