中文字幕无码久久精品,13—14同岁无码A片,99热门精品一区二区三区无码,菠萝菠萝蜜在线观看视频高清1

您當(dāng)前的位置是:  首頁 > 資訊 > 文章精選 >
 首頁 > 資訊 > 文章精選 >

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

2021-02-01 13:48:53   作者: james.zhu    來源:Asterisk開源派   評(píng)論:0  點(diǎn)擊:


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

專題

CTI論壇會(huì)員企業(yè)