AEMに動画アップロードする際、ffmpegのCPU使用率を下げる対応
目次
CPU使用率が高まる事例
AEMでは、複数の動画がアップロードされる際に、Amazon CloudWatch エージェントから、アラームが発信されてしまう事例が発生した。
ここで、アラーム発信する条件が2つあり、そして、EC2インスタンスのCPU使用率が長時間に高くなるのは、原因になるようです。
- CPU使用率が全体の 90% に上回った
- 上記状況が15分以上発生し続けていた
そして、EC2インスタンスの各プロセスのCPU使用率を分析すると、ffmpegプロセスは、CPU使用率が長時間に高くなる原因になることが判明しました。
ffmpegプロセスは、一旦起動すると、CPUリソースは、ほとんど使われている。「コア」数が 4 のCPUに対して、400% の内、AEM(java)プロセスが暇になっても、残りのリソースは、ほとんどffmpegプロセスが使用されてしまい、複数の動画がアップロードされるため、CPU使用率が高い状況に続けていると、アラームが発信されてしまいます。
ffmpegプロセスの役割
動画がアップロードされた後、AEM の DAM Update Asset ワークフロー開始、そこで、ffmpegプロセスが起動される。このプロセスは、動画のサムネイル画像を生成したり、動画のプレビュー用のflv,m4v,mp4などにトランスコーディングしたりする役割を果たしています。
しかし、ffmpegプロセスが一生懸命仕事しているが、EC2インスタンスに余計な負荷がかかってしまいます。
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プロセスを呼ばれます。
具体的な改修は以下です:
# 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% 以下に抑制されています。