Net::HTTP - out of memory и нерабочий "use pages"

  • Автор темы Автор темы John
  • Дата начала Дата начала

John

A-Parser Enterprise License
A-Parser Enterprise
Приветствую!

Два вопроса по 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. В консоль браузера вылезает ошибка (см. скрин).
Снимок.PNG
Баг?
 
2) Почему-то после добавления опции "use pages" ничего не происходит в интерфейсе - т.е. ничего не добавляется. Ни в Parser Test ни в Task editor. Баг?

Да, баг, исправлен в версии 1.1.138

по поводу первого вопроса - анализирую
 
Может у меня с пресетом что-то не так? Или какие-то настройки нужно скорректировать... Подскажите, пожалуйста. Сайт, который я пытаюсь парсить, отдает 7-8 тыс. строк по 38 на странице (это где-то 211 сраниц) - не может же апарсер падать при таком малом объеме.

С пресетом все нормально
в связи с некоторыми особенностями работы парсера в данном конкретном случае парсер будет использовать много памяти и может падать если её не достаточно, решение пока одно, отключить многопоточную обработку результатов(доступно с версии 1.1.144):

Код:
./aparser -nofork
 
Forbidden, а нормальное решение (без отключения многопоточности) планируется? И если да, то как скоро?
А то я тут хотел лицензию продлевать, но пока не вижу смысла - однопоточный скрипт с 1 регуляркой и 1 циклом я и сам могу написать за 10 минут.
 
А то я тут хотел лицензию продлевать, но пока не вижу смысла - однопоточный скрипт с 1 регуляркой и 1 циклом я и сам могу написать за 10 минут.

под -nofork имеется ввиду отключения обработки на нескольких ядрах процессора, в остальном парсер также остается многопоточным
 
Я попробовал запустить апарсер с ключом -nofork, при запуске теста получаю ошибку "Error: ResultsProcessor: Error create ResultsProccesor(fork)".
Снимок.PNG

Как быть?
 
я же написал что эта опция доступна с версии 1.1.144
 
У меня сейчас такая же проблема:
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, парсинг же без прокси идет
 
ну в этом и причина, для такой задачи ставить больше 1000 вообще смысла нет, лучше в районе 500, парсинг же без прокси идет
Почему нет смысла? Это не парсинг у меня, а чекер.
При 8к у меня выдет 26к/мин, а при 1к - всего 8к/мин. Смысл, как бы, очевиден.

Не получится никак устранить эту утечку памяти?:(
 
это не утечка памяти, у тебя стоит лимит размера страницы 1 мб, т.е. 8000 потоков х 1мб = 8000 мб памяти ТОЛЬКО на хранение содержимого страниц, хотя в среднем каждый поток может использовать в 2-4 раза больше памяти чем размер буфера. если учесть что A-Parser под Linux может использовать не более 4гб памяти то вполне очевидно что он будет постоянно падать в такой конфигурации

разница в скорости скорее всего мнимая, связана с огромным числом ошибок из за перегрузки парсера по процессору\каналу\днс и т.п.
 
это не утечка памяти, у тебя стоит лимит размера страницы 1 мб, т.е. 8000 потоков х 1мб = 8000 мб памяти ТОЛЬКО на хранение содержимого страниц, хотя в среднем каждый поток может использовать в 2-4 раза больше памяти чем размер буфера. если учесть что A-Parser под Linux может использовать не более 4гб памяти то вполне очевидно что он будет постоянно падать в такой конфигурации

разница в скорости скорее всего мнимая, связана с огромным числом ошибок из за перегрузки парсера по процессору\каналу\днс и т.п.
А если я поставлю лимит, например, 100кб? Но большое число потоков выставлю, это решит проблему?
И еще, если лимит 100кб, а старница весит 200кб, он загрузит только часть или вообще не скачает?
 
Если установите маленький лимит, страницы с большим размером будут загружаться не полностью.
 
  • Like
Реакции: Bran
загрузит часть, судя по пресету идет анализ страницы на наличие переменных, скорее всего этот скрипт располагается в начале страниц и лимит можно сократить до 10кб

но даже в этом случае 8000 потоков может быть неоправданно много, необходимо сравнивать следующие показатели
  • загрузка 1 ядра CPU процессом апарсера
  • загрузка канала
  • скорость парсинга
  • количество ошибок парсинга
провести тесты на разном числе потоков: 1k, 2k, 4k, 5k
 
загрузит часть, судя по пресету идет анализ страницы на наличие переменных, скорее всего этот скрипт располагается в начале страниц и лимит можно сократить до 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

Может проблема в регулярных выражениях?..
 
Назад
Верх