Nous avons développé une application pour transcoder les fichiers source .mov en sortie .ogg, .mp4 et .webm. Il sexécute actuellement sur linstance AWS EC2 g2.8xlarge. Cela fonctionne (ouais!).

Ma question: Même si je passe -threads 0 à la commande ffmpeg (en fait en définissant ffmpeg.threads configuration dans php-ffmpeg ), le processus en cours dexécution nest parfois exécuté que sur un seul cœur. Pourquoi cela arrive-t-il? Voir ci-dessous la sortie de la commande htop:

sortie htop

Comme vous pouvez le voir , Core # 21 est au maximum. Dans quelques secondes, il va passer à un autre, plutôt que de les maximiser tous comme je le souhaiterais et accélérer considérablement mon processus de codage. La situation est transitoire; pendant certaines exécutions, tous les processeurs sont au maximum, mais pendant d’autres, ils ne le sont pas et nous n’utilisons qu’un seul processeur. Un collègue a mentionné que le codec que nous utilisons pour certains formats ne prend peut-être pas en charge l’exécution multithread pendant l’encodage, bien que je ne puisse pas vérifier que cest le comportement que jobserve encore.

Est-ce le cas? Si tel est le cas, quels codecs pour les formats ci-dessus nous permettront de transcoder dans ces formats cibles tout en tirant parti de tout notre matériel disponible? Les codecs par défaut définis pour php-ffmpeg sont ci-dessous;

 Video Audio Ogg libtheora libvorbis WebM libvpx libvorbis X264 libx264 libfaac 

Update

En regardant les processus en cours, voici ce qui finit par être la commande ffmpeg qui est exécutée pour un MP4 (saturant actuellement les 32 cœurs):

Je » ne construis pas cette commande directement, php-ffmpeg, bien que je pense avoir au moins un contrôle modeste sur ce qui se passe dedans (par exemple, je nai aucune idée pourquoi il y a plusieurs entrées -metadata:s:v:0 au début)

Commentaires

  • Il y a ‘ beaucoup de facteur de beurk dans cette ligne de commande, à part les options dupliquées (-s trois fois , le dernier avec une taille différente). Définition explicite dun groupe darguments sur leurs valeurs par défaut actuelles (par exemple, -i_qfactor, -subq, -qcomp) est bizarre et pourrait donner de mauvais résultats avec la future libx264. (Probablement pas, mais seulement parce que la libx264 est à peu près terminée, et stable, pas sous un développement lourd. Si elle faisait des choses comme celle-ci pour x265, ce serait mauvais.) Quoi quil en soit, 2-passes 1200k est bien, mais vous préférerez peut-être la cible -quality crf. ‘ ne spécifie pas -preset. 🙁
  • libfaac isn ‘ t aussi bon que libfdk_aac . Si vous ‘ utilisez ceci dans un service payant, vous devez ‘ vérifier la licence de libfdk_aac, cependant. De plus, cette ligne de commande est manquante -movflags +faststart
  • Il ‘ est également possible que ffmpeg produise plusieurs sorties à partir du même input. Il suffit davoir plusieurs séquences doptions de sortie output-filename sur la ligne de commande. Donc, dans lensemble, je ‘ ne suis pas très impressionné par php-ffmpeg, si cela ‘ est le type de cmdline quil propose. Vous pourriez peut-être lutiliser différemment pour le faire générer plusieurs sorties à la fois, donc il ny aurait pas ‘ t être une étape de theora à un seul thread. Quoi quil en soit, si cela fonctionne, alors très bien, mais méfiez-vous des modifications apportées aux valeurs par défaut de lencodeur, et de la signification des niveaux de x264 subme changeant, dune manière que je et votre cmdline nuit à la qualité.
  • @Peter merci beaucoup. Je pense que la réponse ici est vraiment que jai besoin de déboguer la façon dont cette cmd est construite. Si je peux vraiment insérer plusieurs sorties dans cette commande, je pense que cela me donnerait probablement la meilleure chance de maximiser la charge sur le matériel
  • trac.ffmpeg .org / wiki / Création de% 20multiple% 20outputs . Et oui, je suis daccord que ‘ est probablement le meilleur. Sinon, vous avez une tâche qui ‘ est monothread pendant une partie de son temps, et charger tous vos cœurs pendant une autre partie du temps. Difficile de planifier des tâches qui se comportent de cette façon.

Réponse

BTW, cette question pourrait être meilleure sur stackoverflow, ou peut-être unix.stackexchange, ou peut-être serverfault. Ce site est, à mon avis, moins axé sur les questions qui nimpliquent pas de décisions basées sur le mérite créatif ou au moins sur la qualité visuelle / audio perceptive. Cependant, je suis tout au sujet des détails techniques, donc je vais y répondre.

FFmpeg utilise le multi-threading par défaut, donc vous navez probablement pas besoin de -threads 0. Si votre encodage est bloqué sur un filtre ou un décodeur à thread unique, vous verrez une charge complète sur un cœur et une charge légère sur de nombreux autres cœurs.

Une chose que vous pouvez faire est de vérifier les mediainfo de votre vidéo de sortie. x264 laisse ses paramètres dans une chaîne ASCII dans len-tête h.264. Donc, soit strings -n20 soit mediainfo pour obtenir:

... Chroma subsampling : 4:2:0 Bit depth : 8 bits Scan type : Progressive Bits/(Pixel*Frame) : 0.051 Stream size : 455 MiB (89%) Writing library : x264 core 146 r2538+1 d48ec67 Encoding settings : cabac=1 / ref=6 / deblock=1:0:0 / analyse=0x3:0x133 / me=umh / subme=10 / psy=1 / psy_rd=0.70:0.10 / mixed_ref=1 / me_range=24 / chroma_me=1 / trellis=2 / 8x8dct=1 / cqm=0 / deadzone=21,11 / fast_pskip=1 / chroma_qp_offset=-3 / threads=4 / lookahead_threads=1 / sliced_threads=0 / nr=50 / decimate=1 / interlaced=0 / bluray_compat=0 / constrained_intra=0 / bframes=5 / b_pyramid=2 / b_adapt=2 / b_bias=0 / direct=3 / weightb=1 / open_gop=0 / weightp=2 / keyint=250 / keyint_min=25 / scenecut=40 / intra_refresh=0 / rc_lookahead=60 / rc=crf / mbtree=1 / crf=22.5 / qcomp=0.60 / qpmin=0 / qpmax=69 / qpstep=4 / ip_ratio=1.40 / aq=3:0.60 Color primaries : BT.709 Transfer characteristics : BT.709 Matrix coefficients : BT.709 

Remarque le « threads = 4 » là-dedans. Je pense que je lai configuré manuellement sur mon quad core i5 2500k, au lieu de laisser x264 utiliser les processeurs par défaut * 1.5, car javais des filtres gourmands en ressources processeur (hqdn3d et lanczos-downscale) en cours dexécution.

Quoi quil en soit, libx264 avec un préréglage comme slower ne devrait avoir aucun problème à garder un grand nombre de cœurs occupés. Certaines parties de lencodage sont intrinsèquement série (par exemple, lencodage CABAC du train de bits final), donc une vidéo à haut débit qui ne passe pas beaucoup de temps CPU à affiner les références (high subme) sur plusieurs images (high ref) peut afficher un modèle de charge comme le vôtre (un thread utilisant 100% du processeur, dautres non).

I « Je ne suis pas sûr à 100% que les préréglages plus rapides soient moins parallèles, mais je sais que CABAC est en série.

Pour être massivement parallèle, libx264 pourrait utiliser une cargaison de RAM pour garder les cadres autour, et continuer à chercher en avance pendant 2 ou plusieurs GOP, et codez-les indépendamment. Cependant, il n’a pas d’option pour fonctionner de cette façon.

Une façon d’utiliser BEAUCOUP de cœurs est d’exécuter plusieurs encodages séparés en parallèle, au lieu d’une simple série d’encodages uniques utilisant tous les cœurs. Cela ne fonctionne que si vous avez plusieurs fichiers dentrée que vous souhaitez encoder séparément. Vous échangez la surcharge de thread contre plus de capacité de mémoire et de bande passante (avec un impact sur la mise en cache, à moins que ce ne soit sur un système multi-socket avec L3 et DRAM séparés pour chaque cluster de processeurs, et vous avez les processus épinglés aux cœurs de sorte quun encodage utilise les cœurs dans un socket et lautre dans lautre).

Commentaires

  • Merci pour la perspicacité. Jai demandé ici principalement parce que je nai ‘ aucune question concernant le code  »  » et plus sur ce qui se passe dans les coulisses et jai pensé que ce serait mieux. Je ‘ Je signale que les modérateurs doivent faire attention à migrer, puis ils peuvent passer lappel.
  • En ce moment, nous ‘ re coller un message sur une file dattente AWS SQS qui a un lien vers chaque fichier. Cette instance a un travail en cours dexécution qui écoute ces messages, télécharge le fichier, le transcode et télécharge les fichiers de sortie une fois chacun terminé. Si je lis ceci correctement, vous ‘ dites quil serait probablement plus logique pour nous de lancer quelques-uns de ces processus de travail et de transcoder plusieurs fichiers en parallèle plutôt que essayez de concentrer tous les cœurs sur un seul processus?
  • Oui, si vous ‘ rencontrez des problèmes pour saturer davantage de cœurs, cela ‘ est parfait pour exécuter un encodage ou 3 en parallèle. Je pense que x264 devrait pouvoir saturer la plupart de vos 32 cœurs, mais peut-être seulement avec un préréglage plus lent. Postez vos options de ligne de commande ffmpeg et la sortie de la console dans votre question. IDK si vous ‘ utilisez quelque chose de stupide et de mauvaise qualité comme -preset veryfast. Si tel est le cas, le décodage de lentrée peut être le goulot détranglement à un seul thread. Ou comme je lai dit, peut-être un filtre lent.
  • Vous ‘ voudrez certainement chevaucher le téléchargement / chargement dun xcode avec lutilisation du processeur dun autre xcode, si vous ‘ ne prévoyez pas de diffuser vers / depuis ffmpeg à la volée pour une utilisation en production. (Il peut être possible d’obtenir l’équivalent de -movflags +faststart à la volée, avec un multiplexeur différent. Je pense avoir lu quelque chose à ce sujet. Sinon, si vous ‘ pour la sortie de mp4, vous devez en quelque sorte générer un fichier dans un fichier pour que ffmpeg puisse placer latome moov à lavant et mélanger les données quand lencodage est terminé.)
  • Oh, je viens de lire votre Q plus en détail. Si vous ‘ sortez les 3 formats en une seule fois (avec la même ligne de commande ffmpeg, le décodage de lentrée ne doit donc se produire quune seule fois), alors si lun des 3 encodeurs est monothread, cela gênera lensemble du processus. Je pense que libtheora nest pas multi-thread. wiki.xiph.org/TheoraEncoders dit quil y avait un fork multi-thread, mais il est mort. (peut-être na jamais bien fonctionné, ou na pas été ‘ compatible avec dautres améliorations de lencodeur? Il peut y avoir de nombreuses raisons pour lesquelles il na pas ‘ fusionné) lists.xiph.org/pipermail//theora-dev/2015-Février/004374.html

Réponse

libtheora est à thread unique. Il existe une version expérimentale multithread, mais elle nest pas maintenue. Je suggérerais de lexécuter en parallèle avec les autres encodages. Si possible, utilisez aussi libfdk-aac sur libfaac.Une fidélité audio beaucoup plus élevée au même débit.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *