動かざることバグの如し

近づきたいよ 君の理想に

FFmpegで指定時間ごとに静止画を切り出して連番画像で出力する

動画を機械学習されるあたり、画像に変換する必要があったのでメモ。なんかググって一番最初に出てきたサイトのオプションではできなかったので注意

1秒毎に〜枚画像を生成したい場合

-rオプションをつけることで指定フレームごとに抽出できる。以下のように-r 2をつけると1秒あたり2枚の画像を出力する。動画が1分あれば120枚の画像が出力されるはず。

ffmpeg -i input.mp4 -r 2 -vcodec mjpeg image_%04d.jpg

〜秒毎に1枚画像を生成したい場合

fpsオプションで可能。以下は1秒毎に画像を出力したい場合

ffmpeg -i input.mp4 -filter:v fps=fps=1:round=down image_%04d.jpg

fpsはframe per second の略で、「1秒あたりのフレーム数」という意味である。つまり、値を小さくすればその分秒が伸びる。以下は10秒毎

ffmpeg -i input.mp4 -filter:v fps=fps=0.1:round=down image_%04d.jpg

分数でも表記可能 以下は1分ごと

ffmpeg -i input.mp4 -filter:v fps=fps=1/60:round=down image_%04d.jpg

EC2のT3インスタンスは安いがT3 Unlimitedで死なないように注意

先日、EC2に新しいタイプのインスタンス、その名もT3がリリースされた。すでに東京リージョンでも使用可能になっている。

新しいインスタンス、 t3インスタンスがリリースされました | Amazon Web Services ブログ

なんとスペックが30%上がった上にT2より安い。これは使うしかない。

けど、見てる感じT2と同様に扱おうとすると痛い目にあいそうだったのでメモ。

T3 Unlimited がデフォルトで有効

そもそもT3 Unlimitedってなんぞやって話だが、CPUクレジットがUnlimited(無制限)ってことである。

じゃあCPUクレジットって何?って話になるが、以下のような仕組みである。

  • インスタンスタイプに応じて初期CPUクレジットを持つ
  • あまり負荷のかかっていないときに自動的にCPUクレジットが貯まっていく
  • 負荷のかかる処理のときにCPUクレジットが消費されて一時的にCPU性能を上がる(バースト)

これはTから始まるインスタンス限定の機能で、同様のCPUクレジット機能がT2にも搭載されている。負荷のしきい値はベースラインパフォーマンスというもので定められていて、公式ドキュメントに載ってる

もちろん良い機能なのだが、アイドル状態>負荷多状態がずっと続くとCPUクレジットが枯渇して大変なことになる

以下のサイトがいい例

[AWS][CPU Credits][Instances]T2インスタンスの隠された罠について知っているか!? – ADACHIN SERVER LABO

急激にLoad Averageが上がり、sshもできず、CPU idle,stealもぱないし死亡。

CPUクレジットが切れても頑張ろうとするとCPU Stealが急激に上がる模様。南無

で、T3 Unlimitedの話に戻るが、要はT3 Unlimitedは課金が発生するが、CPUクレジットを使い切っても無限にバーストし続ける機能である。(vCPU時間あたり0.05ドル)

本質的にはバーストし続ける=インスタンスタイプの選定ミスなのでよくない。コスパも上位のインスタンスタイプに変更したほうが良い

怖いのが、T3ではこの機能がデフォルトで有効化されていることである。

無効化にする方法

T3 Unlimitedの無効化はそんなに難しくない

管理画面にログインしてEC2のインスタンス一覧を表示して

f:id:thr3a:20180831091846p:plain

f:id:thr3a:20180831091849p:plain

でおk

他のT3インスタンスの他の懸念点

t3.micro は無料利用枠対象外

あ、これはどうでもいい

Rubyでcomparison of Float with NaN failedエラー

rubyでなんかバッチ回してたら、普段見ないエラーに遭遇した

rake aborted!
ArgumentError: comparison of Float with -6.94 failed

ウチなんも悪いことしてないのにとか思ってたけど、やっぱり悪かった

原因

NaNのせい

当然だが、rubyでは0で割ろうとすると例外が発生する

irb(main):005:0> 0/0
ZeroDivisionError: divided by 0

が、floatに変換して割ると例外は発生しない そしてNaNが返ってくる

[4] pry(main)> 0/0.to_f
=> NaN

で、本来小数点が入るであろう配列をsortしようとしたので

> [0,1,2,0/0.to_f,3,4].sort
ArgumentError: comparison of Fixnum with NaN failed

冒頭のエラーが発生したというわけ

iptablesミスってEC2インスタンスにSSHログイン出来なくなった時の対処法

の対処法

試したのはCentOSだけど、Ubuntuとか他のディストリビューションでも可能と思う

sshできなくなったら復元は不可能

GCPみたいに画面を擬似的に映し出す機能はないし、ServersManVPSのようにiptablesを謎の力でリセットするなんてことはEC2では出来ない。

よってSSHのログインなしにはiptablesの設定をリセットできない

仕方ないので問題のインスタンスのディスクを抜いて他のインスタンスでマウントして修正、って方法でやるしかない

大まかな流れ

ここからはSSHログインできないインスタンスを対象のインスタンスと呼ぶ。

細かい手順

lsblkすると以下のように2つ以上のディスクが表示されるはず

# lsblk
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda    202:0    0   8G  0 disk
└─xvda1 202:1    0   8G  0 part /
xvdf    202:80   0   8G  0 disk
└─xvdf1 202:81   0   8G  0 part

マウント さっきアタッチしたのは↑でいう/dev/xvdf1になる

mkdir /mnt/disk2
mount /dev/xvdf1 /mnt/disk2/

chrootでログイン

chroot /mnt/disk2/

とりあえずiptables無効化 iptablesのファイル自体を修正したほうがいいかもしれない

chkconfig iptables off

脱出

exit
  • mounterインスタンスを停止

  • mounterからデタッチして対象のインスタンスにアタッチ

    • ここで指定するデバイス項目はさっき控えた/dev/xxxを入力すること
  • 対象インスタンスを起動

  • うまくいっていればこれでログインできるようになったはず

参考リンク