關(guān)于針對(duì)OpenSIPS性能優(yōu)化的討論中,無(wú)論從早期的研究還是當(dāng)前的研究中,大家對(duì)優(yōu)化的手段仍然集中在數(shù)據(jù)庫(kù)處理,CPU消耗和存儲(chǔ)設(shè)備的處理上。因?yàn)榧夹g(shù)的不斷進(jìn)步和其他軟件手段的更新和資源的關(guān)系,一些優(yōu)化手段也逐漸被引入,包括了分布式部署,云計(jì)算的其他工具。因?yàn)楸救四芰唾Y源有限,筆者不可能涉及太多的討論,我們僅簡(jiǎn)單討論通過(guò)自己資源可以優(yōu)化的方式,以便幫助讀者能夠?qū)penSIPS的優(yōu)化有一個(gè)非;镜恼J(rèn)識(shí),也是對(duì)OpenSIPS的性能做一個(gè)比較淺顯的分析。這里,筆者首先介紹了關(guān)于OpenSIPS的早期版本OpenSERR的優(yōu)化研究成果的背景介紹,然后介紹了關(guān)于MYSQL如何影響OpenSIPS的性能,接下來(lái)介紹了使用內(nèi)存做某些模塊優(yōu)化的概念,最后介紹了如何使用Cache實(shí)現(xiàn)SIP用戶注冊(cè)的示例實(shí)踐。
測(cè)試前說(shuō)明,如果用戶沒(méi)有安裝OpenSIPS和MYSQL數(shù)據(jù)庫(kù)的話,筆者不再介紹如何安裝OpenSIPS和mysql數(shù)據(jù)庫(kù),用戶需要首先安裝OpenSIPS和MYSQL環(huán)境,然后再進(jìn)行下面的示例測(cè)試。具體安裝配置方式,讀者可以參考:
最完整快速的安裝方式安裝開(kāi)源OpenSIPS-3.1和CP控制界面-class 8
如何使用OpenSIPS實(shí)現(xiàn)呼叫隊(duì)列/hunt group
1關(guān)于OpenSIPS的性能研究背景介紹
在早期的OpenSER(OpenSIPS/Kamailio前身)版本使用中,一些研究人員一直對(duì)其服務(wù)器的性能數(shù)據(jù)庫(kù)的使用做不同環(huán)境的研究,其中對(duì)數(shù)據(jù)庫(kù)和CPU操作的研究做了很多工作,研究人員也提出了很多有價(jià)值的建議和測(cè)試結(jié)果。除了官方的測(cè)試文檔以外,個(gè)人覺(jué)得幾位研究人員的論文也值得參考。C. P. Wright就在OpenSER的早期版本針對(duì)不同的硬件平臺(tái)和不同的mysql數(shù)據(jù)庫(kù)的處理發(fā)布了關(guān)于SIP server performance on multicore systems的論文。如果讀者對(duì)此論文有興趣的話,可以參考此另外作為一個(gè)理論支撐來(lái)優(yōu)化自己的系統(tǒng)。

此圖片以及以下圖片均來(lái)自于互聯(lián)網(wǎng)資源
Charles Shen和其他研究人員針對(duì)OpenSIPS的TLS加密對(duì)OpenSIPS的影響做了一個(gè)研究(The Impact of TLS on SIP Server Performance),通過(guò)其研究結(jié)果我們?nèi)匀豢梢钥吹结槍?duì)CPU的性能的測(cè)試數(shù)據(jù)。

2OpenSIPS使用mysql
隨著OpenSIPS的技術(shù)架構(gòu)不斷優(yōu)化,各種應(yīng)用場(chǎng)景的優(yōu)化,OpenSIPS的性能也得到了很大的提升。官方對(duì)OpenSIPS的性能有一個(gè)關(guān)于壓力測(cè)試的檢測(cè)數(shù)據(jù)。在其結(jié)論中,數(shù)據(jù)庫(kù)的操作是影響OpenSIPS的CPS的一個(gè)非常重要的因素。如果想提高OpenSIPS的性能,官方推薦盡量使用Caching(緩存)來(lái)提升OpenSIPS的性能。在默認(rèn)的OpenSIPS環(huán)境中,到了使用了mysql數(shù)據(jù)庫(kù)對(duì)一些模塊的數(shù)據(jù)進(jìn)行查處,很多時(shí)候也對(duì)數(shù)據(jù)庫(kù)進(jìn)行調(diào)用。OpenSIPS中使用了數(shù)據(jù)庫(kù)的模塊包括:
- AUTH_DB
- USRLOC
- PERMISSIONS
- DIALPLAN
- DROUTING
- BLACKLIST
- DOMAIN
- AVPOPS
- 其他模塊
在一般中小型的平臺(tái)應(yīng)用環(huán)境中,這些模塊數(shù)據(jù)讀取可能不會(huì)影響OpenSIPS的性能。但是,如果SIP用戶數(shù)量達(dá)到一定的級(jí)別,呼叫路由規(guī)則,黑白名單模塊的數(shù)量達(dá)到一定級(jí)別以后,每個(gè)呼叫都要經(jīng)過(guò)這些流程的處理的話,如果這些數(shù)據(jù)通過(guò)數(shù)據(jù)庫(kù)的頻繁讀取就會(huì)嚴(yán)重影響系統(tǒng)的性能,可能數(shù)據(jù)庫(kù)也會(huì)受到嚴(yán)重影響。在默認(rèn)環(huán)境中,MYSQL的連接是100,這就會(huì)導(dǎo)致CPU不斷頻繁調(diào)用數(shù)據(jù)庫(kù)操作, 對(duì)存儲(chǔ)設(shè)備的使用頻率也會(huì)增加。很多時(shí)候,因?yàn)樵O(shè)計(jì)原因或者處理速度減慢,一些MYSQL具體的命令也會(huì)影響到CPU的消耗,這仍然需要用戶通過(guò)一定的命令手段來(lái)進(jìn)行排查。比較幸運(yùn)的是,目前MYSQL開(kāi)源數(shù)據(jù)庫(kù)都支持了相應(yīng)的排查工具來(lái)實(shí)現(xiàn)跟蹤MYSQL命令檢測(cè)CPU的消耗。具體實(shí)現(xiàn)方式:
pidstat -t -p <mysqld_pid> 1
mysql > select * from performance_schema.threads where THREAD_OS_ID = XXXXX \G
mysql > select * from performance_schema.threads where THREAD_OS_ID = XXXXX \G
一步步排查每個(gè)SQL 命令的消耗狀態(tài)。具體排查方式,請(qǐng)參考鏈接。
除了MYSQL數(shù)據(jù)庫(kù)的配置以外,存儲(chǔ)設(shè)備的讀取速度也是一個(gè)影響系統(tǒng)性能的重要因素。目前,無(wú)論是HDD還是SSD的存儲(chǔ)方式,它們的讀取速度仍然落后內(nèi)存讀取的速度。因此優(yōu)化內(nèi)存是一個(gè)比較可行的,相對(duì)低成本的方式。具體關(guān)于通過(guò)存儲(chǔ)設(shè)備選擇優(yōu)化系統(tǒng)的討論,讀者可以參考鏈接的內(nèi)容,這里不再贅述。
3OpenSIPS中使用Cache緩存
在緩存使用的優(yōu)化中,SIP用戶注冊(cè)就是一個(gè)非常典型的例子(其他模塊,例如TM/事務(wù)處理也非常消耗資源)。在我們的用戶場(chǎng)景中,假設(shè),SIP用戶需要一般每隔60秒對(duì)OpenSIPS進(jìn)行注冊(cè),這樣OpenSIPS才能獲得其狀態(tài)。為了讓服務(wù)器端獲得其狀態(tài),SIP客戶端只能每隔一段時(shí)間對(duì)服務(wù)器支持,刷新數(shù)據(jù)庫(kù)的數(shù)據(jù)。這樣的操作其實(shí)是非常消耗系統(tǒng)的注意,數(shù)據(jù)庫(kù)性能也會(huì)大大下降。在OpenSIPS的模塊中,例如INVITE呼叫,撥號(hào)規(guī)則路由查詢等類(lèi)似SIP注冊(cè)這樣的操作很多,需要經(jīng)常頻繁調(diào)用一些常規(guī)數(shù)據(jù)。這樣的操作可以通過(guò)一定的手段進(jìn)行優(yōu)化,從而達(dá)到系統(tǒng)優(yōu)化的目的。catching就是其中一種非常實(shí)用的優(yōu)化方式,通過(guò)在內(nèi)存存儲(chǔ)這些數(shù)據(jù),OpenSIPS可以不通過(guò)數(shù)據(jù)庫(kù)調(diào)用來(lái)查詢數(shù)據(jù),直接調(diào)用內(nèi)存中的數(shù)據(jù),從而提高了OpenSIPS的運(yùn)行速度。如果OpenSIPS優(yōu)化中使用caching(緩存方式)的話,可以直接從caching緩存中獲取用戶注冊(cè)信息,速度快,也無(wú)需訪問(wèn)數(shù)據(jù)庫(kù)。在OpenSIPS環(huán)境中,目前支持的緩存是通過(guò)OpenSIPS core 模塊和其他模塊實(shí)現(xiàn)。支持的方式包括:Local Cache, MemCache,Redis, Cassandra, MongoDB和CouchBase。在OpenSIPS中的其設(shè)置非常簡(jiǎn)單:

除了存儲(chǔ)以外,OpenSIPS還可以移除cache,提取,查詢新的數(shù)據(jù)等功能。OpenSIPS支持的cache用戶驗(yàn)證流程:

通過(guò)以上圖例,我們可以看到,OpenSIPS關(guān)于緩存處理的基本處理邏輯是,OpenSIPS通過(guò)執(zhí)行MYSQL 認(rèn)證數(shù)據(jù)庫(kù),把用戶名稱和密碼存儲(chǔ)在cache中,緩存數(shù)據(jù)保持一定的生命周期。如果新新用戶需要驗(yàn)證的話,首先檢測(cè)緩存中存儲(chǔ)的數(shù)據(jù),如果此用戶的數(shù)據(jù)存儲(chǔ)在緩存中,則直接此緩存中查詢用戶驗(yàn)證信息;如果在緩存中沒(méi)有此用戶的信息,則返回?cái)?shù)據(jù)庫(kù)進(jìn)行查詢,執(zhí)行驗(yàn)證流程。下一次用戶需要認(rèn)證時(shí),OpenSIPS就會(huì)從緩存中提取用戶驗(yàn)證信息而不是再次通過(guò)執(zhí)行數(shù)據(jù)庫(kù)驗(yàn)證來(lái)驗(yàn)證用戶信息,這樣就會(huì)降低對(duì)mysql的讀取次數(shù)。用戶名稱和用戶密碼通過(guò)不同的key pair來(lái)實(shí)現(xiàn)。
4OpenSIPS中使用Memcache支持SIP注冊(cè)
筆者介紹了基本的cache的操作步驟,現(xiàn)在我們針對(duì)SIP用戶注冊(cè)的緩存處理做一個(gè)配置示例,通過(guò)此示例說(shuō)明OpenSIPS如何通過(guò)緩存數(shù)據(jù)來(lái)驗(yàn)證用戶密碼的流程。OpenSIPS官方網(wǎng)站對(duì)此配置有簡(jiǎn)單的說(shuō)明,具體模塊配置的細(xì)節(jié)讀者可以參考官方配置文檔,我們這里僅通過(guò)一個(gè)配置cfg基本來(lái)說(shuō)明演示SIP賬號(hào)的驗(yàn)證處理流程。用戶需要按照以下幾個(gè)步驟來(lái)配置緩存驗(yàn)證的流程。
首先,用戶需要編輯cfg文件,添加必要的支持模塊:
modparam("auth", "calculate_ha1", 1)
modparam("auth","username_spec","$avp(userspec)")
modparam("auth","password_spec","$avp(passwd)")
然后加載此模塊:
loadmodule "cachedb_local.so"
處理cache數(shù)據(jù)的邏輯,添加緩存中的數(shù)據(jù)庫(kù)用戶名稱和用戶密碼。在注冊(cè)處理流程模塊做用戶驗(yàn)證,cfg首先執(zhí)行緩存數(shù)據(jù)的驗(yàn)證,然后執(zhí)行mysql數(shù)據(jù)庫(kù)驗(yàn)證,最后保存緩存數(shù)據(jù)流程。
route[handle_register] // 執(zhí)行緩存處理和數(shù)據(jù)庫(kù)驗(yàn)證處理流程:
if(cache_fetch("local","passwd_$tU@$td",$avp(passwd))) {
$avp(userspec) = $tU;
// 通過(guò)緩存數(shù)據(jù)驗(yàn)證用戶名稱和密碼,否則執(zhí)行mysql數(shù)據(jù)庫(kù)驗(yàn)證
if (!pv_www_authorize("")) {
www_challenge("", " auth,auth-int " );
exit;
}
} else { // 執(zhí)行mysql數(shù)據(jù)庫(kù)驗(yàn)證
if (!www_authorize("", "subscriber")) {
www_challenge("", "auth");
exit;
}
// 執(zhí)行數(shù)據(jù)庫(kù)用戶的密碼驗(yàn)證,保存到緩存中
cache_store("local","passwd_$tU@$td","$avp(passwd)",1200);
}
// 完成驗(yàn)證
if (!$au==$tU) {
send_reply(403,"Forbidden auth ID");
exit;
}
if (!save("location"))
sl_reply_error();
exit;
}
保存cfg配置文件以后,用戶重新啟動(dòng)OpenSIPS,然后通過(guò)mysql log日志觀察log消息,查看數(shù)據(jù)庫(kù)數(shù)據(jù)的變化。具體mysql數(shù)據(jù)庫(kù)的log設(shè)置,用戶可以通過(guò):
mysql -e "SET GLOBAL general_log=1;"
mysql -e "SET GLOBAL general_log_file='mariadb.log';"
其log保存的文件路徑在 /var/lib/mysql/mariadb.log 。
如果用戶要測(cè)試其配置是否成功的話,用戶也可以使用一個(gè)SIP軟電話執(zhí)行注冊(cè)然后退出,再次執(zhí)行注冊(cè)流程,查看打印日志的變化。通過(guò)兩次SIP賬號(hào)注冊(cè),如果配置正確的話,用戶注冊(cè)時(shí)應(yīng)該分別訪問(wèn)了mysql數(shù)據(jù)庫(kù)和cache的保存的數(shù)據(jù)。
通過(guò)緩存方式驗(yàn)證SIP注冊(cè)以外,此用戶的密碼仍然可以使用在其他的請(qǐng)求中,例如INVITE請(qǐng)求呼叫或者訂閱消息中。如果實(shí)現(xiàn)INVITE呼叫的話,需要使用pv_proxy_authorize()來(lái)實(shí)現(xiàn),同時(shí)需要修改幾個(gè)相關(guān)的變量(例如,$fu等)來(lái)保存相關(guān)的緩存數(shù)據(jù)。用戶也可以通過(guò)此思路做進(jìn)一步的驗(yàn)證,這里不做過(guò)多討論。
通過(guò)以上示例,讀者可以看到,我們使用一個(gè)SIP 賬號(hào)實(shí)現(xiàn)的緩存數(shù)據(jù)驗(yàn)證的流程。讀者可以想象一下,如果服務(wù)器啟動(dòng)以后,成百上千個(gè)SIP用戶同時(shí)對(duì)OpenSIPS服務(wù)器端發(fā)起注冊(cè)的話,沒(méi)有緩存驗(yàn)證的支持的話,對(duì)數(shù)據(jù)庫(kù)是一個(gè)非常大的挑戰(zhàn)。所以,通過(guò)緩存數(shù)據(jù)的調(diào)用可以優(yōu)化OpenSIPS的性能。
另外,讀者可以看到,我們實(shí)際上實(shí)現(xiàn)的是一個(gè)按需驗(yàn)證數(shù)據(jù)庫(kù)的過(guò)程,每個(gè)用戶注冊(cè)時(shí),需要重復(fù)執(zhí)行以上的步驟,把數(shù)據(jù)庫(kù)數(shù)據(jù)緩存到內(nèi)存的緩存數(shù)據(jù)中。另外一個(gè)更加優(yōu)化的方式是,在OpenSIPS啟動(dòng)以后,使用full caching的方式,在起始的啟動(dòng)腳本邏輯模塊中就完全提取數(shù)據(jù)庫(kù)用戶驗(yàn)證數(shù)據(jù),然后在緩存中保存這些完整的全部驗(yàn)證數(shù)據(jù)。通過(guò)這樣的操作就避免了每一次用戶注冊(cè)都需要進(jìn)行數(shù)據(jù)庫(kù)的驗(yàn)證處理,僅需要通過(guò)緩存驗(yàn)證流程。
5總結(jié)
在本文章中,筆者首先介紹了關(guān)于系統(tǒng)性能測(cè)試的背景,然后介紹了mysql對(duì)OpenSIPS的影響,接下來(lái)筆者針對(duì)OpenSIPS中使用的一些必要模塊做了介紹,最后通過(guò)SIP注冊(cè)的示例說(shuō)明使用緩存的方式。通過(guò)此基本示例讓讀者了解如何優(yōu)化自己的OpenSIPS平臺(tái),實(shí)現(xiàn)更強(qiáng)大的性能處理能力。
用戶使用MemCache可以優(yōu)化OpenSIPS的性能,但是使用內(nèi)存處理同樣也會(huì)引起其他的問(wèn)題,例如系統(tǒng)維護(hù)問(wèn)題,腳本處理流程需要規(guī)范,同步cache和拓展性的問(wèn)題。用戶最終需要評(píng)估使用MemCache的風(fēng)險(xiǎn)來(lái)決定是否使用MemCache。
隨著技術(shù)的不斷進(jìn)步,用戶當(dāng)然也可以考慮使用其他的方式來(lái)優(yōu)化或者改善OpenSIPS的性能,例如,使用分布式數(shù)據(jù)庫(kù),使用更高速的存儲(chǔ)設(shè)備,其他的軟件手段等方式。
參考資料:
C. P. Wright,SIP server performance on multicore systems
Charles Shen,The Impact of TLS on SIP Server Performance
J. Bradley Chen, The Measured Performance of Personal Computer Operating Systems
https://en.wikipedia.org/wiki/Benchmark_(computing)
https://core.ac.uk/download/pdf/207501118.pdf
https://www.opensips.org/About/PerformanceTests-StressTests
https://www.sqlite.org/fasterthanfs.html
https://medium.com/@denisanikin/when-and-why-i-use-an-in-memory-database-or-a-traditional-database-management-system-5737f6d406b5
https://web.archive.org/web/20120319101435/http://www.pcguide.com/ref/hdd/perf/perf/spec/posAccess-c.html
https://www.opensips.org/Documentation/Tutorials-MemoryCaching
融合通信/IPPBX/FreePBX商業(yè)解決方案:www.hiastar.com
最新Asterisk完整中文用戶手冊(cè)詳解:www.asterisk.org.cn
Freepbx/FreeSBC技術(shù)文檔: www.freepbx.org.cn
如何使用免費(fèi)會(huì)話邊界控制器-FreeSBC,qq技術(shù)分享群:334023047
關(guān)注微信公眾號(hào):asterisk-cn,獲得有價(jià)值的通信行業(yè)技術(shù)分享