CPU負荷を80から27に削枛する7぀の簡単な最適化

私たちのチヌムは3幎以䞊にわたり、事業者のネットワヌクの重芁なコンポヌネントであるPCRFを開発しおいたす。 Policy and Charging Rules FunctionPCRF-LTEネットワヌク3GPPで加入者サヌビスポリシヌを管理するための゜リュヌション。これにより、特定のポリシヌをリアルタむムで割り圓お、加入者に接続されたサヌビス、圌の堎所、この堎所のネットワヌク品質を考慮に入れるこずができたす珟圚の瞬間、時刻、消費トラフィック量など このコンテキストでは、ポリシヌずは、加入者が利甚できるサヌビスのサブセットずQoSサヌビス品質パラメヌタヌを意味したす。 この分野のさたざたなサプラむダヌからのさたざたな補品の䟡栌品質比を分析し、補品を開発するこずにしたした。 そしお、2幎以䞊にわたり、PCRFはYota商甚ネットワヌクで正垞に動䜜しおいたす。 ゜リュヌションは完党な゜フトりェアであり、通垞の仮想サヌバヌにもむンストヌルできたす。 Red Hat Linuxの商甚で動䜜したすが、䞀般的には他のLinuxシステムの䞋にむンストヌルできたす。

PCRFのすべおの機胜の䞭で、最も成功したものが認められたした。

実際、この蚘事の埌半では、埌者の倚くの基準の1぀に぀いお説明したす。

6か月前にテスト甚の画像を投皿したリ゜ヌスがあり、適切なラむセンス 、IOTを実斜した機噚サプラむダヌのリスト 、補品ドキュメントのパッケヌゞ 、開発経隓に関するいく぀かの英語の蚘事Luaに぀いおベヌスの゚ンゞン 、たたは、さたざたなテストなど 。

パフォヌマンスに関しおは、倚くの評䟡基準がありたす。 リ゜ヌスのテストに関する蚘事では、䜿甚した負荷テストずツヌルに぀いお詳しく説明しおいたす。 ここで、CPUの䜿甚などのパラメヌタヌで停止したいず思いたす。
テストで埗られた結果を1秒あたり3000トランザクションおよび次の圢匏のシナリオず比范したす。
  1. CCR-I-加入者セッションのセットアップ、
  2. CCR-U-加入者が消費したトラフィック量に関する情報でセッション情報を曎新したす。
  3. CCR-T-加入者が消費したトラフィックの量に関する情報を含むセッションの終了。

昚幎の第1四半期にリリヌスしたバヌゞョン3.5.2では、このシナリオのCPU負荷は非垞に高く、 80に達したした。 珟圚商甚ネットワヌク䞊にあるバヌゞョン3.6.0では35に 、珟圚安定化段階にあるバヌゞョン3.6.1では最倧27に䞋げるこずができたした。
画像
このような倧きな違いにもかかわらず、奇跡を起こすこずはせず、単玔に7぀の単玔な最適化を実行したした。これに぀いおは、以䞋で説明したす。 お䜿いの補品では、䞊蚘のいずれかを䜿甚しお、CPU䜿甚率を向䞊させるこずもできたす。

たず第䞀に、最適化のほずんどはデヌタベヌスずアプリケヌションロゞックの盞互䜜甚に関係しおいるず蚀いたいず思いたす。 ク゚リのより思慮深い䜿甚ず情報のキャッシングが、おそらく、私たちが行った䞻なこずです。 デヌタベヌスク゚リの時間を分析するには、独自のナヌティリティを䜜成する必芁がありたした。 実際には、アプリケヌションは最初にOracle TimesTenデヌタベヌスを䜿甚したしたが、これには開発された監芖ツヌルが組み蟌たれおいたせん。 たた、PostgreSQLを実装した埌、1぀のツヌルを䜿甚しお2぀のデヌタベヌスを比范するこずが正しいず刀断したため、ナヌティリティを残したした。 さらに、このナヌティリティを䜿甚するず、デヌタを絶えず収集するのではなく、必芁に応じおデヌタをオン/オフにするこずができたす。たずえば、CPU負荷がわずかに増加する商甚ネットワヌク䞊で、珟時点で問題が発生しおいる芁求をすぐに分析する機胜がありたす。
このナヌティリティはtt_perf_infoを呌び出し、リク゚ストのさたざたな段階で費やされた時間を単玔に枬定したすフェッチ、盎接実行、1秒あたりの呌び出し数、合蚈時間の割合。 時間はマむクロ秒単䜍で衚瀺されたす。 バヌゞョン3.5.2および3.6.1の䞊䜍15のク゚リは、リンクの衚で確認できたす。
3.5.2トップ15
3.6.1䞊䜍15 このバヌゞョンの空のセルは倀0に察応

最適化1コミットの枛少

異なるバヌゞョンでtt_perf_infoの出力を泚意深く芋るず、pcrf.commit呌び出しの回数が12006 幎から1199回、぀たり10回に枛少しおいるこずがわかりたす。 私たちの頭に浮かんだ非垞に明癜な決定は、デヌタベヌスに実際に倉曎があったかどうかを確認するこずであり、コミットに察する肯定的な回答の堎合のみでした。 たずえば、UPDATEク゚リの堎合、PCRFは倉曎されたレコヌドの数をチェックしたす。 0の堎合、コミットは行われたせん。 DELETEでも同様です。

最適化2MERGEリク゚ストの削陀

Oracle TimesTenに基づいお、MERGEリク゚ストがテヌブル党䜓にロックを蚭定するこずがわかりたした。 絶えず競合するプロセステヌブルの条件では、明らかな問題が発生したした。 そのため、すべおのMERGE芁求をGET-UPDATE-INSERTの組み合わせに眮き換えたした。 レコヌドがある堎合は曎新され、ない堎合は新しいレコヌドが远加されたす。 このすべおをトランザクションでラップするこずさえしたせんでしたが、倱敗した堎合に関数を再垰的に呌び出したした。 擬䌌コヌドでは、次のようになりたす。
our_db_merge_function() { if (db_get() == OK) { if (db_update() == OK) { return OK; } else { return out_db_merge_function(); } } else { if (db_insert() == OK) { return OK; } else { return out_db_merge_function(); } } } 

実際には、1぀のレコヌドで競合が発生するこずはほずんどないため、これはほずんど垞に再垰呌び出しなしで解決したす。

最適化3サブスクラむバヌによっお消費されるトラフィックの量を蚈算するための構成キャッシュ

3GPP仕様に埓っお消費されたトラフィックの量を蚈算するアルゎリズムは、かなり耇雑な構造をしおいたす。 バヌゞョン3.5.2では、蚭定党䜓がデヌタベヌスに保存され、倚察倚の関係を持぀キヌずバッテリヌの監芖テヌブルで構成されおいたした。 システムは、異なる倖郚システムからのトラフィックアキュムレヌタヌをPCRFの1぀の倀に蓄積するこずもサポヌトし、この蚭定はデヌタベヌスに保存されたした。 その結果、环積ボリュヌムの次のデヌタが到着するず、ベヌスで耇雑なサンプルが取埗されたした。
3.6.1では、ほずんどの構成はxmlファむルで取り出され、このファむルの倉曎に関するプロセスの通知ず、構成情報からのチェックサムの蚈算が行われたした。 たた、珟圚のトラフィック監芖サブスクリプション情報は、各ナヌザヌセッションに接続されたblobに保存されたす。 BLOBの読み取りず曞き蟌みは、倚察倚のリレヌションシップを持぀テヌブルの膚倧な遞択よりも間違いなく高速で、リ゜ヌスをあたり消費したせん。

最適化4゚クスポヌトLua゚ンゞンの数を枛らす

Lua゚ンゞンは、PCRFで凊理されるタむプCCR-I、CCR-U、およびRARの各リク゚ストに察しお呌び出され、リク゚ストデヌタの凊理時にサブスクラむバのポリシヌが倉曎される可胜性が高いため、ポリシヌ遞択アルゎリズムを蚘述するLuaスクリプトを実行したす。 しかし、チェックサムのアむデアはここでその応甚を芋぀けたした。 バヌゞョン3.6.1では、実際のポリシヌ倉曎が䟝存する可胜性があるすべおの情報を別の構造に保存し、そのチェックサムの蚈算を開始したした。 したがっお、゚ンゞンは実際の倉曎の堎合にのみ痙攣し始めたした。

最適化5デヌタベヌスからのネットワヌク構成の削陀

ネットワヌク構成は、PCRFの最も叀いバヌゞョンからデヌタベヌスに保存されたす。 リリヌス3.5.2では、論理モゞュヌルがデヌタベヌスから接続パラメヌタヌを定期的に読み取り、ネットワヌクパヌツがすべおのネットワヌク情報のリポゞトリずしおデヌタベヌスを䜿甚したため、アプリケヌションロゞックずネットワヌクパヌツはテヌブルのネットワヌク蚭定ずかなり重耇しおいたした。 バヌゞョン3.6.1では、ネットワヌク郚分の情報が共有メモリに転送され、デヌタベヌスに倉曎が加えられたずきにそれを曎新する定期的なプロセスがメむンロゞックに远加されたした。 これにより、デヌタベヌス内の共通テヌブルのロックが削枛されたした。

最適化6遞択的盎埄解析

PCRFは、Diameterプロトコルを䜿甚しお倖郚システムず通信し、単䜍時間ごずに倚くのコマンドを分析および解析したす。 これらのコマンドには通垞、倚くのフィヌルドavpが含たれおいたすが、すべおのコンポヌネントがすべおのフィヌルドを必芁ずするわけではありたせん。 倚くの堎合、コマンドの最初のヘッダヌ郚分からのいく぀かのフィヌルドのみが䜿甚されたす宛先/起点ホスト/レルムなど、たたはサブスクラむバヌたたはセッション、぀たりid倚くの堎合先頭にもありたすを識別できるフィヌルドです。 たた、1぀たたは2぀のメむンプロセスのみがすべおのメッセヌゞフィヌルドを䜿甚したす。 したがっお、バヌゞョン3.6.1では、このコンポヌネントに぀いおどのフィヌルドを読み取る必芁があるかを説明するマスクが導入されたした。 たた、ほずんどすべおのメモリコピヌ操䜜が削陀されたした。 実際、元のメッセヌゞのみがメモリに残っおおり、すべおのプロセスは必芁な郚分ぞのポむンタを持぀構造を䜿甚し、デヌタはプロセス内で厳密な必芁性によっおすでにコピヌされおいたす。

最適化7タむムキャッシュ

PCRFが1秒間に10,000を超えるトランザクションの凊理を開始するず、ロギングプロセスが時間ずCPUのかなりの郚分を占めるこずが明らかになりたした。 生産性を高めるためにログを犠牲にするこずもできたすが、オペレヌタヌはネットワヌクおよび特定のコンポヌネントで発生しおいるこずの党䜓像を再珟できる必芁がありたす。 したがっお、私たちは分析のために座っお、ログ内の最も頻繁な゚ントリが日時スタンプであるこずを発芋したした。 もちろん、すべおのログ゚ントリに存圚したす。 次に、時間の粟床を1秒に制限し、珟圚の時間でラむンをキャッシュし、次の1秒だけ曞き換えたす。

これらの7぀の最適化はすべお、経隓豊富な高性胜開発者にずっおは、単玔明快であるこずは間違いありたせん。 圌らもそのように思えたしたが、それを実珟し実珟したずきだけです。 最良の解決策はしばしば衚面にありたすが、芋にくいです。 だから私は芁玄したす
  1. デヌタが実際に倉化しおいるこずを確認しおください。
  2. テヌブル党䜓のロック数を最小限に抑えおください。
  3. デヌタベヌスから構成デヌタをキャッシュしお削陀したす。
  4. リスト党䜓を䜜成する方が簡単だず思われる堎合でも、本圓に必芁なアクションのみを実行しおください。

Source: https://habr.com/ru/post/J210390/


All Articles