LoginSignup
3
5

More than 5 years have passed since last update.

ループ処理を行った際のCPUの負荷

Last updated at Posted at 2018-03-01

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
3
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
5