많은 양의 비디오나 동일한 CPU 집약적 작업 세트를 인코딩하기 위해 Linux를 어떻게 최적화할 수 있습니까?

많은 양의 비디오나 동일한 CPU 집약적 작업 세트를 인코딩하기 위해 Linux를 어떻게 최적화할 수 있습니까?

나는 하루 종일, 때로는 밤새도록 비디오를 거의 독점적으로 인코딩하는 4-5개의 컴퓨터 세트를 가지고 있습니다. 이 목적을 위해 최적화하는 방법을 찾기 위해 여러 번 검색했지만 성공하지 못했습니다.

내 전제: 여러 인코딩 프로세스를 동시에 실행하는 경우에만 비디오 인코딩에 거의 모든 CPU를 사용할 수 있어야 합니다.

문제: ('위쪽'부터)

작업: 총 382개, 실행 중 2개, 수면 중 380개, 중지됨 0개, 좀비 0개
%Cpu(들): 51.6 us, 36.8 sy, 0.0 ni, 9.6 id, 0.0 wa, 2.0 hi, 0.0 si, 0.0 st
KiB 메모리: 총 16425680개, 사용된 16171664개, 사용 가능한 254016개, 버퍼 30492개
KiB 스왑: 총 16769020개, 406056개 사용됨, 16362964개 무료. 15198692 캐시된 메모리

  PID 사용자 PR NI VIRT RES SHR S %CPU %MEM TIME+ 명령                                                                                                                         
31308 루트 20 0 486568 26000 5560 S 92.2 0.2 188:10.72 avconv                                                                                                                          
10340 루트 20 0 475832 19920 5532 S 91.2 0.1 13:40.42 avconv                                                                                                                          
12547 루트 20 0 473832 23672 5528 S 89.9 0.1 5:40.23 avconv                                                                                                                          
 8179 루트 20 0 477132 21200 5560 S 89.2 0.1 71:50.15 avconv                                                                                                                          
 9059 루트 20 0 472776 17960 5540 S 89.2 0.1 48:12.62 avconv                                                                                                                          
 9798 루트 20 0 477812 16976 5532 S 88.9 0.1 25:23.15 avconv                                                                                                                          
 8725 루트 20 0 476068 21696 5560 S 87.2 0.1 62:12.02 avconv                                                                                                                          
12657 루트 20 0 472332 22012 5524 S 86.9 0.1 6:21.28 avconv                                                                                                                          
12915 루트 20 0 473732 41888 5516 S 86.6 0.3 5:22.63 avconv                                                                                                                          
 8578 루트 20 0 476840 24100 5536 S 85.6 0.1 63:17.07 avconv                                                                                                                          
 7822 루트 20 0 472740 18940 5536 S 85.2 0.1 75:22.04 avconv                                                                                                                          
 9948 루트 20 0 485420 18116 5560 S 84.9 0.1 22:18.23 avconv                                                                                                                          
 7356 루트 20 0 476744 20084 5560 S 84.6 0.1 92:31.91 avconv                                                                                                                          
 9425 루트 20 0 471096 19684 5552 S 82.9 0.1 37:48.28 avconv                                                                                                                          
12464 루트 20 0 475004 24304 5532 R 81.6 0.1 6:30.16 avconv

14개의 서로 다른 비디오 파일을 동시에 인코딩함에도 불구하고 CPU 사용량은 약 50-55%에 불과합니다. 한 번에 더 적은 수의 스트림을 실행하는 경우 개별 스트림은 최대 약 400%CPU까지 실행됩니다. 여기서 위 그림과 같이 약 80-90%CPU만 사용합니다.

이것이 제가 이 상자에서 하길 원하는 유일한 것입니다. CPU 성능을 더 많이 활용하는 것이 가능합니까, 아니면 제 전제에 결함이 있습니까?

나는 지금까지 renice를 사용해 실험했지만 전혀 효과가 없었습니다. NI를 -20과 19로 설정하면 전체 또는 개별 인코딩에서 CPU 사용량이 더 많거나 적지 않게 됩니다.

vm.swappiness에 대해 좀 읽었지만, 어느 정도 swappiness가 더 좋을지 내 사용 사례를 명확하게 파악하지 못했습니다. 이렇게 하면 성능이 향상될 수 있습니까?

자세한 내용: 제가 포함하고 있는 컴퓨터는 Ubuntu 14.04를 실행하는 Dell R900입니다. cat /proc/cpuinfo16개의 Intel(R) Xeon(R) CPU E7330 @ 2.40GHz 프로세서 및 cat /proc/meminfo16Gb Ram이 나열되어 있습니다. 그룹의 다른 컴퓨터도 유사하며 동일한 동작을 보여줍니다. 이 인코딩은 모두 DV 비디오에서 Mpeg2 비디오로 이루어지며 때로는 다른 종류의 비디오도 인코딩합니다. 이러한 인코딩의 소스는 위의 최상위 게시물과 같이 아무 것도 쓰지 않는 네트워크 공격대에 있으며 읽기 속도는 300+Mb/s입니다. 목적지도 네트워크로 연결된 습격이므로 그다지 빠르지는 않지만 결과 mpeg 데이터는 입력 데이터보다 훨씬 작습니다.

답변1

먼저 고급 GPU는 인코딩을 몇 배나 향상시킵니다. 일반적으로 고급 비디오 카드를 사용하면 렌더링 시간이 몇 시간에서 몇 분으로 줄어듭니다. NVIDIA GPU가 필요할 수 있습니다.

‘-hwaccel_device[:stream_specifier] hwaccel_device (input,per-stream)’

    Select a device to use for hardware acceleration.

    This option only makes sense when the ‘-hwaccel’ option is also specified. Its exact meaning depends on the specific hardware acceleration method chosen.
    ‘vdpau’

        For VDPAU, this option specifies the X11 display/screen to use. If this option is not specified, the value of the DISPLAY environment variable is used
    ‘dxva2’

        For DXVA2, this option should contain the number of the display adapter to use. If this option is not specified, the default adapter is used. 

또한 CPU에도 이것이 필요합니다.

‘-threads[:stream_specifier] integer (input/output,video)’

    Possible values:

    ‘auto’

        autodetect a suitable number of threads to use 

관련 정보