2011-01-26 5 views
1

私のレールアプリケーションでは、ワーカープロセスを使用して45時間のデータベースレコードを6時間に1回スキャンし、これにより、ワーカーが処理しているときにサーバーCPU /負荷が急増します。その結果、他のサーバー要求がパフォーマンスヒットになります。 find_in_batchを使って一度に1000レコードを取り出して処理を試みました。しかし、CPU使用率は依然としてピークレベルにあります。大きな違いはありませんでした。これを処理する方法はありますか?したがって、CPU使用率は最大限に達しません。レールで処理するサーバーのパフォーマンスに影響を与えずにワークリングを使用してデータベースレコードを45k処理する

答えて

0

はそれを行うための一つの方法ですが、他は今少しリラックスして、あなたのアプリに伝えることですし、次に使用しますsleepselectコマンド:

while (doing_stuff) 
    do_stuff 

    # Take a break for 0.2 seconds 
    select(nil, nil, nil, 0.2) 
end 

select呼び出しは、システム上の他のタスクを自由に実行できるように時間の短い期間のためにブロックします。この値を高く設定するほど、ジョブの実行速度は遅くなりますが、CPU負荷レベルへの影響は小さくなります。

+1

これはリソースの貧弱な使用です。あなたのアプリは、CPUの競合がない時間に実行されるかもしれません。その場合、データベースの各レコードに対して何もしないで0.2秒を不必要に費やします。 – meagar

+0

これを拡張して、システムの負荷に応じて遅延時間を可変に設定することができます。 – tadman

3

あなたはcronとscript/runnerでジョブを呼び出すと仮定します。あなたはniceと、プロセスの優先順位を下げてみてください:niceを使用して、プロセスの優先度レベルをいじる

nice -n 19 /usr/bin/ruby <path to your app>/script/runner <your script> 
+0

これはCPUの負荷には影響しませんが、他のプロセスの優先度が高いことを意味します。残念なことに、データベース呼び出しはすべて等しいとみなされます。そのため、多くのクエリアクティビティは、接続されているすべての本稼動システムにノックオン効果をもたらします。 – tadman

+0

rufusスケジューラを使用して定期的に実行するスケジューラ作業プロセス – anusuya

関連する問題