Приветствую! Два вопроса по Net::HTTP 1) Сделал несложный пресет для парсера Net:HTTP eyJwcmVzZXQiOiJBbGliYWJhIFNFUlAiLCJ2YWx1ZSI6eyJwYXJzZXJzIjpbWyJO ZXQ6OkhUVFAiLCJkZWZhdWx0Iix7InR5cGUiOiJvdmVycmlkZSIsImlkIjoicXVl cnlmb3JtYXQiLCJ2YWx1ZSI6Imh0dHA6Ly93d3cuYWxpYmFiYS5jb20vdHJhZGUv c2VhcmNoP2ZzYj15JkluZGV4QXJlYT1wcm9kdWN0X2VuJkNhdElkPSZTZWFyY2hU ZXh0PSRxdWVyeSJ9LHsidHlwZSI6Im92ZXJyaWRlIiwiaWQiOiJ1c2Vwcm94eSIs InZhbHVlIjpmYWxzZX0seyJ0eXBlIjoiY3VzdG9tUmVzdWx0IiwicmVzdWx0Ijpb InBhZ2VzIiwiZGF0YSJdLCJyZWdleCI6IjxoMiBjbGFzcz1cInRpdGxlXCI+PGEg aHJlZj1cIiguKj8pXCIuKj88ZGl2IGNsYXNzPVwiYXR0clwiPltcXHNcXHRdK1VT IFxcJChbMC05XFwuXSspKD86LShbMC05XFwuXSspKSAvIDxlbT4oLio/KTwvZW0+ IDxlbT5cXCggKC4qPylcXCk8L2VtPi4qPzxkaXYgY2xhc3M9XCJhdHRyXCI+W1xc c1xcdF0rKC4qPykgPGVtPlxcKE1pbi4gT3JkZXJcXCk8L2VtPiIsInJlZ2V4VHlw ZSI6ImlzZyIsInJlc3VsdFR5cGUiOiJhcnJheSIsImFycmF5TmFtZSI6Iml0ZW1z IiwicmVzdWx0cyI6WyJ1cmwiLCJwcmljZV9taW4iLCJwcmljZV9tYXgiLCJwcmlj ZWl0ZW0iLCJwcmljZXR5cGUiLCJtb3EiXX0seyJ0eXBlIjoib3ZlcnJpZGUiLCJp ZCI6ImZvcm1hdHJlc3VsdCIsInZhbHVlIjoiJGl0ZW1zLmZvcm1hdCgnJHByaWNl X21pbiwgJHByaWNlX21heCwgJHByaWNlaXRlbSwgJHByaWNldHlwZSwgJG1vcSwg JHVybFxcbicpIn0seyJ0eXBlIjoib3B0aW9ucyIsImlkIjoiY2hlY2tOZXh0UGFn ZSIsInZhbHVlIjoiPGEgY2xhc3M9XCJuZXh0XCIgaHJlZj1cIiguKj8pXCIifV1d LCJyZXN1bHRzRm9ybWF0IjoiJHAxLnByZXNldCIsInJlc3VsdHNTYXZlVG8iOiJm aWxlIiwicmVzdWx0c0ZpbGVOYW1lIjoiJGRhdGVmaWxlLmZvcm1hdCgpLnR4dCIs ImFkZGl0aW9uYWxGb3JtYXRzIjpbXSwicmVzdWx0c1VuaXF1ZSI6Im5vIiwicXVl cnlGb3JtYXQiOlsiJHF1ZXJ5Il0sInVuaXF1ZVF1ZXJpZXMiOmZhbHNlLCJzYXZl RmFpbGVkUXVlcmllcyI6ZmFsc2UsIml0ZXJhdG9yT3B0aW9ucyI6eyJvbkFsbExl dmVscyI6ZmFsc2V9LCJkb0xvZyI6Im5vIiwia2VlcFVuaXF1ZSI6Ik5vIiwibW9y ZU9wdGlvbnMiOmZhbHNlLCJyZXN1bHRzUHJlcGVuZCI6IiIsInJlc3VsdHNBcHBl bmQiOiIiLCJxdWVyeUJ1aWxkZXJzIjpbXSwicmVzdWx0c0J1aWxkZXJzIjpbXSwi Y29uZmlnT3ZlcnJpZGVzIjpbXX19 В качестве query использую запрос "quad copters". К сожалению, апарсер умирает со следующей записью в логе: Dec 7 11:46:35.90145 parser started Dec 7 11:46:36.82101 starting task 53 Dec 7 11:46:38.70188 loading before not loaded iterator Dec 7 11:47:18.15907 task 53 paused Dec 7 11:56:48.70583 starting task 54 Out of memory! Dec 7 11:59:33.40766 [Master] end called, pid 12038 OK, BYE! | at (eval 285) line 1. Dec 7 11:59:33.41642 [Worker/12041] end called, pid 12041 Dec 7 11:59:33.42383 [Template of 12038] exit called, pid 12039 OK, BYE! | at (eval 285) line 1. Dec 7 11:59:33.42791 [Worker/12040] end called, pid 12040 DESTROY created new reference to dead object 'Parser::Child::ResultsProcessor' during global destruction. create template(main) at build/core.to_build.pl line 1687. created template 12279 at build/core.to_build.pl line 1696. На сервере 1024Мб памяти, убунта, версия апарсера - 1.1.135 Может у меня с пресетом что-то не так? Или какие-то настройки нужно скорректировать... Подскажите, пожалуйста. Сайт, который я пытаюсь парсить, отдает 7-8 тыс. строк по 38 на странице (это где-то 211 сраниц) - не может же апарсер падать при таком малом объеме. 2) Почему-то после добавления опции "use pages" ничего не происходит в интерфейсе - т.е. ничего не добавляется. Ни в Parser Test ни в Task editor. В консоль браузера вылезает ошибка (см. скрин). Баг?
С пресетом все нормально в связи с некоторыми особенностями работы парсера в данном конкретном случае парсер будет использовать много памяти и может падать если её не достаточно, решение пока одно, отключить многопоточную обработку результатов(доступно с версии 1.1.144): Код: ./aparser -nofork
Forbidden, а нормальное решение (без отключения многопоточности) планируется? И если да, то как скоро? А то я тут хотел лицензию продлевать, но пока не вижу смысла - однопоточный скрипт с 1 регуляркой и 1 циклом я и сам могу написать за 10 минут.
под -nofork имеется ввиду отключения обработки на нескольких ядрах процессора, в остальном парсер также остается многопоточным
Я попробовал запустить апарсер с ключом -nofork, при запуске теста получаю ошибку "Error: ResultsProcessor: Error create ResultsProccesor(fork)". Как быть?
У меня сейчас такая же проблема: DESTROY created new reference to dead object 'Parser::Child::ResultsProcessor' during global destruction. Тоже ubuntu. Только памяти 16. Версия 1.1.355 Сейчас тестирую ./aparser -nofork Но думаю, может есть более правильное решение?.. Код: Dec 19 03:03:12.71122 [Worker/30268] end called, pid 30268 DESTROY created new reference to dead object 'Parser::Child::ResultsProcessor' during global destruction. Dec 19 03:03:12.76533 [Template of 30260] exit called, pid 30261 OK, BYE! | at (eval 299) line 1. Dec 19 03:03:12.76645 [Worker/30272] end called, pid 30272 OK, BYE! | at (eval 301) line 1. OK, BYE! | at (eval 301) line 1. Dec 19 03:03:12.76717 [Worker/30350] end called, pid 30350 Dec 19 03:03:12.76747 [Worker/30351] end called, pid 30351 create template(main) at build/core.to_build.pl line 850. created template 30388 at build/core.to_build.pl line 859. Dec 19 03:03:32.9777 parser started Dec 19 03:03:35.76794 starting task 5 Dec 19 03:03:37.02157 loading before not loaded iterator Dec 19 03:03:37.21174 resuming queries/alldomains2.txt at 173857 line Out of memory! Dec 19 04:13:54.79036 [Master] end called, pid 30386 tls: destroy before close at build/core.to_build.pl line 5083, <$__ANONIO__> line 5 during global destruction. tls: destroy before close at build/core.to_build.pl line 5083, <$__ANONIO__> line 5 during global destruction. DESTROY created new reference to dead object 'Parser::Child::ResultsProcessor' during global destruction. Dec 19 04:13:55.70952 [Template of 30386] exit called, pid 30388 OK, BYE! | at (eval 299) line 1. OK, BYE! | at (eval 299) line 1. Dec 19 04:13:55.71183 [Worker/30394] end called, pid 30394 Dec 19 04:13:55.71205 [Worker/30393] end called, pid 30393 create template(main) at build/core.to_build.pl line 850. created template 32189 at build/core.to_build.pl line 859. Dec 19 11:57:35.58063 parser started Dec 19 11:57:37.77764 starting task 5 Dec 19 11:57:38.87626 loading before not loaded iterator Dec 19 11:57:38.98969 resuming queries/alldomains2.txt at 220804 line create template(main) at build/core.to_build.pl line 850. created template 4316 at build/core.to_build.pl line 859. Dec 19 12:15:04.79704 parser started Dec 19 12:15:08.49044 starting task 5 Dec 19 12:15:09.77752 loading before not loaded iterator Dec 19 12:15:10.05387 resuming queries/alldomains2.txt at 231036 line Out of memory! Dec 19 13:36:20.20102 [Master] end called, pid 4315 DESTROY created new reference to dead object 'Parser::Child::ResultsProcessor' during global destruction. OK, BYE! | at (eval 299) line 1. Dec 19 13:36:20.85594 [Worker/4331] end called, pid 4331 Dec 19 13:36:21.00673 [Template of 4315] exit called, pid 4316 OK, BYE! | at (eval 299) line 1. Dec 19 13:36:21.00767 [Worker/4330] end called, pid 4330 create template(main) at build/core.to_build.pl line 850. created template 6948 at build/core.to_build.pl line 859. Dec 19 13:39:11.29192 parser started
./aparser -nofork не помогло Код: Dec 19 13:43:52.7009 parser started Dec 19 13:43:55.08435 starting task 5 Dec 19 13:43:56.31419 loading before not loaded iterator Dec 19 13:43:56.4596 resuming queries/alldomains2.txt at 288729 line Out of memory! Dec 19 15:19:44.73554 [Master] end called, pid 7098 tls: destroy before close at build/core.to_build.pl line 5083, <$__ANONIO__> line 17 during global destruction. Dec 19 15:37:56.56994 parser started Dec 19 15:37:59.3465 starting task 5 Dec 19 15:38:00.61389 loading before not loaded iterator Dec 19 15:38:00.82063 resuming queries/alldomains2.txt at 375153 line
Код: eyJwcmVzZXQiOiJzYW1wbGUiLCJ2YWx1ZSI6eyJwcmVzZXQiOiJzYW1wbGUiLCJw YXJzZXJzIjpbWyJOZXQ6OkhUVFAiLCJub3Byb3gyIix7InR5cGUiOiJmaWx0ZXIi LCJyZXN1bHQiOiJkYXRhIiwiZmlsdGVyVHlwZSI6InJlbWF0Y2giLCJ2YWx1ZSI6 IlxcJG1DMXx2YXIgXFwkTU0yfGZcXChcXCdNQ18xIiwib3B0aW9uIjoiIn0seyJ0 eXBlIjoib3ZlcnJpZGUiLCJpZCI6ImZvcm1hdHJlc3VsdCIsInZhbHVlIjoiJHF1 ZXJ5XFxuIn0seyJ0eXBlIjoiZmlsdGVyIiwicmVzdWx0IjoiZGF0YSIsImZpbHRl clR5cGUiOiJub3Rjb250YWluIiwidmFsdWUiOiI8bGluayBocmVmPVwiaHR0cDov L3duLmNvbSIsIm9wdGlvbiI6InNlbnMifV1dLCJyZXN1bHRzRm9ybWF0IjoiJHAx LnByZXNldCIsInJlc3VsdHNTYXZlVG8iOiJmaWxlIiwicmVzdWx0c0ZpbGVOYW1l IjoiY29uZmlnZXIxLnR4dCIsImFkZGl0aW9uYWxGb3JtYXRzIjpbXSwicmVzdWx0 c1VuaXF1ZSI6Im5vIiwicXVlcnlGb3JtYXQiOlsiaHR0cDovLyRxdWVyeS97c3Vi czphYWF9Il0sInVuaXF1ZVF1ZXJpZXMiOmZhbHNlLCJzYXZlRmFpbGVkUXVlcmll cyI6ZmFsc2UsIml0ZXJhdG9yT3B0aW9ucyI6eyJvbkFsbExldmVscyI6ZmFsc2Us InF1ZXJ5QnVpbGRlcnNBZnRlckl0ZXJhdG9yIjpmYWxzZSwicXVlcnlCdWlsZGVy c09uQWxsTGV2ZWxzIjpmYWxzZX0sInJlc3VsdHNPcHRpb25zIjp7Im92ZXJ3cml0 ZSI6ZmFsc2V9LCJkb0xvZyI6Im5vIiwia2VlcFVuaXF1ZSI6Ik5vIiwibW9yZU9w dGlvbnMiOmZhbHNlLCJyZXN1bHRzUHJlcGVuZCI6IiIsInJlc3VsdHNBcHBlbmQi OiIiLCJxdWVyeUJ1aWxkZXJzIjpbXSwicmVzdWx0c0J1aWxkZXJzIjpbXSwiY29u ZmlnT3ZlcnJpZGVzIjpbXX0sInBhcnNlcnNDb25mUHJlc2V0cyI6eyJOZXQ6OkhU VFAiOnsibm9wcm94MiI6eyJ1c2VyLWFnZW50IjoiTW96aWxsYS80LjAgKGNvbXBh dGlibGU7IE1TSUUgNi4wOyBXaW5kb3dzIE5UIDUuMTsgU1YxKSIsInF1ZXJ5Zm9y bWF0IjoiJHF1ZXJ5IiwiaGVhZGVycyI6IiIsImJyb3dzZXIiOmZhbHNlLCJnb29k Q29kZSI6IiIsImRvX2d6aXAiOnRydWUsImJvZHkiOiIiLCJ0aW1lb3V0IjoiMTIi LCJtZXRob2QiOiJHRVQiLCJ1c2Vwcm94eSI6ZmFsc2UsIm9ubHloZWFkZXJzIjpm YWxzZSwiY29va2llcyI6IiIsInByb3h5cmV0cmllcyI6IjIiLCJyZXF1ZXN0ZGVs YXkiOiI0IiwicHJveHliYW5uZWRjbGVhbnVwIjoiMzAwIiwiZm9ybWF0cmVzdWx0 IjoiJGNvZGUgJHJlYXNvblxcbiRoZWFkZXJzXFxuXFxuJGRhdGEiLCJkZXRlY3Rj aGFyc2V0IjpmYWxzZSwicmVjdXJzZSI6IjciLCJtYXhfc2l6ZSI6IjEwNDg1NzYi fX19fQ==
ну в этом и причина, для такой задачи ставить больше 1000 вообще смысла нет, лучше в районе 500, парсинг же без прокси идет
Почему нет смысла? Это не парсинг у меня, а чекер. При 8к у меня выдет 26к/мин, а при 1к - всего 8к/мин. Смысл, как бы, очевиден. Не получится никак устранить эту утечку памяти?
это не утечка памяти, у тебя стоит лимит размера страницы 1 мб, т.е. 8000 потоков х 1мб = 8000 мб памяти ТОЛЬКО на хранение содержимого страниц, хотя в среднем каждый поток может использовать в 2-4 раза больше памяти чем размер буфера. если учесть что A-Parser под Linux может использовать не более 4гб памяти то вполне очевидно что он будет постоянно падать в такой конфигурации разница в скорости скорее всего мнимая, связана с огромным числом ошибок из за перегрузки парсера по процессору\каналу\днс и т.п.
А если я поставлю лимит, например, 100кб? Но большое число потоков выставлю, это решит проблему? И еще, если лимит 100кб, а старница весит 200кб, он загрузит только часть или вообще не скачает?
загрузит часть, судя по пресету идет анализ страницы на наличие переменных, скорее всего этот скрипт располагается в начале страниц и лимит можно сократить до 10кб но даже в этом случае 8000 потоков может быть неоправданно много, необходимо сравнивать следующие показатели загрузка 1 ядра CPU процессом апарсера загрузка канала скорость парсинга количество ошибок парсинга провести тесты на разном числе потоков: 1k, 2k, 4k, 5k
Я поставил всего 500 потоков. Но парсер все равно умирает. Различие лишь в том что это происходит позже. Если 5к ~ 8ч. В случае с 2к ~ 12ч. При 500 потоках: Код: Jan 13 15:51:30.99653 parser started Jan 13 15:51:31.68891 starting task 5 Jan 13 15:51:34.49398 loading before not loaded iterator Jan 13 15:51:34.51673 resuming queries/alldomains2.txt at 6639260 line Out of memory! Jan 15 21:25:07.58431 [Master] end called, pid 14233 DESTROY created new reference to dead object 'Parser::Child::ResultsProcessor' during global destruction. Jan 15 21:25:08.17426 [Template of 14233] exit called, pid 14234 OK, BYE! | at (eval 299) line 1. OK, BYE! | at (eval 299) line 1. OK, BYE! | at (eval 299) line 1. OK, BYE! | at (eval 299) line 1. OK, BYE! | at (eval 299) line 1. Jan 15 21:25:08.17987 [Worker/14254] end called, pid 14254 OK, BYE! | at (eval 299) line 1. OK, BYE! | at (eval 299) line 1. Jan 15 21:25:08.17975 [Worker/14245] end called, pid 14245 OK, BYE! | at (eval 299) line 1. Jan 15 21:25:08.18006 [Worker/14258] end called, pid 14258 OK, BYE! | at (eval 299) line 1. Jan 15 21:25:08.17981 [Worker/14241] end called, pid 14241 OK, BYE! | at (eval 299) line 1. Jan 15 21:25:08.18051 [Worker/14248] end called, pid 14248 OK, BYE! | at (eval 299) line 1. OK, BYE! | at (eval 299) line 1. Jan 15 21:25:08.18092 [Worker/14257] end called, pid 14257 Jan 15 21:25:08.18124 [Worker/14259] end called, pid 14259 OK, BYE! | at (eval 299) line 1. Jan 15 21:25:08.18114 [Worker/14249] end called, pid 14249 Jan 15 21:25:08.18126 [Worker/14253] end called, pid 14253 Jan 15 21:25:08.18181 [Worker/14252] end called, pid 14252 OK, BYE! | at (eval 299) line 1. Jan 15 21:25:08.18103 [Worker/14260] end called, pid 14260 OK, BYE! | at (eval 299) line 1. OK, BYE! | at (eval 299) line 1. Jan 15 21:25:08.18216 [Worker/14242] end called, pid 14242 OK, BYE! | at (eval 299) line 1. Jan 15 21:25:08.18386 [Worker/14251] end called, pid 14251 Jan 15 21:25:08.18182 [Worker/14256] end called, pid 14256 OK, BYE! | Connection reset by peer at (eval 299) line 1. Jan 15 21:25:08.18403 [Worker/14247] end called, pid 14247 Jan 15 21:25:08.18376 [Worker/14250] end called, pid 14250 OK, BYE! | at (eval 299) line 1. Jan 15 21:25:08.18519 [Worker/14244] end called, pid 14244 Jan 15 21:25:08.18604 [Worker/14246] end called, pid 14246 OK, BYE! | at (eval 299) line 1. Jan 15 21:25:08.18663 [Worker/14243] end called, pid 14243 Jan 15 21:25:08.18732 [Worker/14255] end called, pid 14255 Может проблема в регулярных выражениях?..