web-dev-qa-db-ja.com

cpulimitは実際にはCPU使用率を制限していません

cpulimitからcronを呼び出しています。

00 16 * * * /usr/bin/cpulimit --limit 20 /bin/sh /media/storage/sqlbackup/backups.sh

ジョブが開始されると、CPUはスパイクし、いつものようにアラートを出しますが、実際に識別可能な制限は発生していません。ジョブ自体は多くのサブディレクトリのディレクトリを反復処理し、毎回rsyncを実行します。これは、rsyncの子プロセスを生成していると思います(topを実行すると、呼び出されたrsyncで使用可能なpidがあります。数分でrsyncのpidが異なります)。

cpulimitを適切に利用して、このプロセスが消費する使用量を効果的に制限する方法がわかりません。

これはVM with 2G RAMおよび1vCPUであることに注意することが重要かもしれません。

1
Kahn

デフォルトでは、cpulimitは子プロセスを制限しないため、rsyncはまったく制限されていません。 cpulimitの最新バージョンを実行している場合は、--include-children(または-i)オプションを使用できるはずです。 ( この回答 も参照してください。)

$ cpulimit -h
Usage: cpulimit [OPTIONS...] TARGET
   OPTIONS
      -l, --limit=N          percentage of cpu allowed from 0 to 400 (required)
      -v, --verbose          show control statistics
      -z, --lazy             exit if there is no target process, or if it dies
      -i, --include-children limit also the children processes
      -h, --help             display this help and exit
   TARGET must be exactly one of these:
      -p, --pid=N            pid of the process (implies -z)
      -e, --exe=FILE         name of the executable program file or path name
      COMMAND [ARGS]         run this command and limit it (implies -z)

Report bugs to <[email protected]>.

これにより、cronエントリが次のように変更されます。

00 16 * * * /usr/bin/cpulimit --include-children --limit 20 /bin/sh /media/storage/sqlbackup/backups.sh

OPが(自分で)答えたように、スクリプト内のcpulimitコマンドにrsyncを追加することは機能しますが、それはスクリプトが他のことをしている間にリソースを利用していないことを保証しません機能。たとえば、スクリプトが大規模なディレクトリにヒットすると、システムが停止し、CPUのスパイクとアラートが発生する可能性があります。

0
Questionmark