bash и многопоточность запросов [Решено]

так этож и есть лень, в своей полезной форме )
или так:
$ cat /home/uniq-ex120201.log|while read n; do curl -Is "$n" | grep Content-Length >>sums.txt & ; done
$ awk '{ SUM += $2} END { print SUM }' sums.txt
Если админ не ленивый, то это не настоящий админ, вариант
Лень, чувство юмора, немытая чашка - сакральные черты админа ))
Лозунг у них был такой: "Познание бесконечности требует бесконечного времени". С этим я не спорил, но они делали из этого неожиданный вывод: "А потому работай не работай — все едино". И в интересах неувеличения энтропии Вселенной они не работали. (с)
yozan
или так:
$ cat /home/uniq-ex120201.log|while read n; do curl -Is "$n" | grep Content-Length >>sums.txt & ; done
$ awk '{ SUM += $2} END { print SUM }' sums.txt

вот так “дешевле”
for n in `cat /home/uniq-ex120201.log`; do curl -I " ....
и за -s для curl спасибо, быстрее запрос работает.

вообще по факту, оба предложенных варианта порождают тучи запросов (что логично ввиду наличия &) - все упирается в скорость порождения процессов.
за 2000 штук запросов живет одномоментно.

в результате бэкенд часть запросов дропнул, придется как то обуздать стихию ))
zubastiy
оба предложенных варианта порождают тучи запросов (что логично ввиду наличия &) - все упирается в скорость порождения процессов.
за 2000 штук запросов живет одномоментно.

в результате бэкенд часть запросов дропнул, придется как то обуздать стихию ))
Вообще-то я для того и задал количество одновременных процессов (у меня 10, можно выставить больше или меньше), чтобы их не стало слишком много – иначе получается нечто сильно похожее на форк-бомбу.
Natrio
zubastiy
оба предложенных варианта порождают тучи запросов (что логично ввиду наличия &) - все упирается в скорость порождения процессов.
за 2000 штук запросов живет одномоментно.

в результате бэкенд часть запросов дропнул, придется как то обуздать стихию ))
Вообще-то я для того и задал количество одновременных процессов (у меня 10, можно выставить больше или меньше), чтобы их не стало слишком много – иначе получается нечто сильно похожее на форк-бомбу.

кажется нашел.

допустим файл 1000 строк

let S=W/10 # делим на десять процессов

получили порцию в 100 строк

sed -n “$i,$((i+S))p” $file | funct &
100 строк передали на подсчет.

… а если в файле миллион - то и породится 100 тыщ процессов

чтобы по десять процессов работало, по идее нужно так

# цикл создания процессов
file=file.log # берём этот список
W=`wc -l < $file` # считаем строки
S=10 #объявляем нужное колво процессов
for ((i=1;i<=W;i+=S+1))
do
 # берём порцию строк и направляем на стандартный ввод экземпляру функции подсчёта
 sed -n "$i,$((i+S))p" $file | funct &
done
получилось вот такой скрипт по подсчету

sh scripts/cont.sh /home/uniq-ex120203.log 10 | awk ‘{a+=$1}END{print a}’

#!bin/bash
W=`wc -l < $1`
let S=$2
for ((i=1;i<=W;i+=S+1))
do
        for q in `sed -n "$i,$((i+S))p" $1`
        do curl -Is "`echo $q`" | grep Content-Length | cut -f2 -d" " &
        done | awk '{a+=$1}END{print a}'
done

спасибо откликнувшмся за ценные замечания.
опять полезное погружение в проблему получилось, праздник )
ЗЫ
Результаты прогона тестовых запросов (по 5-10 тысяч ссылок) показали что при запросах попадающих в кеш бэкенда, увеличение колва потоков запросов больше 2 не влияет на общую скорость.
При 10 тыщ запросах в один поток было потрачено 2 минуты 7 секунд
Теже 10 тыщ запросов в 2 потока - 1 минута 10 секунд
Теже 10 тыщ запросов в 10 потоков - 1 минута 7 секунд

Если запрос не попадает в кеш, то уровень многопоточности начинает сказываться.
Рестартанул сервис с картинками, однопотоковый запрос - 200к отработал за 200 минут
Рестартанул сервис с картинками, 80 потоковый запрос - 200к отработал за 52 минуты
Рестартанул сервис с картинками, 10 потоковый запрос - 200к отработал за 78 минут
zubastiy
100 строк передали на подсчет.
… а если в файле миллион - то и породится 100 тыщ процессов
Оооо боже!… :)
Простите, я же не предлагал форкать каждый запрос!
Я потому и предложил разделить обработку на ФИКСИРОВАННОЕ (у меня 10) количество параллельных процессов, чтобы каждый из них у себя внутри выдавал запросы ПОСЛЕДОВАТЕЛЬНО.
Natrio
zubastiy
100 строк передали на подсчет.
… а если в файле миллион - то и породится 100 тыщ процессов
Оооо боже!… :)
Простите, я же не предлагал форкать каждый запрос!
Я потому и предложил разделить обработку на ФИКСИРОВАННОЕ (у меня 10) количество параллельных процессов, чтобы каждый из них у себя внутри выдавал запросы ПОСЛЕДОВАТЕЛЬНО.
Ыыы. Вот я … назаблуждался то )
Спасибо еще раз. Пошел думать как функцию написать с stdin
Что значит как? Так же, как и скрипт.
funct() {
 while read line
 do
  команда $line
  ...
 done
}
 
Зарегистрироваться или войдите чтобы оставить сообщение.