Video視頻播放中斷問題排查記錄


 

問題描述:

       自視頻播放功能上線以來,經過初步的測試發現,視頻播放一段時間后會出現中斷的情況,中斷的播放時長不固定(有的在三分鍾左右中斷,有的在十幾分鍾才中斷),刷新后又能接着播放,但馬上又中斷了,出現類似提示:

問題排查:

分析可能出現的原因:

1、 網絡問題。

2、 代碼問題。

3、 videojs問題。

4、 視頻格式問題(畢竟經過轉換)。

5、 服務器問題(最容易忽略、最難排查的原因)。

 

針對可能出現的原因逐一排查:

  1)網絡問題:怎么刷新都還是有問題(有時候刷新后能接着播放),於是排除網絡原因。

  2)代碼問題:看到錯誤的第一反應就是查看瀏覽器控制台,看是否有蛛絲馬跡,果然是有錯誤提示,百度這個提示給出的大部分答案是瀏覽器不支持此視頻播放,但顯然不是,因為都播放了一段時間了才出現的。

那只能去看tomcat日志信息了,發現后台也有異常提示,但不是每次刷新都會提示

 

開始排查后端代碼,發現有一段代碼使用了FileInputStream后沒關閉,將此流關閉后異常確實報的沒那么頻繁了,可問題依然存在。

       3)videojs問題:視頻播放采用videojs,開始嘗試用不同的瀏覽器測試播放功能,排查videojs版本與瀏覽器的兼容性問題,將原來的5.8.0版本換成7.10.2版本發現播放好像好了一點,再嘗試換了幾個版本效果也差不多。換火狐和IE瀏覽器測試,測了大概3輪都能正常播放。火狐在第4輪測試發現還是會出現自動暫停的情況,點播放后可以接着放,IE瀏覽器沒再顧得上,說明問題還是存在的。(測試太耗時且測試的數據量不大,代表性不強)

       4)格式問題:視頻是經過其它部門的兄弟進行過格式轉換過,懷疑可能是轉換過程中視頻的某項參數配置有問題,於是各種百度ffmpeg的用法,費時費力的進行各種轉換測試,可結果還是不盡人意,問題還是沒得到解決。

       5)服務器問題:這真是一個最容易讓人忽略,也是最難排查的原因,畢竟服務器運行好幾年了,對它還是比較自信的,去查看tomcat的server.xml配置發現幾乎沒做過任何改動(除了端口號),tomcat默認的參數配置可能滿足不了系統現有功能承載量。開始試着改server.xml參數配置,因為是視頻播放,可能比較吃帶寬,當帶寬比較小的時候可能會出現超時中斷的情況,於是把默認的鏈接超時時間由20000改成60000,測試了十幾個視頻后發現都能正常播放了。初步確定是tomcat服務器參數配置的問題了,開始設置不同的參數進行測試驗證,從jvisualvm監控數據可以看出,線程數訪問數已經遠遠超過了tomcat默認(200)配置的線程訪問量,超過這個數量的連接將被等待甚至超時放棄,所以我們需要提高這方面的處理能力。

 

解決方案:

修改tomcat配置,配置如下:

<!-- Executor 配置說明
     name: 共享線程池的名字,這是 Connector 為了共享線程池要引用的名字,該名字必須唯一、默認值: None
     namePrefix: 在JVM上,每個運行線程都可以有一個name 字符串,這一屬性為線程池中每個線程的name字符串設置了一個前綴,Tomcat將把線程號追加到這一前綴的后面、默認值: catalina-exec-
     maxThreads: Tomcat 使用線程來處理接收的每個請求,這個值表示 Tomcat 可創建的最大的線程數,默認值是 150
     minSpareThreads: 最小空閑線程數,Tomcat 啟動時的初始化的線程數,表示即使沒有人使用也開這么多空線程等待,默認值是 4
     maxSpareThreads: 最大備用線程數,一旦創建的線程超過這個值,Tomcat 就會關閉不再需要的 socket 線程
     maxIdleTime: 在Tomcat關閉一個空閑線程之前,允許空閑線程持續的時間(以毫秒為單位)默認值 60000 ms,只有當前活躍的線程數大於 minSpareThreads 的值,才會關閉空閑線程,默認值 60000 ms
-->
<Executor name="tomcatThreadPool" namePrefix="gy-catalina-exec-"
     maxThreads="500" minSpareThreads="20" maxSpareThreads="50" maxIdleTime="60000"/>

<!-- Connector 配置說明
     executor: 指定 executor 執行器,配置不可與 Connector 的配置重復
     port: 端口號
     protocol: 使用的網絡協議,表示tomcat使用何種方式來接受和處理client端請求,默認值HTTP/1.1,等效於"org.apache.coyote.http11.Http11Protocol";還有熟悉的"AJP/1.3";
     URIEncoding: 指定 Tomcat 容器的 URL 編碼格式,語言編碼格式這塊倒不如其它 WEB 服務器軟件配置方便,需要分別指定
     connnectionTimeout: 網絡連接超時,單位:毫秒,設置為 0 表示永不超時,這樣設置有隱患的。通常可設置為 30000 毫秒,可根據檢測實際情況,適當修改
     enableLookups: 是否反查域名,以返回遠程主機的主機名,取值為:true 或 false,如果設置為false,則直接返回IP地址,為了提高處理能力,應設置為 false
     disableUploadTimeout: 上傳時是否使用超時機制
     connectionUploadTimeout: 上傳超時時間,畢竟文件上傳可能需要消耗更多的時間,以使 Servlet 有較長的時間來完成它的執行,需要與 disableUploadTimeout 參數一起配合使用才會生效
     acceptCount: 指定當所有可以使用的處理請求的線程數都被使用時,可傳入連接請求的最大隊列長度,超過這個數的請求將不予處理,默認為100個
     keepAliveTimeout: 長連接最大保持時間(毫秒),表示在下次請求過來之前,Tomcat 保持該連接多久,默認是使用 connectionTimeout 時間,-1 為不限制超時
     maxKeepAliveRequests: 表示在服務器關閉之前,該連接最大支持的請求數。超過該請求數的連接也將被關閉,1表示禁用,-1表示不限制個數,默認100個,一般設置在100~200之間
     compression: 是否對響應的數據進行 GZIP 壓縮,off:表示禁止壓縮;on:表示允許壓縮(文本將被壓縮)、force:表示所有情況下都進行壓縮,默認值為off,壓縮數據后可以有效的減少頁面的大小,一般可以減小1/3左右,節省帶寬
     compressionMinSize: 表示壓縮響應的最小值,只有當響應報文大小大於這個值的時候才會對報文進行壓縮,如果開啟了壓縮功能,默認值就是2048
     compressableMimeType: 壓縮類型,指定對哪些類型的文件進行數據壓縮
     redirectPort: 當用戶用http請求某個資源,而該資源本身又被設置了必須要https方式訪問,此時Tomcat會自動重定向到這個redirectPort設置的https端口
-->
<Connector executor="tomcatThreadPool"
          port="8080" protocol="HTTP/1.1"
          URIEncoding="UTF-8"
          connectionTimeout="30000"
          enableLookups="false"
          disableUploadTimeout="false"
          connectionUploadTimeout="150000"
          acceptCount="300"
          keepAliveTimeout="120000"
          maxKeepAliveRequests="150"
          compression="on"
          compressionMinSize="2048"
          compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain,image/gif,image/jpg,image/png" 
          redirectPort="8443" />
View Code

配置說明:參考官方文檔http://tomcat.apache.org/tomcat-8.0-doc/config/http.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM