LinuxForum.Fans
Тема

Многопоточность и повторяющийся параметр

Автор: valet 27 сообщений 7799 просмотров
#303992

Имеется URL (http://site.ru/script.php), который нужно многопоточно запросить много раз подряд.

Я делаю так: создаю файл urls со 100500 одинаковыми урл-ами:

text
http://site.ru/script.php
http://site.ru/script.php
..
http://site.ru/script.php

И с помощью xargs и wget в даном случае в 10 потоков делаю так:

cat urls | xargs -t -P 10 -n1 wget --quiet -O -

Ну это ж как-то неправильно создавать по 100500 одинаковых урл-ов. Как по-другому можно подавать параметром на xargs тот же самый урл? Уточню, что необходим xargs, так как только он обеспечит многопоточность. Я думаю способ точно есть.

П.С.Тему назвал по-дурацки (но ничего другого не смог придумать), возможно модераторы поправят, если нужно.

#303993

Для этого есть siege

#303994

"neol" написал:
Для этого есть siege
Это совсем не тот инструмент, что мне нужен для данной задачи. siege предназначен для нагрузочного тестирования, то есть кроме просто отправки get-запросов он искусственно создает нагрузку, пересчитывает множество данных, что дает неплохой LA только от его работы.
У меня не стоит задача нагружать собственный сервер да еще и умышленно :). Моя задача: многопоточно запрашивать скрипт по http для его выполнения.
#303997

как-то так можно, если на bash'е и в лоб...

text
for((i=0;i<100500;i++)) do echo http://site.ru/script.php]; done | xargs -t -P 10 -n1 wget --quiet -O -
#303999

"Fat-Zer" написал:
for((i=0;i<100500;i++))
не проверял, но вроде ж как очевидно что не годится, оно сожрет процессор, не разве.
#304000

"Fat-Zer" написал:
и в лоб
это действительно слишком в лоб ))

Вот сейчас по мои идиотским запросам (не знаю как правильно сформулировать) нагугливается watch - вот никак не могу понять как его туда привязать и оно ли это вообще...
#304002
"valet" написал:
не проверял но вроде ж как очевидно что не годится, оно сожрет процессор, не разве.

разве что 386-й...

"valet" написал:
это действительно слишком в лоб ))

как ни крути получше, чем трюк с файлом...

"valet" написал:
Вот сейчас по мои идиотским запросам (не знаю как правильно сформулировать) нагугливается watch - вот никак не могу понять как его туда привязать и оно ли это вообще...

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

#304003

"Fat-Zer" написал:
разве что 386-й...
Не соглашусь, в одном терминале запустил:
text
valet@valet-comp:~$ for((i=0;i<100500;i++)) do echo http://site.ru/script.php; done & for((i=0;i<10050000;i++)) do echo http://site.ru/script.php; done & for((i=0;i<10050000;i++)) do echo http://site.ru/script.php; done & for((i=0;i<10050000;i++)) do echo http://site.ru/script.php; done & for((i=0;i<10050000;i++)) do echo http://site.ru/script.php; done & for((i=0;i<10050000;i++)) do echo http://site.ru/script.php; done & for((i=0;i<10050000;i++)) do echo http://site.ru/script.php; done

во втором видим:

То есть прилично нагружает все 4 ядра. А если таких вот паралельных запусков тоже 100500. В случае cat'ов - пожалуйста - нагрузка 0.

"Fat-Zer" написал:
как ни крути получше, чем трюк с файлом...
неправда, cat работает не нагружаю процессор совсем, держу 100500 таких cat'ов - нагрузка по LA 0.
#304004

Вот вариант с cat'ом специально проделал:

text
valet@valet-comp:~$ for((i=0;i<100500;i++)) do echo http://site.ru/script.php >> file; done
valet@valet-comp:~$ cat file & cat file & cat file & cat file & cat file & cat file & cat file & cat file & cat file & cat file & cat file & cat file & cat file & cat file & cat file & cat file & cat file & cat file & cat file & cat file & cat file & cat file & cat file & cat file & cat file & cat file & cat file & cat file & cat file & cat file & cat file & cat file & cat file & cat file & cat file & 

#304005

Обратите внимание в том числе сколько вызовов cat - процессор не реагирует почти никак - текущая нагрузка такая и держится и без cat от других процессов.

#304006

"Fat-Zer" написал:
как костыль конечно
да чувствую здесь и нужен какой-то костыль :)
#304007
"valet" написал:
siege предназначен для нагрузочного тестирования, то есть кроме просто отправки get-запросов он искусственно создает нагрузку, пересчитывает множество данных, что дает неплохой LA только от его работы.

Какой-то странное у вас представление о его работе, ну да ладно.

text
for i in {1..100500}; do echo "http://site.ru/script.php"; done | xargs -t -P 10 -n1 wget --quiet -O -

Пойдет?

#304008

Кстати, а если это не для нагрузочного тестирования, то зачем дергать один и тот же скрипт 100500 раз?

#304009
"neol" написал:
Какой-то странное у вас представление о его работе, ну да ладно.
"neol" написал:
Какой-то странное у вас представление о его работе, ну да ладно.

Siege – это утилита для нагрузочного тестирования веб-серверов. Она была создана для того чтоб дать разработчикам возможность проверить ресурсоёмкость своего кода в условиях, максимально приближенных к реальным.
В выделенном я подразумеваю что это будут не просто get-запросы, иначе чем бы она отличалась от штатного wget?
С siege когда-то игрался как раз для нагрузочного тестирования. Так вот я помню что там сам запущенный siege солидно жрет ресурсов, уже не говоря о том что он дает нагрузку на сервер куда коннектится - собственно для этого же и сделан этот инструмент :), а мне надо как раз как можно меньше нагрузки давать на свой же собственный сервер.

"neol" написал:
Пойдет?
так ведь опять же цикл :). Ну ребята, ну цикли - это пожирание проца, ну какие циклы :)

"neol" написал:
Кстати, а если это не для нагрузочного тестирования, то зачем дергать один и тот же скрипт 100500 раз?
ну ведь очевидно же, чтобы он 100500 раз исполнился :)
Или вы мне просто не хотите верить, что это моя задача действительно не для нагрузочного тестирования :).
#304010
"valet" написал:
Не соглашусь, в одном терминале запустил:

у тебя терминал тормозит... направь вывод в /dev/null

text
time bash -c '(for((j=0;j<10;j++)); do for((i=0;i<100500;i++)) do echo http://site.ru/script.php; done & done; wait) >/dev/null'

real 0m1.923s user 0m7.164s sys 0m0.250s

конечно cat быстрее и меньше кушает, но как ни крути, узкое место всё равно в wget'е...
к тому же этот файл ещё надо создать...

"valet" написал:
Вот вариант с cat'ом специально проделал:

а вот за такие выкрутасы надо бить по щам...

text
alexander@goblin ~ $ for((i=0;i<100500;i++)) do echo http://site.ru/script.php; done >test_file
alexander@goblin ~ $ bash -c '(cat test_file & cat test_file)' | grep -v '^http://site.ru/script.php$'
http://site.ru/script.phhttp://site.ru/script.php
http://sp
http://site.ruite.ru/script.php
http://site.ru/script.ph/script.php
httpp
http://site.ru/scr://site.ru/script.php
http://site.ipt.php
http://site.ru/sru/script.php
http://site.ru/scripcript.php
http:/t.php
ht/site.ru/script.php
http://site.tp://site.ru/script.php
http://sitru/script.php
http://site.ru/scripe.ru/script.php
http://site.ru/st.php
htcript.php
http://site.ru/script.phtp://site.ru/script.php
http://sitp
http://site.rue.ru/script.php
/script.php
http://site.ru/scriphttp://site.ru/script.php
http://st.php
htite.ru/script.php
http://site.ru/script.phtp://site.ru/script.php
http://site.ru/scrp
http://site.ruipt.php
/script.php
http://site.ru/script.http://site.ru/script.php
http://sphp
httpite.ru/script.php
http://site.ru/script.ph://site.ru/script.php
http://site.p
http:/ru/script.php
http://site.ru/scrip/site.ru/script.php
http://site.rut.php
ht/script.php
http://site.ru/script.tp://site.ru/script.php
http://sitphp
httpe.ru/script.php
://site.ru/script.php
http://site.ru/scriphttp://site.ru/script.php
http://site.ru/st.php
http://sitcript.php
http:/e.ru/script.php
/site.ru/script.php
http://site.ru/script.http://site.ru/script.php
http://site.ru/sphp
http://site.cript.php
http:/ru/script.php
ht/site.ru/script.php
http://site.ru/script.tp://site.ru/script.php
http://site.ru/scrphp
http://site.ipt.php
http://sru/script.php
htite.ru/script.php
http://site.ru/script.phtp://site.ru/script.php
http://site.ru/scrp
http://site.ruipt.php
http://site.ru/scrip/script.php
httpt.php
http://sit://site.ru/script.php
http://site.ru/scripe.ru/script.php
t.php
http://sithttp://site.ru/script.php
http://site.ru/se.ru/script.php
cript.php
http://site.ru/script.phhttp://site.ru/script.php
http://sp
http:/ite.ru/script.php
http://site.ru/s/site.ru/script.php
http://site.ru/script.cript.php
http:/php
http://site./site.ru/script.php
http://site.ru/script.ru/script.php
htphp
http://site.tp://site.ru/script.php
http://site.ru/scrru/script.php
htipt.php
http://stp://site.ru/script.php
http://site.ru/scrite.ru/script.php
ipt.php

за предыдущее в принципе тоже, но echo намного реже будет давать такие осечки...

"valet" написал:
неправда, cat работает не нагружаю процессор совсем, держу 100500 таких cat'ов - нагрузка по LA 0.

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

#304012
"valet" написал:
ну ведь очевидно же, чтобы он 100500 раз исполнился :)
Или вы мне просто не хотите верить, что это моя задача действительно не для нагрузочного тестирования :).

Если она не для нагрузочного тестирования, то у меня есть подозрение, что решаете вы ее не верно.
Зачем привлекать bash, wget и веб сервер к выполнению одного и того же кода, если можно сделать цикл в самом коде с тем же самым результатом?

#304015

"Fat-Zer" написал:
у тебя терминал тормозит... направь вывод в /dev/null
Не силен в каких-то технических деталях, на знаю что там конкретно оно тормозит, но процессор оно заметно нагружает. Хотя я еще попробую в реальных условиях и сообщу результаты.

"Fat-Zer" написал:
узкое место всё равно в wget'е...
узкое в чем? Во времени выполнения - это да и понятно почему, но процессор это не нагружает. А вот цикл нагружает по понятным причинам, а мне желательно не нагружать.

"Fat-Zer" написал:
к тому же этот файл ещё надо создать...
да, но только 1 раз :) А важно чтобы при онлайн работе не тормозило.

"Fat-Zer" написал:
а вот за такие выкрутасы надо бить по щам...
ну я привел чисто для примера чтобы посомтреть какая от этого будет нагрузка. Хотя не знаю почему, но у меня подобной каши при выводе не наблюдалось (если я правильно понял к чему вы клоните).

"neol" написал:
Если она не для нагрузочного тестирования, то у меня есть подозрение, что решаете вы ее не верно.
ну решаю как умею :)

"neol" написал:
Зачем привлекать bash, wget и веб сервер
постараюсь объяснить на примере одного из моих скриптов. Например я написал простенький web-паук на php+curl, который собирает нужную мне статистику. Его функционал в двух словах примерно такой: взять с sqlite-базы ссылку, загрузить страницу, собрать с нее по нужному критерию исходящие ссылки с нее и положить в ту же sqlite-базу. То есть каждый запуск такого скрипта будет проделывать это постоянно увеличивая базу. Тут по понятным причинам не получится применить организовать какой-то цикл внутри скрипта - да и не надо этого.
По поводу почему это bash - ну хотя бы потому чтобы обеспечить постоянную работу этого скрипта - например я могу запустить его многопоточное выполнение прямо с сервера, который постоянно в онлайне - то есть запустил, а он себе собирает базу...
Ну и еще по поводу цикла внутри скрипта - ну никак даже если бы это было логично - для веб-скриптов существует понятие "время выполнения скрипта", он не может выполнятся вечно или очень долго - его как минимум отклонит вебсервер по таймауту.
Ну и по многопоточности все понятно - чем больше ха единицу времени дерну скрипт - тем больше результатов он найдет и запишет в базу.
Вот и получается что скрипт, лежащий на http://site.ru/script.php нужно дергать большое количество раз и желательно многопоточно.
#304018

Без цикла же не обойтись, если только 10500 потоков одновременно запустить...

#304025

"-=Serj=-" написал:
Без цикла же не обойтись, если только 10500 потоков одновременно запустить...
ну как же - пример с cat'ом без цикла работает :)
#304027
"valet" написал:
ну как же - пример с cat'ом без цикла работает

Ну, насколько я понимаю, цикл присутствует внутри xargs.

Войдите или зарегистрируйтесь, чтобы ответить.