使用 Bash

使用 Bash

这是我的 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 42curl定义一次运行多少个。
-n 23定义每次调用将处理多少个请求curl-n 1禁用批处理。

使用 Bash

#! /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

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

相关内容