AEMに動画アップロードする際、ffmpegのCPU使用率を下げる対応

目次

CPU使用率が高まる事例

 AEMでは、複数の動画がアップロードされる際に、Amazon CloudWatch エージェントから、アラームが発信されてしまう事例が発生した。

 ここで、アラーム発信する条件が2つあり、そして、EC2インスタンスのCPU使用率が長時間に高くなるのは、原因になるようです。

  • CPU使用率が全体の 90% に上回った
  • 上記状況が15分以上発生し続けていた

image.png

 そして、EC2インスタンスの各プロセスのCPU使用率を分析すると、ffmpegプロセスは、CPU使用率が長時間に高くなる原因になることが判明しました。

image.png

 ffmpegプロセスは、一旦起動すると、CPUリソースは、ほとんど使われている。「コア」数が 4 のCPUに対して、400% の内、AEM(java)プロセスが暇になっても、残りのリソースは、ほとんどffmpegプロセスが使用されてしまい、複数の動画がアップロードされるため、CPU使用率が高い状況に続けていると、アラームが発信されてしまいます。

ffmpegプロセスの役割

 動画がアップロードされた後、AEM の DAM Update Asset ワークフロー開始、そこで、ffmpegプロセスが起動される。このプロセスは、動画のサムネイル画像を生成したり、動画のプレビュー用のflv,m4v,mp4などにトランスコーディングしたりする役割を果たしています。

 しかし、ffmpegプロセスが一生懸命仕事しているが、EC2インスタンスに余計な負荷がかかってしまいます。

image.png

ffmpegプロセスのCPU使用率を制限する方法

 この問題を解決するポイントは、ffmpegプロセスのCPU使用率を半分以下に抑制することです。

CPU使用率を制限するコマンド

 ここで登場するのは、特定のプロセスのCPU利用率を制限するコマンド「cpulimit」 です。

$ cpulimit -l <制限値> <実行プロセス>

 例えば、下記のように、ffmpeg プロセスのCPU使用率を 50% に指定して実行します。

$ cpulimit -l 50 ffmpeg
ffmpegプロセスの呼び出す方法調査

 また、AEM の DAM Update Asset ワークフローのプロセスから、下記のように、ffmpegプロセスを起動します。

$ /usr/local/bin/ffmpeg <引数1> <引数2> ・・・ <引数X>
ffmpegを呼び出すスクリプトをフックする

 AEM のワークフロープロセスから、ffmpegプロセスを起動する際、CPU利用率を指定してから、ffmpegプロセスを起動するように、改修します。

 つまり、元々ffmpegプロセスを直接に呼ばれることを代わりに、同じパスのスクリプトを新規作成、そして、スクリプトの中で、CPU利用率を指定してからffmpegプロセスを呼ばれます。

image.png

 具体的な改修は以下です:

# ffmpegをリネーム
$ mv /usr/local/bin/ffmpeg /usr/local/bin/ffmpegNew
# ffmpegを呼び出すスクリプト新規作成
$ vim /usr/local/bin/ffmpe

 スクリプト(/usr/local/bin/ffmpeg)の中身は、下記の内容を入力される。ffmpegのCPU使用率を 180% に指定して実行します。

#!/bin/sh
cpulimit -l 180 -i -z /usr/local/bin/ffmpegNew -threads 2 $*

 ここでは、複数の動画をAEMにアップロードしてみたら、ffmpegのCPU使用率がずっと 180% 以下に抑制されています。

image.png