Будет ли sleep () в скрипте A запускать скрипт B? - PullRequest
0 голосов
/ 06 марта 2020

У меня есть несколько сценариев, которые запускаются много раз каждый день. Некоторые бегут каждые 5 минут, другие каждые 10, 15, 60 минут и т. Д. c. Большинство сценариев имеют дело с большими объемами данных, которые обрабатывают каждую строку и обрабатывают каждую строку.

Cron моего хоста не позволяет мне решать, когда запускается каждый сценарий, я могу выбрать только число с интервалом в несколько минут, поэтому сценарии, которые запускаются каждые 5 минут, работают с 00,05,10,15 ... и сценарии, которые запускаются каждые 10 минут, работают с 00,10,20,30 ... et c.

Это означает, что многие сценарии запускаются с 00.

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

Я где-то читал, что сон Функция остановит ЦП от обработки данных и позволит запускать меньшие задачи. Вы знаете, так ли это? Если бы я вставлял sleep (1) после каждого l oop во многие из этих сценариев, это улучшило бы производительность, которую видят отдельные пользователи, выполняющие небольшие задачи, то есть позволили бы им пропустить строку?

Пример скрипта A, который запускается каждые 5 минут

foreach ($a_hundred_things as $one_thing) {
  do_this($one_thing);
  // would adding sleep(1); here improve performance?
}

Скрипт B, который запускается, когда пользователь нажимает кнопку

do_this_thing_that_only_takes_a_minute();

В данный момент, если скрипт, такой как Script A (и многие другие, как это), пользователь иногда должен будет ждать (несколько минут), чтобы запустить сценарий B. Я бы хотел, чтобы B мог как-то иметь приоритет, поскольку это то, что не может ждать, в то время как автоматические сценарии c могут позволить себе быть отложенными.

Будет ли добавление sleep (1) в сценарий A (и все остальные похожие скрипты, запущенные одновременно) улучшают производительность? Я знаю, что мог бы попробовать это проверить, но там задействовано много сценариев, и, похоже, это происходит не каждый раз.

1 Ответ

0 голосов
/ 07 марта 2020

Прежде всего, usleep() позволяет вам указать, сколько микросекунд вы хотите спать, и является превосходной функцией.

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

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

    usleep(mt_rand(0,10000000));
    
  2. Дросселирование гетто. Измерьте время, которое требуется для выполнения одной итерации l oop, а затем поспите долго. Вы фактически сократили производительность в два раза.

    while($condition) {
      $start = microtime(true);
      // do work
      usleep( (microtime(true) - $start) * 1000000) );
    }
    

Фактические решения, над которыми вам следует поработать, обратите внимание, что они не являются взаимоисключающими:

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

  2. Используйте модель очереди / работника для асинхронных задач c и Используйте cron только для периодической отправки заданий на обработку. Это примерно равно:

    1. Создание обобщенного рабочего процесса.
    2. Настройка очереди задач. [Я рекомендую AMQP-совместимые системы очередей и лично предпочитаю RabbitMQ]
    3. Ускорение одного или нескольких рабочих процессов, что-то вроде Supervisord упрощает работу небольшого стада рабочих.

Упс! Вы реализовали оба из них? Это называется «горизонтальное масштабирование» и то, как мы создаем современные приложения в 2020 году. Теперь вы можете раскрутить машины и процессы по требованию и по мере необходимости, возможно, даже автоматически. Извините за удобство. :P

...