0

アップロードするたびにかなり大きなデータデータベースをキャッシュする必要があるため、それを処理するbashスクリプトを作成しました。スクリプトは、サイトに対して4つの並列カールを開始する必要があります。完了したら、ファイルに保存されているURLリストから次のカールを開始します。

理論的にはすべてが正常に機能し、ローカルマシンからターゲットサイトまで実行4プロセスを実行するとコンセプトが機能します。

MAX_NPROC = 1を設定した場合、ブラウザがURLにヒットした場合と同じくらいの時間がかかります。つまり20秒です。MAX_NPROC= 2を設定した場合、リクエストにかかった時間は3倍になります。

私は何かが足りないのですか?それは私たちを遅くしているapache設定ですか?それとも、これは私が見逃している秘密のcURL設定ですか?

どんな助けでもありがたいです。以下のbashスクリプトを見つけてください

#!/bin/bash

if [[ -z $2 ]]; then
    MAX_NPROC=4 # default
else
    MAX_NPROC=$2
fi

if [[ -z $1 ]]; then
    echo "File with URLs is missing"
    exit
fi;

NUM=0
QUEUE=""

DATA=""
URL=""

declare -a URL_ARRAY
declare -a TIME_ARRAY
ERROR_LOG=""

function queue {
    QUEUE="$QUEUE $1"
    NUM=$(($NUM+1))
}

function regeneratequeue {
    OLDREQUEUE=$QUEUE

    echo "OLDREQUEUE:$OLDREQUEUE"


    QUEUE=""
    NUM=0
    for PID in $OLDREQUEUE
    do
        process_count=`ps ax | awk '{print $1 }' | grep -c "^${PID}$"`

        if [ $process_count -eq 1 ] ; then
            QUEUE="$QUEUE $PID"
            NUM=$(($NUM+1))
        fi
    done

}

function checkqueue {
    OLDCHQUEUE=$QUEUE
    for PID in $OLDCHQUEUE
    do

        process_count=`ps ax | awk '{print $1 }' | grep -c "^${PID}$"`

        if [ $process_count -eq 0 ] ; then
            wait $PID
            my_status=$?
            if [[ $my_status -ne 0 ]]
            then
                echo "`date` $my_status ${URL_ARRAY[$PID]}" >> $ERROR_LOG
            fi

            current_time=`date +%s`
            old_time=${TIME_ARRAY[$PID]}
            time_difference=$(expr $current_time - $old_time)

            echo "`date` ${URL_ARRAY[$PID]} END ($time_difference seconds)" >> $REVERSE_LOG

            #unset TIME_ARRAY[$PID]
            #unset URL_ARRAY[$PID] 

            regeneratequeue # at least one PID has finished
            break
        fi
    done
}

REVERSE_LOG="$1.rvrs"
ERROR_LOG="$1.error"

echo "Cache STARTED at `date`" > $REVERSE_LOG
echo "" > ERROR_LOG

while read line; do

    # create the command to be run
    DATA="username=user@server.com&password=password"
    URL=$line
    CMD=$(curl --data "${DATA}" -s -o /dev/null --url "${URL}")

    echo "Command: ${CMD}"    
    # Run the command
    $CMD &
    # Get PID for process
    PID=$!
    queue $PID;
    URL_ARRAY[$PID]=$URL;
    TIME_ARRAY[$PID]=`date +%s`
    while [ $NUM -ge $MAX_NPROC ]; do
         checkqueue
         sleep 0.4
     done
done < $1
echo "Cache FINISHED at `date`" >> $REVERSE_LOG
exit
4

1 に答える 1

1

ほとんどの場合、ネットワークがボトルネックになっています。より多くの接続を生成すると、通常は遅くなります。

いくつかをスポーンすることで、並列化があなたに何か良いことをするかどうかを確かめることができます

タイムカール......&

于 2012-07-31T19:38:36.990 に答える