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

此圖片以及以下圖片均來(lái)自于互聯(lián)網(wǎng)資源
Charles Shen和其他研究人員針對OpenSIPS的TLS加密對OpenSIPS的影響做了一個(gè)研究(The Impact of TLS on SIP Server Performance),通過(guò)其研究結果我們仍然可以看到針對CPU的性能的測試數據。

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

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

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