Como alterar as configurações do ffmpeg -threads

14

Trabalhando em um site de tubos . Estou executando vídeos através do ffmpeg em um servidor linux dedicado para converter para mp4 .

O servidor especifica:

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

O problema durante o teste é que, mesmo executando apenas 4-5 de uma vez, o servidor carrega disparados para uma média de cerca de 36. Essa é apenas uma pessoa. Eu imagino que, quando abrir, muitas pessoas farão o upload de uma só vez.

Parece que o ffmpeg tenta usar todos os recursos disponíveis por conversão.

Ouvi dizer que há um cenário de roscas que você pode alterar, mas não consigo encontrá-lo. Eu tenho um servidor de 8 cpu. É usado apenas para conversões, então ouvi dizer que a melhor configuração seria entre 2 e 4. Posso testá-la.

Mas como altero essa configuração? Tudo o que vejo online discute essa configuração, mas não as etapas para alterá-la.


fonte

Respostas:

17

O sinalizador de opção que você deseja é realmente justo -threadse você o usaria assim (para apenas um thread):

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

No entanto, existem algumas sutilezas que aumentam a carga do servidor e o tempo de operação, como redimensionar, aplicar filtros e qualidade / taxa de quadros finais - sem mencionar o fato de que algumas arquiteturas de VM realmente lêem e escrevem tudo duas vezes (uma vez nativamente e uma vez virtualmente !!!)

Aqui estão algumas dicas para acelerar sua velocidade:

  1. use uma fila, para que apenas um item seja transcodificado por vez
  2. solicite arquivos menores de seus usuários
  3. use toda a potência da sua máquina:
    • lendo e escrevendo de um ramdisk
    • alternando para bare metal para tarefas de transcodificação
    • usar -threads 0

Faça o que fizer, mantenha seus usuários informados sobre o processo de transcodificação, pois isso leva tempo. (IJTT)

[comando editado para refletir o comentário de LordNeckbeard]

denjello
fonte
10
O posicionamento das opções é importante. Com -threadsantes da entrada você está aplicando esta opção a entrada (o decodificador). Um uso generalizado é ffmpeg [global options] [input options] -i input [output options] output.
Llogan
Então, onde você sugeriria colocá-lo? Eu pensei que no começo estava sendo aplicado globalmente?
Denjello
3
Como opção de saída, torna-se uma opção de codificação. Consulte a documentação do FFmpeg para visualizar quais opções estão marcadas como (global).
Llogan
importa se você coloca o -threadsargumento antes ou depois do -iargumento? Além disso, como devo determinar quantos threads devo usar? Basicamente, eu estou apenas fazendo-c copy
Chovy
3

Isso pode ser um pouco antigo, mas parece uma tarefa perfeita para um contêiner como docker.

  • Deixe o ffmpeg rodar com full horsepower(como denjello o chamava)
  • mas deixe correr dentro da janela de encaixe

Agora você pode limitar a quantidade de recursos que uma única instância do ffmpeg pode consumir sem usar as opções de linha de comando do ffmpeg. E não apenas CPU, mas também memória e E / S.

Ainda mais: talvez você tenha tarefas diferentes que podem ser executadas em segundo plano e não se importe quanto tempo elas demoram e você tenha tarefas que devem ser executadas rapidamente, para que você possa dar peso a diferentes tarefas.

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

Já existe uma imagem predefinida do ffmpeg no github: https://github.com/jrottenberg/ffmpeg

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

Uma única conversão provavelmente será mais lenta por causa da sobrecarga, mas se você executar várias instâncias simultaneamente, isso poderá ser um grande benefício. Qualquer isso será dimensionado muito bem, sem mencionar a segurança aprimorada, pois cada tarefa é isolada do sistema operacional subjacente.

Jürgen Steinblock
fonte
Não é um pouco extremo executá-lo dentro da janela de encaixe? Existem literalmente muitas outras maneiras melhores de limitar o uso do processador no Linux scoutapm.com/blog/…
yurtesen
Por quê? Considere que você já tenha o Docker instalado, executar um contêiner com --rmsinalizador para executar uma tarefa e remover o contêiner após a saída é algo totalmente normal que os administradores podem e devem fazer em 2019. Especialmente para coisas como conversão de documentos. A conversão falha? Experimente outra versão do conversor sem atualizar / desclassificar sua cadeia de ferramentas local? Você não confia no documento porque ele foi baixado da Internet? Isole a tarefa em um contêiner. Ffmpeg não é uma exceção. cvedetails.com/vulnerability-list/vendor_id-3611/Ffmpeg.html
Jürgen Steinblock
Isso soa como conversa de marketing. O Docker não é perfeito como você diz -> techbeacon.com/security/… No Linux, um usuário normal também desfruta de acesso limitado e segurança do sistema. A necessidade de downgrades da versão do programa é muito rara e pode ser feita através do repositório. Muitas imagens do docker são feitas por pessoas aleatórias. Talvez a imagem da janela de encaixe do conversor de documentos tenha sido comprometida e enviada cópia de todos os seus documentos para um servidor remoto. Portanto, o uso de imagens do docker aumenta a possibilidade de tal vulnerabilidade. O que então?
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?faça o checkout do repositório, investigue o dockerfile e use-o docker build -t myimagepara criar uma imagem local. Ou criar seu próprio dockerfile, não é ciência de foguetes github.com/alfg/docker-ffmpeg/blob/master/Dockerfile
Jürgen Steinblock