您當前的位置是:  首頁 > 資訊 > 文章精選 >
 首頁 > 資訊 > 文章精選 >

OpenSIPS學習筆記-淺析如何使用MemCache優(yōu)化系統(tǒng)性能

2021-02-01 13:48:53   作者: james.zhu    來源:Asterisk開源派   評論:0  點擊:


  作為一個SIP信令服務器,因為需要承載運營級的語音呼叫,OpenSIPS的性能是大家非常關心的問題。根據(jù)維基百科中的計算機基準測試七大類型的測試類型中,如果要討論關于計算機的基準測試時,我們需要涵蓋以上七類的測試。這里,我們重點討論關于IO,數(shù)據(jù)庫和軟件本身的性能測試討論。在其他的具體的測試場景中,技術研究人員也仍然遵從以上原則不斷進行評測。哈佛大學研究人員J. Bradley Chen等研究人員早期發(fā)表的論文-The Measured Performance of Personal Computer Operating Systems是比較經(jīng)典的關于個人計算機測試的論文,他們也是從內存訪問,文件讀取,平臺等方面做的研究,如果讀者有興趣的話,可以查看文章鏈接來學習。
  關于針對OpenSIPS性能優(yōu)化的討論中,無論從早期的研究還是當前的研究中,大家對優(yōu)化的手段仍然集中在數(shù)據(jù)庫處理,CPU消耗和存儲設備的處理上。因為技術的不斷進步和其他軟件手段的更新和資源的關系,一些優(yōu)化手段也逐漸被引入,包括了分布式部署,云計算的其他工具。因為本人能力和資源有限,筆者不可能涉及太多的討論,我們僅簡單討論通過自己資源可以優(yōu)化的方式,以便幫助讀者能夠對OpenSIPS的優(yōu)化有一個非;镜恼J識,也是對OpenSIPS的性能做一個比較淺顯的分析。這里,筆者首先介紹了關于OpenSIPS的早期版本OpenSERR的優(yōu)化研究成果的背景介紹,然后介紹了關于MYSQL如何影響OpenSIPS的性能,接下來介紹了使用內存做某些模塊優(yōu)化的概念,最后介紹了如何使用Cache實現(xiàn)SIP用戶注冊的示例實踐。
  測試前說明,如果用戶沒有安裝OpenSIPS和MYSQL數(shù)據(jù)庫的話,筆者不再介紹如何安裝OpenSIPS和mysql數(shù)據(jù)庫,用戶需要首先安裝OpenSIPS和MYSQL環(huán)境,然后再進行下面的示例測試。具體安裝配置方式,讀者可以參考:
  最完整快速的安裝方式安裝開源OpenSIPS-3.1和CP控制界面-class 8
  如何使用OpenSIPS實現(xiàn)呼叫隊列/hunt group
  1關于OpenSIPS的性能研究背景介紹
  在早期的OpenSER(OpenSIPS/Kamailio前身)版本使用中,一些研究人員一直對其服務器的性能數(shù)據(jù)庫的使用做不同環(huán)境的研究,其中對數(shù)據(jù)庫和CPU操作的研究做了很多工作,研究人員也提出了很多有價值的建議和測試結果。除了官方的測試文檔以外,個人覺得幾位研究人員的論文也值得參考。C. P. Wright就在OpenSER的早期版本針對不同的硬件平臺和不同的mysql數(shù)據(jù)庫的處理發(fā)布了關于SIP server performance on multicore systems的論文。如果讀者對此論文有興趣的話,可以參考此另外作為一個理論支撐來優(yōu)化自己的系統(tǒng)。
  此圖片以及以下圖片均來自于互聯(lián)網(wǎng)資源
  Charles Shen和其他研究人員針對OpenSIPS的TLS加密對OpenSIPS的影響做了一個研究(The Impact of TLS on SIP Server Performance),通過其研究結果我們仍然可以看到針對CPU的性能的測試數(shù)據(jù)。
  2OpenSIPS使用mysql
  隨著OpenSIPS的技術架構不斷優(yōu)化,各種應用場景的優(yōu)化,OpenSIPS的性能也得到了很大的提升。官方對OpenSIPS的性能有一個關于壓力測試的檢測數(shù)據(jù)。在其結論中,數(shù)據(jù)庫的操作是影響OpenSIPS的CPS的一個非常重要的因素。如果想提高OpenSIPS的性能,官方推薦盡量使用Caching(緩存)來提升OpenSIPS的性能。在默認的OpenSIPS環(huán)境中,到了使用了mysql數(shù)據(jù)庫對一些模塊的數(shù)據(jù)進行查處,很多時候也對數(shù)據(jù)庫進行調用。OpenSIPS中使用了數(shù)據(jù)庫的模塊包括:
  • AUTH_DB
  • USRLOC
  • PERMISSIONS
  • DIALPLAN
  • DROUTING
  • BLACKLIST
  • DOMAIN
  • AVPOPS
  • 其他模塊
  在一般中小型的平臺應用環(huán)境中,這些模塊數(shù)據(jù)讀取可能不會影響OpenSIPS的性能。但是,如果SIP用戶數(shù)量達到一定的級別,呼叫路由規(guī)則,黑白名單模塊的數(shù)量達到一定級別以后,每個呼叫都要經(jīng)過這些流程的處理的話,如果這些數(shù)據(jù)通過數(shù)據(jù)庫的頻繁讀取就會嚴重影響系統(tǒng)的性能,可能數(shù)據(jù)庫也會受到嚴重影響。在默認環(huán)境中,MYSQL的連接是100,這就會導致CPU不斷頻繁調用數(shù)據(jù)庫操作, 對存儲設備的使用頻率也會增加。很多時候,因為設計原因或者處理速度減慢,一些MYSQL具體的命令也會影響到CPU的消耗,這仍然需要用戶通過一定的命令手段來進行排查。比較幸運的是,目前MYSQL開源數(shù)據(jù)庫都支持了相應的排查工具來實現(xiàn)跟蹤MYSQL命令檢測CPU的消耗。具體實現(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
  一步步排查每個SQL 命令的消耗狀態(tài)。具體排查方式,請參考鏈接。
  除了MYSQL數(shù)據(jù)庫的配置以外,存儲設備的讀取速度也是一個影響系統(tǒng)性能的重要因素。目前,無論是HDD還是SSD的存儲方式,它們的讀取速度仍然落后內存讀取的速度。因此優(yōu)化內存是一個比較可行的,相對低成本的方式。具體關于通過存儲設備選擇優(yōu)化系統(tǒng)的討論,讀者可以參考鏈接的內容,這里不再贅述。
  3OpenSIPS中使用Cache緩存
  在緩存使用的優(yōu)化中,SIP用戶注冊就是一個非常典型的例子(其他模塊,例如TM/事務處理也非常消耗資源)。在我們的用戶場景中,假設,SIP用戶需要一般每隔60秒對OpenSIPS進行注冊,這樣OpenSIPS才能獲得其狀態(tài)。為了讓服務器端獲得其狀態(tài),SIP客戶端只能每隔一段時間對服務器支持,刷新數(shù)據(jù)庫的數(shù)據(jù)。這樣的操作其實是非常消耗系統(tǒng)的注意,數(shù)據(jù)庫性能也會大大下降。在OpenSIPS的模塊中,例如INVITE呼叫,撥號規(guī)則路由查詢等類似SIP注冊這樣的操作很多,需要經(jīng)常頻繁調用一些常規(guī)數(shù)據(jù)。這樣的操作可以通過一定的手段進行優(yōu)化,從而達到系統(tǒng)優(yōu)化的目的。catching就是其中一種非常實用的優(yōu)化方式,通過在內存存儲這些數(shù)據(jù),OpenSIPS可以不通過數(shù)據(jù)庫調用來查詢數(shù)據(jù),直接調用內存中的數(shù)據(jù),從而提高了OpenSIPS的運行速度。如果OpenSIPS優(yōu)化中使用caching(緩存方式)的話,可以直接從caching緩存中獲取用戶注冊信息,速度快,也無需訪問數(shù)據(jù)庫。在OpenSIPS環(huán)境中,目前支持的緩存是通過OpenSIPS core 模塊和其他模塊實現(xiàn)。支持的方式包括:Local Cache, MemCache,Redis, Cassandra, MongoDB和CouchBase。在OpenSIPS中的其設置非常簡單:
  除了存儲以外,OpenSIPS還可以移除cache,提取,查詢新的數(shù)據(jù)等功能。OpenSIPS支持的cache用戶驗證流程:
  
  通過以上圖例,我們可以看到,OpenSIPS關于緩存處理的基本處理邏輯是,OpenSIPS通過執(zhí)行MYSQL 認證數(shù)據(jù)庫,把用戶名稱和密碼存儲在cache中,緩存數(shù)據(jù)保持一定的生命周期。如果新新用戶需要驗證的話,首先檢測緩存中存儲的數(shù)據(jù),如果此用戶的數(shù)據(jù)存儲在緩存中,則直接此緩存中查詢用戶驗證信息;如果在緩存中沒有此用戶的信息,則返回數(shù)據(jù)庫進行查詢,執(zhí)行驗證流程。下一次用戶需要認證時,OpenSIPS就會從緩存中提取用戶驗證信息而不是再次通過執(zhí)行數(shù)據(jù)庫驗證來驗證用戶信息,這樣就會降低對mysql的讀取次數(shù)。用戶名稱和用戶密碼通過不同的key pair來實現(xiàn)。
  4OpenSIPS中使用Memcache支持SIP注冊
  筆者介紹了基本的cache的操作步驟,現(xiàn)在我們針對SIP用戶注冊的緩存處理做一個配置示例,通過此示例說明OpenSIPS如何通過緩存數(shù)據(jù)來驗證用戶密碼的流程。OpenSIPS官方網(wǎng)站對此配置有簡單的說明,具體模塊配置的細節(jié)讀者可以參考官方配置文檔,我們這里僅通過一個配置cfg基本來說明演示SIP賬號的驗證處理流程。用戶需要按照以下幾個步驟來配置緩存驗證的流程。
  首先,用戶需要編輯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ù)庫用戶名稱和用戶密碼。在注冊處理流程模塊做用戶驗證,cfg首先執(zhí)行緩存數(shù)據(jù)的驗證,然后執(zhí)行mysql數(shù)據(jù)庫驗證,最后保存緩存數(shù)據(jù)流程。
  route[handle_register] // 執(zhí)行緩存處理和數(shù)據(jù)庫驗證處理流程:
  if(cache_fetch("local","passwd_$tU@$td",$avp(passwd))) {
  $avp(userspec) = $tU;
  // 通過緩存數(shù)據(jù)驗證用戶名稱和密碼,否則執(zhí)行mysql數(shù)據(jù)庫驗證
  if (!pv_www_authorize("")) {
  www_challenge("", " auth,auth-int " );
  exit;
  }
  } else { // 執(zhí)行mysql數(shù)據(jù)庫驗證
  if (!www_authorize("", "subscriber")) {
  www_challenge("", "auth");
  exit;
  }
  // 執(zhí)行數(shù)據(jù)庫用戶的密碼驗證,保存到緩存中
  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配置文件以后,用戶重新啟動OpenSIPS,然后通過mysql log日志觀察log消息,查看數(shù)據(jù)庫數(shù)據(jù)的變化。具體mysql數(shù)據(jù)庫的log設置,用戶可以通過:
  mysql -e "SET GLOBAL general_log=1;"
  mysql -e "SET GLOBAL general_log_file='mariadb.log';"
  其log保存的文件路徑在 /var/lib/mysql/mariadb.log 。
  如果用戶要測試其配置是否成功的話,用戶也可以使用一個SIP軟電話執(zhí)行注冊然后退出,再次執(zhí)行注冊流程,查看打印日志的變化。通過兩次SIP賬號注冊,如果配置正確的話,用戶注冊時應該分別訪問了mysql數(shù)據(jù)庫和cache的保存的數(shù)據(jù)。
  通過緩存方式驗證SIP注冊以外,此用戶的密碼仍然可以使用在其他的請求中,例如INVITE請求呼叫或者訂閱消息中。如果實現(xiàn)INVITE呼叫的話,需要使用pv_proxy_authorize()來實現(xiàn),同時需要修改幾個相關的變量(例如,$fu等)來保存相關的緩存數(shù)據(jù)。用戶也可以通過此思路做進一步的驗證,這里不做過多討論。
  通過以上示例,讀者可以看到,我們使用一個SIP 賬號實現(xiàn)的緩存數(shù)據(jù)驗證的流程。讀者可以想象一下,如果服務器啟動以后,成百上千個SIP用戶同時對OpenSIPS服務器端發(fā)起注冊的話,沒有緩存驗證的支持的話,對數(shù)據(jù)庫是一個非常大的挑戰(zhàn)。所以,通過緩存數(shù)據(jù)的調用可以優(yōu)化OpenSIPS的性能。
  另外,讀者可以看到,我們實際上實現(xiàn)的是一個按需驗證數(shù)據(jù)庫的過程,每個用戶注冊時,需要重復執(zhí)行以上的步驟,把數(shù)據(jù)庫數(shù)據(jù)緩存到內存的緩存數(shù)據(jù)中。另外一個更加優(yōu)化的方式是,在OpenSIPS啟動以后,使用full caching的方式,在起始的啟動腳本邏輯模塊中就完全提取數(shù)據(jù)庫用戶驗證數(shù)據(jù),然后在緩存中保存這些完整的全部驗證數(shù)據(jù)。通過這樣的操作就避免了每一次用戶注冊都需要進行數(shù)據(jù)庫的驗證處理,僅需要通過緩存驗證流程。
  5總結
  在本文章中,筆者首先介紹了關于系統(tǒng)性能測試的背景,然后介紹了mysql對OpenSIPS的影響,接下來筆者針對OpenSIPS中使用的一些必要模塊做了介紹,最后通過SIP注冊的示例說明使用緩存的方式。通過此基本示例讓讀者了解如何優(yōu)化自己的OpenSIPS平臺,實現(xiàn)更強大的性能處理能力。
  用戶使用MemCache可以優(yōu)化OpenSIPS的性能,但是使用內存處理同樣也會引起其他的問題,例如系統(tǒng)維護問題,腳本處理流程需要規(guī)范,同步cache和拓展性的問題。用戶最終需要評估使用MemCache的風險來決定是否使用MemCache。
  隨著技術的不斷進步,用戶當然也可以考慮使用其他的方式來優(yōu)化或者改善OpenSIPS的性能,例如,使用分布式數(shù)據(jù)庫,使用更高速的存儲設備,其他的軟件手段等方式。
  參考資料:
  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完整中文用戶手冊詳解:www.asterisk.org.cn
  Freepbx/FreeSBC技術文檔: www.freepbx.org.cn
  如何使用免費會話邊界控制器-FreeSBC,qq技術分享群:334023047
  關注微信公眾號:asterisk-cn,獲得有價值的通信行業(yè)技術分享
 
【免責聲明】本文僅代表作者本人觀點,與CTI論壇無關。CTI論壇對文中陳述、觀點判斷保持中立,不對所包含內容的準確性、可靠性或完整性提供任何明示或暗示的保證。請讀者僅作參考,并請自行承擔全部責任。

專題

CTI論壇會員企業(yè)