Автор оригинала: David Wong.
Свул Колонка, созданная командой ядра, постепенно посвятит себя написанию статей Свул Процесс разработки, принцип реализации, практика применения и так далее, мы можем лучше обмениваться, учиться и строить вместе PHP Экология.
Прошлый год Свул Запущен 4.0 Полная поддержка после версии PHP Процесс Co, мы можем реализовать его на основе процесса CO CSP Программирование, восклицают сторонние разработчики, исходный PHP-код также может быть написан таким образом. Свул По умолчанию процесс co основан на планировании ввода-вывода. Если в программе есть блок, текущий процесс co будет автоматически освобожден. Мы не будем здесь обсуждать преимущества процесса CO. Если это IO , плотные сцены могут работать хорошо. Но для процессора Интенсивные сценарии приведут к некоторым процессам сотрудничества, поскольку они недоступны CPU Срез времени умер от голода.
Мы планировали достичь этого в начале этого года Swool Упреждающее планирование для решения проблемы несбалансированного планирования в некоторых сценариях. Мы испытали несколько версий среди нас, и здесь я хотел бы поделиться с вами мотивацией и решениями в процессе разработки.
Наша цель состоит в том, чтобы сбалансировать планирование каждого процесса CPU Время, например, время выполнения расписания 3 относительно велико, поэтому мы должны CPU Активное прерывание времени без зависимости Ввода-вывода События для получения среднего времени выполнения для каждого процесса.
Сначала наша идея заключалась в том, что PHP Если он достигнет предела, он может автоматически отказаться от текущего процесса. Потому что, в конце концов, очень немногие люди пишут плоским способом, что занимает много времени Процессор Большинство кодов управляются условиями цикла. Мы подключаем инструкцию цикла, каждый раз, когда мы выполняем инструкцию цикла, мы проверяем время выполнения программы. Мы рады получить оригинальную версию. Но это скорее взлом, и код операции после opcache После оптимизации ситуация немного усложнится.
Позже мы использовали PHP Из тиков Механизма, то есть PHP Во время компиляции кода команды inject ticks могут выполнять соответствующие функции. В этих функциях мы можем определить время обработки сопрограммы для достижения упреждающего эффекта, но здесь есть проблема, PHP Из объявления(галочки=N) Синтаксис, допустимый только для текущей области действия сценария, то есть проект немного больше, требуется возможно включить Входящий скрипт, не введенный автоматически галочки Команда, так что Swool Разработчики почти неприемлемы. Мы также стараемся дать PHP Официально предлагается АТР. Вы можете установить глобальное значение по умолчанию в слое расширения галочки , но чиновник не желает принимать наше представление, потому что чиновник считает, что эта функция имеет большую потерю производительности, и ее можно PHP8 удалить Эта функция. На самом деле, потеря этой производительности не велика после фактического измерения, и мы проверили это в производственной среде и добились замечательных результатов, то есть мы можем дать некоторые CPU Плотная логическая часть делает все время обслуживания более сбалансированным. На рисунке ниже представлено сравнение статистики вызывающих абонентов интерфейса RPC в нашей производственной среде. Время ожидания клиента составляет 2 секунды, и это время ожидания является ошибкой. Нет упреждающего планирования с левой стороны и упреждающего планирования с правой стороны. Можно обнаружить, что с левой стороны всегда есть случайный тайм-аут. После оптимизации нет тайм-аута запроса, а время отклика на запрос очень плавное, что повышает стабильность работы сервиса. Как видно из приведенного выше рисунка, благодаря добавлению упреждающего планирования устраняется заусенец высокого времени запроса, что делает среднее время запроса более плавным и стабильным.
Хотите сделать упреждающее планирование, для PHP Есть два способа
- Однопоточный
PHPС помощью инструкций по выполнению вы можетеPHPВнедрите логику в процесс выполнения, чтобы проверить время выполнения, а такжеSwoolМожет переключаться между различными процессами для достижения упреждающегоCPUЦель. - Рассмотрите возможность запуска потока и проверьте время выполнения текущего процесса выполнения.
После того, как вы попробовали вышеуказанные методы, количество инструкций по инъекциям в основном не может получить официальную поддержку. Мы можем только найти другой выход, открыть дополнительный поток и проверить только текущий процесс. Конкретный подход заключается в использовании PHP-7.1.0 Введен Прерывание виртуальной машины Механизм: по умолчанию проверьте, достигает ли текущий процесс максимального времени выполнения каждые 5 мс. Значение по умолчанию-10 мс. Если он превысит, текущий процесс будет выпущен и будут достигнуты другие процессы Захватить Цель.
Пример кода
Нужно Свул 4.4 Или позже
php ini_set("swoole.enable_preemptive_scheduler","1"); $start = microtime(1); echo "start\n"; $flag = 1; go(function () use (&$flag) { echo "coro 1 start to loop\n"; $i = 0; for (;;) { if (!$flag) { break; } $i++; } echo "coro 1 can exit\n"; }); $end = microtime(1); $msec = ($end - $start) * 1000; echo "use time $msec\n"; go(function () use (&$flag) { echo "coro 2 set flag = false\n"; $flag = false; }); echo "end\n";
результаты правоприменения
start coro 1 start to loop use time 11.121988296509 coro 2 set flag = false end coro 1 can exit
Можно обнаружить, что логика кода может быть автоматически сгенерирована из первой сопрограммы yield Выйти и выполнить второй процесс. Без этой функции второй процесс никогда не будет выполнен, что приведет к голоду. Таким образом, второй процесс может быть выполнен гладко. После окончательного выполнения первый процесс продолжит выполнение. Достигните нашей второй инициативы Захватить Первое сотрудничество ПРОЦЕССОР Эффект.
Эта функция очень полезна в производственной среде, особенно для систем реального времени или сценариев, зависящих от времени отклика.
Спасибо вам за вашу долгосрочную поддержку и внимание к свулу.
Оригинал: “https://developpaper.com/detailed-explanation-of-swoole-4-4-co-process-preemptive-scheduler/”