できるだけ速く多くのcurlコマンドを実行する

できるだけ速く多くのcurlコマンドを実行する

私は自宅の Raspberry Pi でローカルにデータを収集しており、そのデータを Web 上のサーバー上の REST API (私が所有) にできるだけ早く送信したいと考えています。

ローカルに収集されたデータは、1 秒あたり 100 レコードもの速度で流れる可能性があります。

ループ内で curl コマンドを実行すると、データが送信されます... 200 応答を待ってから次のレコードを処理します... 内部データ フローよりもはるかに遅くなります。

Stackoverflow でいくつかのヒントを見つけて、それを適用しようとしましたが、curl コマンドを並列に送信できませんでした。

私のコードは(特に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 ~ 5 ミリ秒のオーバーヘッドがあり、1 秒あたり 100 エントリに近づきます。これを軽減するには、 でラップしますparallel --pipe。これにより、100 コアのマシンで 1 秒あたり約 25,000 ジョブを並列に実行できます。

#!/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... &。シェル コマンドの最後にアンパサンドを置くのは、セミコロンを使用するのと同じです;が、プロセスをバックグラウンドにフォークする点が異なります。

関連情報