New challenge: you’re on a shared hosting with lowendbox. You’re required to keep low server load (very low). How to do an ffmpeg video encoding?
By limiting threads and cpu.
To make a long story short:
nice -19 cpulimit -l 30 -- ffmpeg -f image2pipe -r 5 -c:v mjpeg -i - -y -r 15 -s hd720 -vcodec libx264 -threads 1 /tmp/yourvideo.mp4
Longer story: from stdin I get a bunch of JPG images to encode as video, in order to generate a time-lapse.
cpulimit is a tool used to lower CPU usage. It sends SIGSTOP and SIGCONT signal to a process in order to keep a limited resource occupation. It can accept a PID or a process name as parameter, and you can limit usage even of a running process. Of course, as you do for nice, you can run a command restricted from the beginning. That’s what we’re doing up there.
Sadly the first time I tried cpulimit with ffmpeg it didn’t seem to work very well, server load was still rising up. Then I found a nice option of ffmpeg: -threads. That options limits the threads (cpu) usage of the encoding command. Beware where you put that option: in short, should be the last one.
By mixing cpulimit and -threads ffmpeg option I managed to encode 720 JPEGs into an mp4 without passing the 1 load threshold (on a 4 core VPS). Of course doing this way it will take much longer (it normally took ~3 minutes at full cpu power, now running for more than 10!) to encode, but at least you won’t get complaints from your hosting provider.