
저는 집에서 Raspberry Pi를 통해 로컬로 일부 데이터를 수집하고 있으며 웹 서버에 있는 REST API(제가 소유하고 있음)로 데이터를 최대한 빨리 보내고 싶습니다.
로컬로 수집된 데이터는 초당 100개의 레코드만큼 빠르게 흐를 수 있습니다.
루프에서 컬 명령을 실행하면 데이터가 전송됩니다. 200 응답을 기다린 후 다음 레코드를 처리합니다. 내부 데이터 흐름보다 훨씬 느립니다.
여기 Stackoverflow에서 몇 가지 힌트를 발견하고 이를 적용하려고 시도했지만 컬 명령을 병렬로 보내지 않습니다.
내 코드가 가장 예쁘지 않다는 것을 알고 있으며(특히 mycurl 함수 사용에 대해) 제안을 받을 준비가 되어 있습니다.
#!/bin/bash
host="localhost"
port="********"
mycurl() {
data="field1=${1}&field2=${2}&field3=${3}&field4=${4}&field5=${5}&field6=${6}&field7=${7}&field8=${8}&field9=${9}&field10=${10}"
curl --output /dev/null -d $data --silent -X POST https://myapi/myendpoint;
}
export -f mycurl
#----------------------LOOP starts------------------------
while true;
do
nc -d $host $port | while IFS="," read -r f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12 f13 f14 f15 f16 f17 f18 f19 f20 f21 f22
do
if [ "$f15" != "" ]; then
seq 1000 | parallel --no-notice --joblog log -j0 mycurl ::: ${f5} ::: ${f7} ::: ${f8} ::: ${f15} ::: ${f16} ::: ${17} ::: ${18} ::: ${19} ::: ${20} ::: ${21};
fi
done
done
답변1
GNU Parallel에는 작업당 2-5ms의 오버헤드가 있어 초당 100개 항목에 가까워지고 있습니다. 이를 완화하려면 parallel --pipe
. 이는 100개 코어 머신에서 초당 약 25000개의 작업을 병렬로 실행해야 합니다.
#!/bin/bash
host="localhost"
port="********"
mycurl() {
if [ "${15}" != "" ]; then
# The numbering here should probably be adjusted
data="field1=${1}&field2=${2}&field3=${3}&field4=${4}&field5=${5}&field6=${6}&field7=${7}&field8=${8}&field9=${9}&field10=${10}"
curl --output /dev/null -d $data --silent -X POST https://myapi/myendpoint;
fi
}
export -f mycurl
#----------------------LOOP starts------------------------
while true;
do
nc -d $host $port
done |
parallel -j100 --pipe --block 100k parallel --colsep , -j0 mycurl
답변2
curl
각 호출을 백그라운드로 분기해 보는 것은 어떨까요 ? curl
... &
. 쉘 명령 끝에 앰퍼샌드를 넣는 것은 세미콜론을 사용하는 것과 비슷하지만 ;
프로세스를 백그라운드로 분기한다는 점만 다릅니다.