Laravelでスケジュールの並列実行で並列処理バッチを作ってみて
どんな感じの負荷にになるのかと思い試してみました。
同時実行数を増やしても均等に割り振られているようなので問題ないのかもしれませんが、CPUに負荷はかかっているみたいなのでスリープを入れてやると良いのかもしれません。(システム周りについては全くの素人ですので見当違いなことを記載しているかもしれませんし、どのように対応すべきなのかはわかりません。)
後述の実行結果から
-
スクレイピング等のバッチでは取得までに時間がかかるのでCPUの負荷はあまり気にしなくても良いかもしれません。
-
容量の大きいCSV等のファイルを処理する場合は試していませんが行を取得するのに時間はかからないような気がしますのでその際は10ミリ秒程のスリープを入れてやると良いかもしれません。(バッチとして行うので時間は長くなっても構わない前提です。単純に1行10ミリ秒とすると200万行では5時間30分ほどになります)
追記
NI(Nice値)が低いほど優先度が高い。
-20(優先度高い)~19(低い) デフォルト0
システムに関わる重要なプロセスは優先度が高くなっている。
均等割になったのはNIが同じだから。
バッチ等でロードアベレージだけが高くなるのは問題がない。(きちんとCPUが使い切れている)
なので処理実行時のみCPU使用率だけが高いのは問題ないそうです。
バッチ処理はNice値を大きくしておくと尚良いらしいです。
同時実行数を1つで実行してみる
protected function schedule(Schedule $schedule)
{
$time = Carbon::now()->format('H:i');
$schedule->command('command:batch 1')->dailyAt($time)->runInBackground();
}
処理内容
public function handle()
{
$id = $this->argument('id');
$save_file_path = __DIR__.'/save'.(string)$id.'.csv';
$file = new \SplFileObject($save_file_path, 'w');// ファイルは作成してくれます。
$row = ['dataA', 'data,B', 'data"C'];
for ($i = 0; $i < 10000000; $i++)
{
$file->fputcsv($row);
}
}
# top
top - 01:54:54 up 2:38, 0 users, load average: 0.95, 0.48, 0.48
Tasks: 36 total, 2 running, 34 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 53.4 sy, 0.0 ni, 46.6 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 1019648 total, 219500 free, 358640 used, 441508 buff/cache
KiB Swap: 1162264 total, 1140644 free, 21620 used. 237744 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1114 root 20 0 293360 40952 16444 R 52.7 4.0 1:30.39 php
同時実行数を3つで実行してみる
protected function schedule(Schedule $schedule)
{
$time = Carbon::now()->format('H:i');
$schedule->command('command:batch 1')->dailyAt($time)->runInBackground();
$schedule->command('command:batch 2')->dailyAt($time)->runInBackground();
$schedule->command('command:batch 3')->dailyAt($time)->runInBackground();
}
# top
top - 01:03:06 up 1:46, 0 users, load average: 3.00, 2.91, 1.97
Tasks: 40 total, 4 running, 36 sleeping, 0 stopped, 0 zombie
%Cpu(s): 1.7 us, 97.7 sy, 0.0 ni, 0.6 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 1019648 total, 70216 free, 417968 used, 531464 buff/cache
KiB Swap: 1162264 total, 1161736 free, 528 used. 169580 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
597 root 20 0 293360 40736 16228 R 32.6 4.0 5:11.17 php
599 root 20 0 293360 40860 16352 R 32.6 4.0 5:11.15 php
602 root 20 0 293360 40716 16204 R 32.6 4.0 5:11.12 php
同時実行数を6つで実行してみる
protected function schedule(Schedule $schedule)
{
$time = Carbon::now()->format('H:i');
$schedule->command('command:batch 1')->dailyAt($time)->runInBackground();
$schedule->command('command:batch 2')->dailyAt($time)->runInBackground();
$schedule->command('command:batch 3')->dailyAt($time)->runInBackground();
$schedule->command('command:batch 4')->dailyAt($time)->runInBackground();
$schedule->command('command:batch 5')->dailyAt($time)->runInBackground();
$schedule->command('command:batch 6')->dailyAt($time)->runInBackground();
}
# top
top - 01:15:43 up 1:59, 0 users, load average: 6.07, 4.15, 2.62
Tasks: 46 total, 7 running, 39 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.3 us, 99.3 sy, 0.0 ni, 0.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 1019648 total, 84728 free, 488796 used, 446124 buff/cache
KiB Swap: 1162264 total, 1145304 free, 16960 used. 104888 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
789 root 20 0 293360 40692 16188 R 16.7 4.0 0:49.57 php
795 root 20 0 293360 40880 16312 R 16.7 4.0 0:49.55 php
800 root 20 0 293360 40936 16368 R 16.7 4.0 0:49.54 php
785 root 20 0 293360 40684 16176 R 16.3 4.0 0:49.56 php
791 root 20 0 293360 40948 16440 R 16.3 4.0 0:49.55 php
798 root 20 0 293360 40832 16328 R 16.3 4.0 0:49.55 php
同時実行数を6つでループ処理の中に1ミリ秒のスリープを入れて実行してみる
処理内容
public function handle()
{
$id = $this->argument('id');
$save_file_path = __DIR__.'/save'.(string)$id.'.csv';
$file = new \SplFileObject($save_file_path, 'w');// ファイルは作成してくれます。
$row = ['dataA', 'dataB', 'dataC'];
for ($i = 0; $i < 10000000; $i++)
{
usleep(1000);// 1ミリ秒
$file->fputcsv($row);
}
}
# top
top - 01:34:58 up 2:18, 0 users, load average: 0.69, 0.58, 1.05
Tasks: 46 total, 7 running, 39 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 23.3 sy, 0.0 ni, 76.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 1019648 total, 83288 free, 489700 used, 446660 buff/cache
KiB Swap: 1162264 total, 1145324 free, 16940 used. 103676 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
996 root 20 0 293360 40820 16312 R 4.3 4.0 0:19.27 php
1003 root 20 0 293360 40776 16272 R 4.3 4.0 0:19.20 php
1006 root 20 0 293360 41048 16480 R 4.3 4.0 0:19.24 php
999 root 20 0 293360 40784 16276 R 4.0 4.0 0:19.24 php
1009 root 20 0 293360 41108 16604 R 4.0 4.0 0:19.21 php
1011 root 20 0 293360 40888 16380 R 4.0 4.0 0:19.26 php
同時実行数を6つでループ処理の中に10ミリ秒のスリープを入れて実行してみる
処理内容
public function handle()
{
$id = $this->argument('id');
$save_file_path = __DIR__.'/save'.(string)$id.'.csv';
$file = new \SplFileObject($save_file_path, 'w');// ファイルは作成してくれます。
$row = ['dataA', 'dataB', 'dataC'];
for ($i = 0; $i < 10000000; $i++)
{
usleep(10000);// 10ミリ秒
$file->fputcsv($row);
}
}
# top
top - 02:37:51 up 3:21, 0 users, load average: 0.08, 0.23, 0.17
Tasks: 46 total, 7 running, 39 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 3.7 sy, 0.0 ni, 96.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 1019648 total, 157072 free, 431344 used, 431232 buff/cache
KiB Swap: 1162264 total, 1084464 free, 77800 used. 169756 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1285 root 20 0 293360 40876 16368 R 1.0 4.0 0:02.77 php
1278 root 20 0 293360 41032 16524 R 0.7 4.0 0:02.76 php
1281 root 20 0 293360 40900 16392 R 0.7 4.0 0:02.77 php
1288 root 20 0 293360 40964 16456 R 0.7 4.0 0:02.76 php
1291 root 20 0 293360 40952 16448 R 0.7 4.0 0:02.75 php
1293 root 20 0 293360 40744 16236 R 0.7 4.0 0:02.74 php