Как правильно распределить нагрузку скрипта на CPU

EugeneVB

Новичок
Как правильно распределить нагрузку скрипта на CPU

Всем привет!
Такая проблема:
скрипт парсит xml файл, в котором, например, 1000 записей
каждая запись это ссылка на картинку, название товара и его описание.
картинка берется посредством file_get_contents(), потом изменяются её размеры и сохраняются два варианта - эскиз и большой размер. Остальные данные записываются в mysql.

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

А вот как справится с ограничением по нагруске на CPU 10%?

вчера парсил файл на 1500 записей, нагрузка подскочила до 13%, повезло что хостер не заблокировал. Причем не могу понять почему такое происходит, ведь скрипты выполняются последовательно, по пять секунд.
 

mity

Новичок
Предположим что на сервере в сумме 4 логических процессора, таким образом ваш скрипт будучи постоянно запускаемым, при низкой загруженности сервера, может спокойно отъесть 25% CPU.

Самый простой способ избежать этого, это наверно вставлять sleep(). Текущею нагрузку скрипта на сервер можно попытаться получить из массива
PHP:
print_r(getrusage());
[ru_utime.tv_usec] => 294
[ru_utime.tv_sec] => 0 
[ru_stime.tv_usec] => 5869
[ru_stime.tv_sec] => 0
 

EugeneVB

Новичок
Что-то не могу разобраться,
в хелпе написано
ru_utime.tv_usec - user time used (microseconds)
т.е. время работы пользователя
что такое ru_stime.tv_sec не нашел

поэкперементировал с разным временем выполнения скрипта, значения растут, но как это использовать не понял.
 

mity

Новичок
Посмотрите Как узнать в скрипте - далеко ли еще до max_execution_time?

В общем идея примерно такая
PHP:
$start=microtime(true);
....
Длительный процесс
....
$delta_1=microtime(true)-$start;//с запасом

$ar=getrusage();
$delta_2= //возможно не всегда может давать корректные результаты
  ((float)$ar[ru_utime.tv_usec])/1000000)+$ar[ru_utime.tv_sec]+
  ((float)$ar[ru_stime.tv_usec])/1000000)+$ar[ru_stime.tv_sec];

$cpu_count=4;
$overload=   (((float)(10.0)) /100)*$cpu_count; //Допустимая нагрузка

//пропорция delta/(delta+sleep_)=$overload

$sleep_=$overload/$delta_1)-$delta_1;
if($sleep_>0)
  sleep(round($sleep_+1));//Запас для sleep
 

EugeneVB

Новичок
не совсем понятно, где потом используется $delta_2

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

можно растягивая выполнение снизить нагрузку на процессор?

p.s. Извините за такие вопросы, просто оценить нагрузку на процессор могу только в случае сильного скачка и примерно через полчаса после теста. Хостинг.
 

mity

Новичок
Я Вам привёл две дельты, берите любую на выбор
$delta_2 имеет смысл использовать когда в скрипте есть длительные операции не загружающие cpu, например получение данных с других серверов.
usleep() может использовать процессор, поэтому лучше использовать именно sleep()
 
Сверху