Как обрабатывать пики ввода-вывода процессора во время выполнения PHP-скрипта cronjob - PullRequest
2 голосов
/ 27 июля 2011

Привет, у меня некоторые скачки ЦП из-за PHP-скрипта, который я запускаю каждые 30 минут. Скрипт отправляет твиты подписанным пользователям Твиттера каждый день, и есть много пользователей. Таким образом, в основном, когда PHP-скрипт отправляет твиты, это вызывает скачок ЦП.

Я прошу указать, как мне справиться с этой ситуацией. Большое спасибо.

Ответы [ 2 ]

2 голосов
/ 28 июля 2011

USleep

Просто маленький usleep вернет ЦП другому доступному процессу (планирование ЦП) .

Hog

Возьмем этот простой скрипт, например:

<?php

for ($i=0;$i<1000000;$i++) {
    echo "$i\n";
}

Этот процесс в среднем потребляет 20% моего процессорного времени.

Расписание

Этот простой скрипт потребляет только 10% процессорного времени в averqage.

<?php

for ($i=0;$i<1000000;$i++) {
    echo "$i\n";
    usleep(100);
}

Конечно, этот скрипт занимает немного больше времени, но процессор лучше спланирован. Чем дольше вы будете спать, тем лучше будет процессорный график. usleep(1000) например, используется только 2% времени процессора.

Я проверял это на своем Ubuntu Box

No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 10.10
Release:    10.10
Codename:   maverick

Очередь сообщений

Кроме того, ваша операционная система очень хороша в планировании процессов (конечно, этот процесс должен быть дружественным к вашему ЦП), поэтому я бы посоветовал вам использовать очередь сообщений для ускорения вашей работы (отправка твитов). Например, Redis также можно использовать в качестве очереди сообщений или beanstalkd . Запустите несколько рабочих процессов, которые обрабатывают работу (рассылка твитов). В качестве бонуса вы не несете цену нерестовых процессов, которая является относительно дорогой. В сети более чем достаточно информации, доступной через очередь сообщений.

1 голос
/ 27 июля 2011

Купить больше мощности процессора или [u]sleep() каждый n запросов.

Вы также можете получить процессорзагрузить с sys_getloadavg и решить, нужно ли (и сколько) вам sleep().Имейте в виду, что слишком много сна может привести к тому, что каждый КРОН займет больше 30 минут.

...