Servidores con muchos núcleos

Terminé comprando un servidor usado de Amazon Renewed: tiene dos Xeons que suman 56 núcleos. Cuando miro el administrador de tareas, el uso durante las codificaciones es bastante bajo, incluso cuando está configurado con alta prioridad. ¿Necesito pasar algún parámetro adicional a Handbrake para aprovechar los núcleos extra?

¡Gracias! Will.

¿Estás usando codificación por hardware? En ese caso, el factor limitante podría ser tu tarjeta gráfica y no el CPU.

Desactivé explícitamente la codificación por hardware: estoy usando una tarjeta RTX A4000 para codificación/descodificación de videostream en Blue Iris, lo cual la mantiene bastante ocupada. Intenté usar la configuración del sistema para limitar explícitamente el uso a solo 30 núcleos; veremos si eso hace algo.

Lamentablemente, sin éxito. Desactivé la selección explícita del núcleo y lo configuré con alta prioridad: aún así, el uso del procesador durante las codificaciones sigue siendo relativamente bajo.

Investigué en el sitio de HandBrake: no parece haber ninguna opción para especificar el número de hilos que puede usar, a menos que se me esté pasando algo por alto. Ahora investigaré FFMPEG.

¡Gracias! Will.

Establecí manualmente el perfil de FFMPEG para usar 50 núcleos; eso resultó en una utilización de CPU ligeramente mayor, pero un tiempo de conversión más lento.

Estoy actualizando el Handbrake CLI a la versión 1.51 para ver si eso cambia la utilización. También he establecido el directorio temporal en un SSD local en lugar de en un recurso compartido de red para asegurarme de que ese no sea el cuello de botella.

Si me siento realmente ambicioso, veré qué puedo obtener de PerfMon. ¡Gracias! Will.

La utilización de la CPU no ha cambiado, pero Handbrake es definitivamente mucho más rápido que FFMPEG para codificaciones basadas en CPU. He actualizado a la última versión estable 2.8x de FFMPEG y 1.51 de Handbrake CLI.

Desafortunadamente, no es tan sencillo, ya que depende de otros factores.

Cada perfil de codificación puede dividirse en múltiples acciones: decodificación, transcodificación o recodificación, filtros (recorte, entrelazado, escalado, ruido, etc.).

Todo el hardware (y el software subyacente) puede no admitir todas las operaciones. Por lo tanto, algunas partes pueden realizarse mediante hardware y otras mediante software. Cuando esto ocurre, también hay un componente de comunicación y transferencia de datos entre la CPU, la memoria y las tarjetas gráficas en el bus de datos. Dependiendo de cómo se realicen y sequencien las operaciones, los datos pueden ir y venir por el bus para una sola operación o quizá realizarse solo por la tarjeta gráfica, solo por la CPU o por una combinación de ambas.

Por eso verás que no se trata solo de cuántos núcleos hay, sino de qué operaciones deben realizarse, quién las realiza y dónde se llevan a cabo. Si HandBrake puede reducir la cantidad de veces que los datos fluyen de ida y vuelta entre la CPU y la GPU, eso podría explicar por qué tiene un mejor rendimiento que FFmpeg.

También podría ser que los filtros sean diferentes entre los perfiles de HandBrake y FFmpeg. Intentamos mantenerlos similares, pero siempre hay pequeñas diferencias en cómo cada software implementa un filtro. Algunos pueden delegarlo a la GPU, otros no, y otros pueden combinar la GPU y la CPU para una sola operación, lo que podría hacerlo aún más lento que una operación basada solo en la CPU, ya que los datos pasan tiempo en el bus viajando de ida y vuelta.

Hay algunas operaciones (como la decodificación) que suelen ser más eficientes en CPUs más nuevas, ya que el tiempo que tarda en transferir los datos a la GPU y volver tiene una latencia mayor que el tiempo que tardaría la CPU en completar la operación.

Cuando se utilizan tantos núcleos, lo mejor es ver cómo dividir las operaciones por separado para la CPU y la GPU, y creo que FFmpeg permite hacer eso al crear un argumento de línea de comandos completamente personalizado. También necesitarás información detallada sobre las capacidades de tu GPU para optimizarlo.