如何將CDN視頻轉碼集羣的吞吐打到10Gb/s

    視頻業務中要提供視頻的轉碼,切片和縮略圖,這類業務有個明顯特色,都是高cpu ,高網絡吞吐的。下面主要介紹背景,有大批量文件須要 hls 切片,這是個耗cpu 的過程,而後,須要從源拉取切片再推回去,並且整個業務,有時間限制,因此,這裏須要平衡cpu ,網絡流量和磁盤。ios

該文章後續仍在不斷的更新修改中, 請移步到原文地址http://dmwan.ccbash

    環境介紹:萬兆光卡 + 萬兆光纖,ssd 硬盤。網絡

    首先,速度測試,ffmpeg codec copy (不設置,就不必定是輸入的編碼,就可能產生解碼操做,極大影響性能)切片的速度大概是100M/s ,單機帶寬能夠打到500M/s。異步

方案一: cpu 核數線程調用ffmepg,ffmpeg -i 直接指定url 拉,每一個線程for 循環推,或者直接ffmpeg推。性能

    這個是最開始想的方案, 結果ffmpeg 邊拉邊切片,速度比直接切片慢了10倍。這裏先download。測試

方案二, cpu 核數線程調用ffmepg,先download 下載,再切片,循環上傳。優化

    結果,cpu 特別低,流量也打不高。根本不能再指定時間完成任務。編碼

方案三,多進程調用ffmpeg, 線程池或者協程池推文件,將上行帶寬打高。url

    最終選擇的是多進程+線程池的方式,這裏並非阻塞業務,異步並不會由太大的效果。可是又出了問題,因爲網速很快,將iowait打到90%。線程

    總體吞吐只能到80M/s 不到。明顯是磁盤出了異常。

iostat -d -k 1 10

查詢,磁盤寫入速度不到100M,這是ssd 硬盤啊!這種順序讀寫,溝通了下,磁盤寫能夠理論上達到500MB/s,因此兩種處理方式:

    第一種,橫向掛四塊盤,將全部請求hash到不一樣盤。發現寫入速度直接提升近4倍。

    第二種,調整ssd硬盤,調整4k對齊後,速度提升3倍左右(由同時調整,應該是仍沒達到理想性能)。

通過上面的優化,單機總體吞吐,能達到400MB/s。

還有可能的優化,怎麼平衡轉碼和切片;在一次demuxer 後,轉碼和切片執行不用屢次解封裝;分段並行轉碼(有難點);cpu改爲gpu轉碼; ffmpeg自己參數filter 及其複雜,該如何封裝;縮略圖等業務會產生大量小文件,如何減小這種小文件的讀寫,等等。。。