Неожиданная смерть cli-скрипта

sgrin

Guest
Неожиданная смерть cli-скрипта

Есть скрипт, выполняющийся по cron'у и обрабатывающий большой (~55 Mb) xml-файл.
Команда выглядит так (запускается из shell-скрипта):

unzip -p big_xml_file.zip | xml_to_db.php

Скрипт успевает обработать около 3х Мб, а потом:

update.sh: line 59: 20354 Done unzip -p big_xml_file.zip
20355 Killed | xml_to_db.php

Все это происходит на хостинге и результат получаю по почте.

Версия php 4.3.10
max_execution_time => 0
max_input_time => 30
memory_limit => 72M

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

iliah

Новичок
наверное выходишь за memory_limit
ты ведь этому процессу (xml_to_db.php) передаешь весь распакованный файл, и в нем же его обрабатываешь
как вариант, сначала распаковывай в отдельный файл, потом кусочками читай
 

sgrin

Guest
Вставил в скрипт периодический вывод memory_get_usage() - успевает дойти до 3х мегабайт
Или эта функция что-то другое показывает?
 

iliah

Новичок
да, только если ты посмотришь на вывод команды `ps` - увидишь совсем другие цифры в колонках VSZ и RSS
а вот по какому значению php убивает процесс, это надо спросить у тех, кто видел исходники
 

sgrin

Guest
увеличил memory_limit до 150 Мб - все равно дальше ни на байт не проходит :(
Но проверить надо...
Спасибо за помощь, iliah

PS Влияет ли здесь max_input_time ?
 

iliah

Новичок
в мане написано, что влияет на "POST, GET and file uploads"
относится ли сюда время передачи аргументов командной строки в скрипт, не знаю,
но в любом случае 30 сек на распаковку твоего файла должно хватать
 

Screjet

Новичок
На хостинге не полные отморозки, а потому ограничивают время CPU юзерских процессов.

Закачивай себе на рабочую машину и там проводи манипуляции.
 

sgrin

Guest
Пришел ответ от службы поддержки:
причина в загрузке cpu
script used 60% CPU time in 3 seconds.
1 hits, 0 left

script used 64% CPU time in 3 seconds.
2 hits, sent SIGKILL

Я так понял, скрипт превышает ограничение(видимо 60%) нагрузки CPU в течение 3 секунд, да еще и два раза :)

Может кто-нибудь знает, как снизить эту нагрузку - поделитесь, пожалуйста.
 

Screjet

Новичок
_ничего_ты_не_сделаешь_
Это ОСь ограничивает использование процессора. Тебе отведено, скажем, 1000 тактов и все.(точка) Не вложился = это твои проблемы.
А если хочешь решать всякого рода задачи посредством сервера, покупай выделенный сервер.

зы. Если найдешь дыру, как обойти ограничение процессорного времени, пиши!
 

sgrin

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

Пробовал снизить нагрузку с помощью nice - не помогло
Тогда вставил в ключевые места скрипта usleep - пока работает, но медленно :)

Если пройдет нормально, надо будет подбирать параметр usleep, чтоб не убили, но и не тормозил...

Спасобо за помощь
 

AnToXa

prodigy-одаренный ребенок
хммм, а можт разбивать архив на несколько кусков и обрабатывать скажем не более 300K, потом делать fork и новым процессом продолжать? :)
ну или сразу форкаться штук в 100 процессов.
правда фрядли сие хостеру понравится :)
 
Сверху