Есть ли лучший способ уступить процессор другим процессам в PHP? - PullRequest
3 голосов
/ 28 апреля 2011

У меня есть несколько длительных PHP-скриптов CLI, которые регулярно запускаются через cron. Я бы хотел, чтобы они выполнялись как можно быстрее, но не оказывали серьезного влияния на другие процессы (такие как скорость отклика веб-сервера).

В настоящее время я запускаю скрипт с

nice -n 19

, а также экспериментировали со вставкой очень коротких вызовов usleep (), таких как 50 микросекунд, в мой основной цикл. Тем не менее, это не всегда дает так же быстро, как хотелось бы на одноядерной виртуальной машине. Кстати, я не насыщаю оперативную память, поэтому никакой подкачки не происходит.

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

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

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

Ответы [ 4 ]

2 голосов
/ 28 апреля 2011

Если nice не подходит вам, подумайте о выборе другого планировщика для вашего ядра. Это проблема с приоритетами процессов в вашей ОС. Это не то, что вы можете легко решить внутри своего приложения (написано ли оно на PHP или любом другом языке).

Да, и помните, nice уровни действительно не срабатывают, если только вы не испытываете жажду циклов ЦП. Если ваш процессор в основном простаивает, то даже процессу с хорошим уровнем 19 разрешается съесть все циклы процессора, которые он хочет.

Редактировать : На самом деле, прежде чем идти по этому пути, убедитесь, что вы привязаны к процессору. Если вы связаны с вводом / выводом, то расстановка приоритетов ЦП не будет иметь большого эффекта.

1 голос
/ 28 апреля 2011

"спать в течение 0 раз" - это, как правило, лучшее, что можно сделать, чтобы "немедленно сдать контроль" .Другие методы обычно требуют работы в режиме ядра (и даже режим ядра может быть прерван аппаратными прерываниями, в зависимости от).

При «0 тайм-аутах» процесс (или поток) будет запланирован для выполнения «снова»какой-то момент в [ближайшем] будущем »- точные гарантии зависят от системы.Минимальное разрешение на самом деле спит зависит от среды и конфигурации системы (как правило, это не будет действительно «0 раз»).Точное время, которое обычно дается, не гарантируется в системах, отличных от реального времени (например, Linux или Windows) - планировщик будет делать то, что хочет.

Счастливое кодирование.

1 голос
/ 28 апреля 2011

В целом Linux очень консервативен.Но вы можете попробовать schedtool и libmlock.Последний заключается в блокировке php в оперативной памяти, чтобы избежать обмена.Также вы можете попробовать swapiness, потому что в основном очень высокий.Вы также можете попробовать скомпилировать php самостоятельно с помощью агрессивных флагов или даже с помощью компилятора Intel C (у меня есть лицензия на продажу).IMO schedtool - это то же самое, что и nice, но с некоторыми другими переменными.

0 голосов
/ 29 апреля 2011

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

Например, допустим, у вас есть большой XML-файл для импорта. Вместо того, чтобы делать все в PHP, вы всегда можете попытаться преобразовать ваш XML-файл в формат CSV, используя инструмент CLI xsltproc, который даст вам файл, с которым PHP будет легче работать.

...