Bagaimana cara mengubah pengaturan ffmpeg -threads

14

Bekerja di situs tabung . Saya menjalankan video melalui ffmpeg di server khusus linux untuk mengkonversi ke mp4 .

Spesifikasi server:

Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                8
On-line CPU(s) list:   0-7
Thread(s) per core:    2
Core(s) per socket:    4
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 60
Stepping:              3
CPU MHz:               3491.749
BogoMIPS:              6983.49
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              8192K
NUMA node0 CPU(s):     0-7

Masalah selama pengujian adalah bahwa bahkan hanya melakukan 4-5 sekaligus, server memuat skyrockets ke rata-rata sekitar 36. Ini hanya satu orang. Saya membayangkan ketika dibuka, banyak orang akan mengunggah sekaligus.

Tampaknya ffmpeg mencoba menggunakan semua sumber daya yang tersedia per konversi.

Saya pernah mendengar ada pengaturan -threads yang dapat Anda ubah, tetapi saya tidak dapat menemukannya. Saya memiliki server 8 cpu. Ini hanya digunakan untuk konversi, jadi saya pernah mendengar pengaturan terbaik adalah antara 2 dan 4. Saya dapat mengujinya.

Tetapi bagaimana cara mengubah pengaturan ini? Semua yang saya lihat online membahas pengaturan ini, tetapi bukan langkah-langkah untuk mengubahnya.


sumber

Jawaban:

17

Bendera opsi yang Anda inginkan benar-benar adil -threadsdan Anda akan menggunakannya seperti ini (hanya untuk satu utas):

ffmpeg -i somefile.wmv -c:a libfdk_aac -c:v libx264  -threads 1 transcoded.mp4

Namun, ada beberapa seluk-beluk yang akan menaikkan beban server dan waktu operasi Anda, seperti pengubahan ukuran, penerapan filter, dan kualitas bingkai akhir / frame rate - belum lagi fakta bahwa beberapa arsitektur VM benar-benar membaca dan menulis semuanya dua kali (dulu secara asli dan sekali hampir !!!)

Berikut adalah beberapa tips untuk mempercepat Anda:

  1. gunakan antrian, sehingga hanya satu item yang pernah ditranskode pada satu waktu
  2. minta file yang lebih kecil dari pengguna Anda
  3. gunakan tenaga kuda penuh mesin Anda dengan:
    • membaca dan menulis dari ramdisk
    • beralih ke bare metal untuk tugas transcoding
    • menggunakan -threads 0

Apa pun yang Anda lakukan, tetap beri tahu pengguna Anda tentang proses transcoding, karena itu hanya membutuhkan waktu. (IJTT)

[Perintah yang diedit untuk mencerminkan komentar LordNeckbeard]

denjello
sumber
10
Masalah penempatan opsi. Dengan -threadssebelum input Anda menerapkan opsi ini input (decoder). Penggunaan umum adalah ffmpeg [global options] [input options] -i input [output options] output.
llogan
Jadi, di mana Anda menyarankan untuk meletakkannya? Saya pikir pada awalnya itu sedang diterapkan secara global?
denjello
3
Sebagai opsi output sehingga menjadi opsi pengkodean. Lihat dokumentasi FFmpeg untuk melihat opsi mana yang ditandai (global).
llogan
Apakah penting jika Anda meletakkan -threadsarg sebelum atau sesudah -iarg? Juga, bagaimana saya harus menentukan berapa banyak utas yang harus saya gunakan? Saya pada dasarnya hanya melakukan-c copy
chovy
3

Ini mungkin agak tua tapi ini terdengar seperti tugas yang sempurna untuk sebuah wadah seperti buruh pelabuhan.

  • Biarkan ffmpeg berjalan dengan full horsepower(sebagaimana denjello menyebutnya)
  • tapi biarkan berjalan di dalam buruh pelabuhan

Sekarang Anda dapat membatasi berapa banyak sumber daya yang dapat dikonsumsi oleh instance ffmpeg tunggal tanpa menggunakan opsi-opsi commandline ffmpeg. Dan bukan hanya CPU tetapi juga memori dan IO.

Bahkan lebih lagi: Mungkin Anda memiliki tugas berbeda yang mungkin berjalan di latar belakang dan Anda tidak peduli berapa lama waktu yang dibutuhkan dan Anda memiliki tugas yang harus berjalan cepat, sehingga Anda dapat memberi bobot pada tugas yang berbeda.

Lihat https://docs.docker.com/engine/reference/run/#runtime-constraints-on-resources

Sudah ada gambar ffmpeg yang sudah ditentukan sebelumnya di github: https://github.com/jrottenberg/ffmpeg

docker run jrottenberg/ffmpeg \
        -i http://url/to/media.mp4 \
        -stats \
        $ffmpeg_options  - > out.mp4

Satu konversi kemungkinan akan berjalan lebih lambat karena overhead tetapi jika Anda menjalankan banyak contoh secara bersamaan ini bisa menjadi manfaat besar. Apa pun ini akan berskala sangat baik, belum lagi peningkatan keamanan karena setiap tugas diisolasi dari OS yang mendasarinya.

Jürgen Steinblock
sumber
Bukankah itu sedikit ekstrim untuk menjalankannya di dalam buruh pelabuhan? Ada banyak cara lain yang lebih baik untuk membatasi penggunaan prosesor di Linux scoutapm.com/blog/...
yurtesen
Mengapa? Pertimbangkan Anda telah memasang buruh pelabuhan, menjalankan wadah dengan --rmbendera untuk melakukan tugas dan menghapus wadah setelah keluar adalah hal yang benar-benar normal yang dapat dan harus dilakukan oleh admin pada tahun 2019. Terutama untuk hal-hal seperti konversi dokumen. Konversi gagal? Coba versi konverter lain tanpa memutakhirkan / menurunkan versi rantai alat lokal Anda? Anda tidak mempercayai dokumen tersebut karena telah diunduh dari internet? Pisahkan tugas dalam wadah. Ffmpeg tidak terkecuali. cvedetails.com/vulnerability-list/vendor_id-3611/Ffmpeg.html
Jürgen Steinblock
Kedengarannya seperti pembicaraan pemasaran. Docker tidak sempurna seperti yang Anda katakan -> techbeacon.com/security/... Di Linux pengguna biasa juga menikmati akses terbatas dan keamanan sistem. Perlu downgrade versi program sangat jarang dan dapat dilakukan melalui repositori. Banyak gambar buruh pelabuhan dibuat oleh orang-orang acak. Mungkin gambar docker konverter dokumen terganggu dan mengirim salinan semua dokumen Anda ke server jauh. Jadi, menggunakan gambar buruh pelabuhan meningkatkan kemungkinan kerentanan tersebut. Lalu bagaimana?
yurtesen
Perhaps the document converter docker image was compromised and sent copy of all your documents to a remote server. So, using docker images increase possibility such vulnerability. What then?checkout repo, selidiki dockerfile dan gunakan docker build -t myimageuntuk membuat gambar lokal sendiri. Atau buat dockerfile Anda sendiri, itu bukan ilmu roket github.com/alfg/docker-ffmpeg/blob/master/Dockerfile
Jürgen Steinblock