與重擊

與重擊

這是我的 shell 腳本:

for i in `seq 1 $1`; do
    filename=randomfile$(uuidgen).txt
    head -c $2 </dev/urandom > $filename
    checksum256=$(sha256sum $filename | awk '{ print $1 }')
    attrs=$(jq -n --arg cf "$checksum256" '{ "confidential":"N", "transactionId": "sdf", "codiDirCorp": "CorpCode", "expiration": "10/10/2025", "description": "desc", "locked": "N", "title": "titol", "docHash": $cf }')

    curl -X POST \
        'http://localhost:8083/documents?application=RDOCUI&user=nif' \
        -F docFile=@$filename \
        -F 'docAttributes='"${attrs}"''
done

如您所見,我正在生成幾個具有隨機內容的文件。

之後,我只需執行一個curl 請求即可上傳它們。

為了執行該命令,我只需輸入:

$ ./stress.sh 1000 200K

在這裡,我產生了 1000 個文件和 1000 個上傳請求。

我想加快它並行運行這些請求的速度。

有任何想法嗎?

答案1

Xargs 可以在前台執行此操作,它可讓您控制並行性和批次。 Curl 將重複使用一個開啟的連線來大量發送所有請求。

-P 42定義curl一次運行多少個。定義每次呼叫將處理
-n 23多少個請求。禁用批次處理。curl-n 1

與重擊

#! /bin/bash

URL='http://localhost:8083/documents?application=RDOCUI&user=nif'

for i in `seq $1`
do
    filename=randomfile$(uuidgen).txt
    head -c $2 </dev/urandom > $filename
    export checksum256=$(sha256sum $filename | awk '{ print $1 }')
    attrs=$(jq -n '{ "foo": "bar", "docHash": env.checksum256 }')

    printf -- '--next %q -F docFile=@%q -F docAttributes=%q\0' "$URL" "$filename" "$attrs"
done |
    xargs -0 -n 23 -P 42 bash -c 'eval "$0" "$@"' curl

for循環將\0空格分隔的參數組寫入管道以供 Xargs 讀取。這些參數要傳遞給 Curl。 Xargs 依序將它們傳遞給 Bash,因此它們被指派給"$1", "$2", ...(又稱"$@")。現在我們用來eval取消參數分組。任何特殊字元都已使用 正確轉義printf %q,因此 Bash 不會執行任何不必要的引號刪除或分詞操作。 "$0" "$@"將擴展到curl --next http://l... --next ...

Curl 將嘗試僅進行一次 TCP 握手,並重複使用該持久連線來傳送其參數中列出的所有請求。根據請求大小,可能會帶來一些明顯的加速。

附破折號

Dash 不支持printf %q,但如果您的 JSON 格式可以被犧牲(透過jq -c),您可以使用 來轉義它printf '%s'。我們也必須依賴這樣的假設:JSON 和其他參數都不包含'.

#! /bin/sh

# ...

    attrs=$(jq -n -c '{ "foo": "bar", "docHash": env.checksum256 }')

    printf -- "--next %s -F 'docFile=@%s' -F 'docAttributes=%s'\0" "$URL" "$filename" "$attrs"
done |
    xargs -0 -n 23 -P 42 sh -c 'eval "$0" "$@"' curl

沒有for

您特別詢問了有關並行運行請求部分的問題。但是如果您想並行運行整個腳本,您可以按以下方式鍵入命令

$ seq 1000 | xargs -n 1 -P 42 ./stress.sh 1 200K

答案2

你可以隨時看看諾哈普

for i in `seq 1 $1`; do
    filename=randomfile$(uuidgen).txt
    head -c $2 </dev/urandom > $filename
    checksum256=$(sha256sum $filename | awk '{ print $1 }')
    attrs=$(jq -n --arg cf "$checksum256" '{ "confidential":"N", "transactionId": "sdf", "codiDirCorp": "CorpCode", "expiration": "10/10/2025", "description": "desc", "locked": "N", "title": "titol", "docHash": $cf }')

    nohup curl -X POST \
        'http://localhost:8083/documents?application=RDOCUI&user=nif' \
        -F docFile=@$filename \
        -F 'docAttributes='"${attrs}"''
done

nohup 告訴 shell 在背景執行該進程,無需使用者輸入,忽略掛斷訊號。所以你應該同時執行多個 CURL

相關內容