EasyDarwin開源流媒體伺服器gettimeofday效能優化(3000萬/秒次優化至8000萬次/秒)
—本文由EasyDarwin開源團隊成員貢獻
一、問題描述
Easydarwin中大量使用gettimeofday來獲取系統時間,對系統性能造成了一定的影響。我們來做個測試:
While(1)
{
Gettimeofday(&tv,NULL);
}
每秒執行次數為約3000w次;
二、我們來看看gettimeofday函式核心實現
三、my_gettimeofday()實現
static inline int getcpuspeed_mhz(unsigned int wait_us)
{
u_int64_t tsc1, tsc2;
struct timespec t;
t.tv_sec = 0;
t.tv_nsec = wait_us * 1000;
rdtscll(tsc1);
// If sleep failed, result is unexpected, the caller should retry
if(nanosleep(&t, NULL))
return -1;
rdtscll(tsc2);
return (tsc2 - tsc1)/(wait_us);
}
int getcpuspeed()
{
static int speed = -1;
while(speed<100)
speed = getcpuspeed_mhz(50*1000);
return speed;
}
int my_gettimeofday(struct timeval *tv)
{
u_int64_t tick = 0;
// TSC偏移大於這個值,就需要重新獲得系統時間
static unsigned int max_ticks = 80000000;
rdtscll(tick);
if(walltime.tv_sec ==0 || cpuspeed_mhz==0 ||
(tick-walltick) > max_ticks)
{
if(tick==0 || cpuspeed_mhz==0)
{
cpuspeed_mhz = getcpuspeed();
max_ticks = cpuspeed_mhz*RELOAD_TIME_US;
}
//printf("gettimeofday again\n");
gettimeofday(tv, NULL);
memcpy(&walltime, tv, sizeof(walltime));
rdtscll(walltick);
return 0;
}
memcpy(tv, &walltime, sizeof(walltime));
// if RELOAD_TIME_US is 1, we are in the same us, no need to adjust tv
#if RELOAD_TIME_US > 1
{
uint32_t t;
t = ((uint32_t)tick) / cpuspeed_mhz;
TIME_ADD_US(tv, t);//add 1 us
}
#endif
return 0;
}
通過休眠一段時間,然後檢查cpu TSC變化,來大概估算cpu時鐘頻率,然後每次呼叫my_gettimeofday時,通過巨集,rdtscll獲取暫存器rdtsc暫存器的值,系統啟動後cpu的tick數,當然第一次要先獲取一下當前系統時間,gettimeofday。然後根據上面計算出來的cpu頻率,以及獲取到的cpu已經走過的tick數,計算出相對前面的gettimeofday時間的偏移,相加後得到當前系統時間。
備註:上面講過,由於通過休眠一段時間,統計cpu tick變化的方式統計的cpu頻率有一定誤差,因此。Cpu tick每走過80000000重新校驗一次,如果想要更高的精度,可以把這個值縮小。
四、優化後的測試效果
8000w+次每秒,效能提高了2-3倍。
在EasyDarwin上測試,通過easypusher_file推送100路,經過my_gettimeofday優化後,cpu消耗降低8%左右。
獲取更多資訊
Copyright © EasyDarwin.org 2012-2016
相關推薦
EasyDarwin開源流媒體伺服器gettimeofday效能優化(3000萬/秒次優化至8000萬次/秒)
—本文由EasyDarwin開源團隊成員貢獻 一、問題描述 Easydarwin中大量使用gettimeofday來獲取系統時間,對系統性能造成了一定的影響。我們來做個測試: While(1) { Gettimeofday(&t
EasyDarwin開源流媒體伺服器Golang版本:服務端錄影功能釋出
EasyDarwin開源流媒體伺服器(www.easydarwin.org)現在使用Go版本實現了。最新的程式碼提交,已經支援了推流(或者拉流)的同時進行本地儲存。 本地儲存的原理,是在推流的同時啟動ffmpeg作為一路Client來做儲存。ffmpeg在demux和mux的工作方面已經
EasyDarwin開源流媒體伺服器Golang版本:拉轉推功能之拉流實現方法
EasyDarwin開源流媒體伺服器(www.easydarwin.org),拉轉推是一個很有意義的功能,它可將一個獨立的RTSP資料來源“拉”到伺服器,再通過轉發協議轉發給多個客戶端,或者通過EasyDarwin的本地儲存功能進行儲存。國內大多攝像機都支援RTSP協議,通過拉轉推可將第三方
EasyDarwin開源流媒體伺服器提供的RTMP直播推送庫
EasyRTMP EasyRTMP是什麼? EasyRTMP是一個EasyDarwin配套使用,也可以單獨使用的RTMP推送庫,通過EasyRTMP我們就可以避免接觸到稍顯複雜的RTMP推送流程,只需要呼叫EasyRTMP的幾個API介面,就能輕鬆、穩定地把流媒體音視
EasyDarwin開源流媒體伺服器支援basic基本認證和digest摘要認證解析
RTSP認證作為RTSP標準協議的一部分,其內容在網上可以找到很多,在此就不在贅述。EasyDarwin作為RTSP伺服器也提供了對RTSP請求的基本認證和摘要認證。EasyDarwin用RTSPSession物件來處理RTSP請求,在其Run函式的kAuthenticati
解決用EasyDarwin開源流媒體伺服器做HLS直播時Flash Player卡住的問題
最近在開發EasyDarwin開源流媒體伺服器HLS直播的時候發現一個現象:在PC上用flash player播放HLS和在ios上面播放HLS時,效果明顯不同,在ios上播放非常穩定,而在flash player上播放會經常性卡住,需要重新重新整理網頁才能夠正常播放。經過
easyDarwin--開源流媒體實現
移動互聯 流媒體服務 現在 幫助 接口 需求 -type layer dia EasyDarwin 是由國內開源流媒體團隊開發和維護的一款開源流媒體平臺框架,從2012年12月創建並發展至今,從原有的單服務的流媒體服務器形式,擴展成現在的雲平臺架構的開源項目,更好地幫助
EasyDarwin開源流媒體雲平臺之語音對講功能設計與實現
EasyDarwin雲平臺一直在穩步的升級迭代中,近日,EasyDarwin雲平臺實現了語音對講的功能。對講功能的加入,標誌著EasyDarwin雲平臺進一步的完善。 流程設計 客戶端使用POST的方式在body中攜帶協議報文向雲平臺傳送開始對講命令; 雲
EasyDarwin開源流媒體專案
EasyDarwin是由國內開源流媒體團隊維護和迭代的一整套開源流媒體視訊平臺框架,從2012年12月建立並發展至今,包含有單點服務的開源流媒體伺服器,和擴充套件後的流媒體雲平臺架構的開源框架,開闢了諸多的優質開源專案,能更好地幫助廣大流媒體開發者和創業型企
主流開源流媒體伺服器收集
流媒體解決方案 Live555流媒體平臺框架 EasyDarwin實時流媒體播放伺服器程式DarwinStreamingSrvr流媒體實時傳輸開發包 jrtplib多媒體處理工具 ffmpeg多媒體編碼工具包LibavFlash流媒體伺服器 Red5流媒體伺服器 Open
開源流媒體Red5-編譯和部署
zip 地址 就是 dea 環境 bubuko -s target package 源碼下載地址:https://github.com/Red5/red5-server 使用工具:IntelliJ IDEA 下載源碼後直接用IDEA打開,等待全部加載完成後 編譯看是否報
開源流媒體系統:OBS ( Open Broadcaster Software ) 介紹
無意間發現了一個非常優秀的開源流媒體系統:OBS ( Open Broadcaster Software ) 執行截圖: 該軟體是基於MFC的,下載原始碼後一次性就可以編譯通過,使用很簡單。 使用了以下開源庫: x264 -
EasyPlayer開源流媒體移動端播放器推出RTSP-RTMP-HTTP-HLS全功能Pro版
EasyPlayerPro介紹 Android EasyPlayerPro專業版全功能播放器,是由EasyDarwin開源團隊維護的一款支援RTSP、RTMP、HTTP、HLS多種流媒體協議的播放器版本。Android上同時保留原來RTSP專用播放器,功能精煉
Windows下Red5流媒體伺服器搭建及使用(二)
搭建好流媒體伺服器之後,如何使用呢。 1,更改IP與埠。 進入red5-server\conf資料夾下,開啟red5.properties檔案 # HTTP http.host=172.16.129.178 http.port=3002 https.port=3003
Windows下Red5流媒體伺服器搭建及使用(一)
前段時間把red5伺服器搭建好了,現在記錄下是如何搭建的。 1,下載對應版本的red5 https://github.com/Red5/red5-server/releases 2,如果沒有安裝JAVA環境的安裝JDK並設定環境變數(該步驟自行搜尋) 3,解壓red5
怎麼用ssh開啟遠端伺服器上的teamviewer (shit!弄這玩意花了我大半天時間)
必須記錄一下在我裝軟體道路上的其中一個絆腳石,狗血經歷,開學一個月了,裝軟體裝的我懷疑人生,我的研究生生活難道要就此止步於裝軟體了?。。。想起剛開始裝docker,接著又是SimpleElastix ,現在又卡在裝Matlab ,每個都得花我好幾天時間,我遇到的錯誤也是奇葩,各種找不到解決辦
大話SQL Server性能優化(MSSQL高並發、性能調控、實踐)
索引 sha 簡單 系統性能 密碼 速度 ref 多應用 通過 大話SQL Server性能優化(MSSQL高並發、性能調控、實踐)網盤地址:https://pan.baidu.com/s/1KxdfcQD0XGD3M2ja_Y7UWQ 提取碼:435v備用地址(騰訊微雲)
怎麼用ssh開啟遠端伺服器上的teamviewer (shit!弄這玩意花了我大半天時間)
必須記錄一下在我裝軟體道路上的其中一個絆腳石,狗血經歷,開學一個月了,裝軟體裝的我懷疑人生,我的研究生生活難道要就此止步於裝軟體了?。。。想起剛開始裝docker,接著又是SimpleElastix ,現在又卡在裝Matlab ,每個都得花我好幾天時間,我遇到的
通俗易懂客戶端與伺服器端互動原理(HTTP資料請求與HTTP響應,包括Servlet部分)
經常看到HTTP客戶端與伺服器端互動原理的各種版本的文章,但是專業術語太多,且流程過於複雜,不容易消化。於是就按照在 Servlet 裡面的內容大致做了一些穿插。本來 連 Tomcat 容器 和 Servlet 的生命週期也準備在這裡一起寫的,但怕過去龐大,於是就簡單的 引用
sql優化(查詢大資料量時sql執行時間過長)
問題:Oracle資料庫 sql查詢的優化(成交額統計表的sql查詢時間過長進行的優化) 解決辦法:對sql語句中使用檢視的部分替換為子查詢,對查詢表條件欄位建立索引 引發的問題:在什麼情況下建立索引,及建立索引後引發的開銷有哪些 經查詢oracle的索引機制,摘錄如下: