會(huì)議的使用場(chǎng)景大致是從上到下開大會(huì),區(qū)縣級(jí)組織部為主會(huì)場(chǎng),開到鄉(xiāng)鎮(zhèn)及行政村。主會(huì)場(chǎng)的視頻發(fā)送到下級(jí),同時(shí)主會(huì)場(chǎng)可以隨時(shí)查看各分會(huì)場(chǎng)視頻,了解大家參會(huì)及學(xué)習(xí)情況。除了集體講課外,還有互動(dòng)討論等,可以選擇不同的會(huì)場(chǎng)發(fā)言。
我們?nèi)渴褂肧IP解決方案。在硬件選擇上,主會(huì)場(chǎng)我們使用了GrandStream GXV3202設(shè)備,支持SIP視頻會(huì)議及雙流。村鎮(zhèn)級(jí)會(huì)場(chǎng)酌情使用GXV3202或質(zhì)優(yōu)價(jià)廉的機(jī)頂盒。
我們使用FreeSWITCH做為視頻會(huì)議的平臺(tái)。但是,F(xiàn)reeSWITCH單機(jī)無(wú)法支撐大規(guī)模的轉(zhuǎn)碼會(huì)議,項(xiàng)目又比較緊急。所以,我們最初采用了最簡(jiǎn)單的視頻會(huì)議方式,即不轉(zhuǎn)碼,不融屏,僅做視頻轉(zhuǎn)發(fā)的方式。這種方式有很多限制,比如所有參會(huì)方只能看到相同的內(nèi)容,我們也沒(méi)法打字幕。我們實(shí)現(xiàn)了一個(gè)Web界面,可以自動(dòng)輪循切換所有會(huì)場(chǎng),算是在一定程度上解決了第一個(gè)問(wèn)題,字幕的解決方案就是在會(huì)場(chǎng)現(xiàn)場(chǎng)后面掛橫幅或者放桌牌。
畢竟是能開會(huì)了,我們也在單機(jī)上做到了大約400路并發(fā)的規(guī)模,開了三次會(huì),都比較成功。
在開會(huì)的過(guò)程中,我們抓緊開發(fā)能轉(zhuǎn)碼融屏的會(huì)議。首先要解決的問(wèn)題就是多機(jī)會(huì)議串聯(lián)。我們采用了一主多從的結(jié)構(gòu)。即主會(huì)場(chǎng)全部撥入主服務(wù)器,而下級(jí)分會(huì)場(chǎng)撥入從服務(wù)器。主服務(wù)器和從服務(wù)器的會(huì)議室串聯(lián)。為了避免出現(xiàn)「看對(duì)眼」(即一路視頻信號(hào)上行又下行看到的畫面會(huì)無(wú)限循環(huán))的情況,也是為了解決不同會(huì)場(chǎng)看不同畫面,我們采用兩個(gè)畫布實(shí)現(xiàn)——上行視頻永遠(yuǎn)在畫布2上,下行視頻永遠(yuǎn)在畫布1上。
實(shí)驗(yàn)成功,最后我們用了5臺(tái)服務(wù)器搭建了一個(gè)集群,可以轉(zhuǎn)碼融屏,也可以打字幕了。但,這只是我們惡夢(mèng)的開始。
首先我們發(fā)現(xiàn)機(jī)頂盒頂不住了,經(jīng)常會(huì)出現(xiàn)花屏、卡頓,甚至死機(jī)。機(jī)頂盒版本比較老,上面有一個(gè)SIP終端軟件,是第三方開發(fā)的,對(duì)于我們來(lái)講就相當(dāng)于一個(gè)黑盒子,除了不斷地測(cè)試修改各種視頻參數(shù),我們確實(shí)也沒(méi)有更好的辦法進(jìn)行調(diào)試。不過(guò),在經(jīng)過(guò)無(wú)數(shù)次的實(shí)驗(yàn)后,我們還是找到了一些可行的參數(shù),做到了720p高清視頻,質(zhì)量不是最優(yōu),但是也算是足夠好了。
主會(huì)場(chǎng)實(shí)拍
多畫面
多畫面
大規(guī)模系統(tǒng)的另一個(gè)難點(diǎn)就是測(cè)試,雖然我們也部署了自動(dòng)化的測(cè)試,但測(cè)起來(lái)跟真實(shí)的場(chǎng)景數(shù)據(jù)有諸多出入,后來(lái)還是部署了人肉方式,放了一大批機(jī)頂盒實(shí)際入會(huì)測(cè)試。
機(jī)頂盒測(cè)試
項(xiàng)目是跟山東有線合作的,他們有很好的網(wǎng)絡(luò)基礎(chǔ)設(shè)施,人員配合也很到位。但無(wú)論如何并發(fā)就是上不去。又經(jīng)過(guò)無(wú)數(shù)有猜測(cè)與調(diào)試,請(qǐng)教了業(yè)界高人的情況下把問(wèn)題基本定位到Linux內(nèi)核的瓶頸。這……好像有點(diǎn)超綱了。一次偶然的機(jī)會(huì)換了臺(tái)機(jī)器測(cè)試,發(fā)現(xiàn)網(wǎng)絡(luò)瓶頸竟然不存在了,原因只是那臺(tái)機(jī)器的網(wǎng)卡不一樣。后來(lái),我們把所有服務(wù)器都換成了那個(gè)型號(hào)的網(wǎng)卡。
在實(shí)現(xiàn)過(guò)程中,我們也給FreeSWITCH打了一些補(bǔ)丁,主要是完成級(jí)聯(lián)的控制,以及修復(fù)一些Bug,做了一些優(yōu)化。比如與會(huì)者比較多,在大部分會(huì)場(chǎng)不上鏡(沒(méi)有人看該會(huì)場(chǎng)的畫面)的情況下,我們就停止對(duì)該會(huì)場(chǎng)的視頻進(jìn)行解碼,以節(jié)省CPU。
當(dāng)然,在打補(bǔ)丁的過(guò)程中我們也成功地植入了自己的Bug。在第一次上線的時(shí)候,測(cè)試了一整天,到了晚上臨近開會(huì)的時(shí)候,發(fā)現(xiàn)內(nèi)存在默默地增長(zhǎng),如此下去,根本撐不過(guò)晚上的會(huì)議,一身汗。好在我們提前部署了sofia recover,直接強(qiáng)制所有FreeSWITCH崩潰,重啟后僅有少數(shù)會(huì)場(chǎng)掉線,避免了最大的災(zāi)難,順利撐過(guò)了兩個(gè)多小時(shí)的會(huì)議。
會(huì)后我們連夜把內(nèi)存泄漏給修復(fù)了,至此,視頻會(huì)議系統(tǒng)算是可以交差了。又經(jīng)過(guò)幾輪優(yōu)化,現(xiàn)在,我們的平臺(tái)已經(jīng)有了正式的名稱,叫XSWITCH。
后來(lái)我們也實(shí)現(xiàn)了很多熱修復(fù)的手段,比如將所有在線的用戶都轉(zhuǎn)到echo Application,修復(fù)后reload mod_conference,再轉(zhuǎn)回來(lái)。因?yàn)楫吘箙f(xié)調(diào)幾百個(gè)機(jī)頂盒重新呼叫一遍也是很難的。
下圖是多級(jí)級(jí)連示意圖。主會(huì)場(chǎng)采集的視頻圖像放到主服務(wù)器的畫布1上,下發(fā)到從服務(wù)器進(jìn)而下發(fā)到終端。各終端圖像首先匯聚到從服務(wù)器畫布2上,上行到主服務(wù)器畫布2,主會(huì)場(chǎng)隨時(shí)可以選擇觀看畫布1或畫布2。
多級(jí)級(jí)連示意圖
使用這種方案,在終端數(shù)量增多時(shí)我們可以線性橫向擴(kuò)展。
會(huì)議系統(tǒng)運(yùn)行以來(lái),狀態(tài)良好。最近,我們完成了為期三天的視頻會(huì)議保障,涉及到600多個(gè)終端(鄉(xiāng)鎮(zhèn)及行政村),萬(wàn)名黨員,順便采集到一些技術(shù)數(shù)據(jù)。
下圖是某服務(wù)器200多個(gè)終端的帶寬情況。
某服務(wù)器200+終端
下圖是綜合視圖。
會(huì)控界面顯示該會(huì)議中共有434個(gè)終端入會(huì)。
會(huì)控界面
會(huì)控界面顯示各服務(wù)器的統(tǒng)計(jì)情況。顯示該會(huì)議中共有504個(gè)終端入會(huì)。
CPU內(nèi)存的監(jiān)控情況。
以上只是部分統(tǒng)計(jì)數(shù)據(jù)。當(dāng)時(shí)服務(wù)器上還有其它并行的會(huì)議在開?偟脕(lái)看,由于我們做了轉(zhuǎn)碼優(yōu)化,CPU反而沒(méi)有什么瓶頸了,而瓶頸在于網(wǎng)卡。我們暫時(shí)使用上行2M下行1M的碼率,理論上千兆的網(wǎng)卡可以支撐500路,或打8折400路的并發(fā)。我們暫時(shí)最大只跑了200多路,潛力有待進(jìn)一步驗(yàn)證。
下一步的優(yōu)化方案也很清晰:
增加一塊網(wǎng)卡可以提高一倍并發(fā)
使用動(dòng)態(tài)碼率控制,在參會(huì)方不上鏡的時(shí)候降低碼率或停發(fā)視頻,但需要客戶端配合
感謝各位領(lǐng)導(dǎo)的信任與支持,也感謝所有黨員同志們的大力支持。我們一定不會(huì)放過(guò)持續(xù)優(yōu)化的機(jī)會(huì),爭(zhēng)取發(fā)揮出硬件最大的性能,這是我們程序員的追求,也是我們的責(zé)任。
cpuinfo,懂的看 ;)
processor: 63
vendor_id: GenuineIntel
cpu family: 6
model: 79
model name: Intel(R) Xeon(R) CPU E5-2683 v4 @ 2.10GHz
stepping: 1
microcode: 0xb000021
cpu MHz: 1200.219
cache size: 40960 KB
physical id: 1
siblings: 32
core id: 15
cpu cores: 16
apicid: 63
initial apicid: 63
fpu: yes
fpu_exception: yes
cpuid level: 20
wp: yes
flags: fpu vme de …
bugs:
bogomips: 4201.09
clflush size: 64
cache_alignment: 64
address sizes: 46 bits physical, 48 bits virtual
power management:
關(guān)于FreeSWITCH視頻會(huì)議相關(guān)的技術(shù),很久以前在易靈微課上講過(guò)一次課:《是的,我們?cè)谧鲆曨l會(huì)議》,歡迎閱讀。
煙臺(tái)小櫻桃科技是FreeSWITCH開源項(xiàng)目的核心貢獻(xiàn)者,文中提到了很多補(bǔ)丁都已提交到FreeSWITCH的源代碼倉(cāng)庫(kù)。
煙臺(tái)小櫻桃科技招聘FreeSWITCH相關(guān)開發(fā)及運(yùn)維實(shí)施人員,如果有興趣加入我們,歡迎發(fā)郵件到 jobs@x-y-t.cn。
煙臺(tái)小櫻桃科技提供專業(yè)的FreeSWITCH技術(shù)支持及呼叫中心解決方案。歡迎參觀,郵件info@x-y-t.cn。
另外,我們將于11月22日在北京搞事情,歡迎參加:第八屆FreeSWITCH-CN開發(fā)者沙龍
如果您對(duì)具體的技術(shù)感興趣,也歡迎參加我們的FreeSWITCH培訓(xùn):FreeSWITCH高級(jí)培訓(xùn)冬季班-北京站