透明な巚倧ペヌゞがシステムパフォヌマンスに䞎える圱響

蚘事は、 Jiga Akhaltsev 、 Jigaを代衚しお公開されおいたす。

今日のTinkoff.ruは単なる銀行ではなく、IT䌁業です。 銀行サヌビスだけでなく、それらを取り巻く゚コシステムを構築したす。


Tinkoff.ruでは、さたざたなサヌビスずパヌトナヌシップを結び、顧客サヌビスの品質を向䞊させ、改善を支揎しおいたす。 たずえば、これらのサヌビスの1぀に぀いお負荷テストずパフォヌマンス分析を実斜したした。これは、システムのボトルネックを芋぀けるのに圹立ちたした-OS構成に透過的な巚倧ペヌゞが含たれおいたす。


システムパフォヌマンスの分析方法ずその結果を知りたい堎合は、catぞようこそ。


問題の説明


珟圚、サヌビスアヌキテクチャは次のずおりです。



次の高負荷時の販売で芋぀かった䞻な問題は、CPUの䜿甚率が高いこずでしたが、カヌネルモヌドのプロセッサ時間システム時間は増加し、ナヌザヌモヌドの時間ナヌザヌ時間よりも長くなりたした。



システムの䞻芁な特性の決定


たず、生産性に近いリ゜ヌスで負荷回路を収集し、通垞の通垞の負荷に察応する負荷プロファむルをコンパむルしたした。


ガトリングバヌゞョン3が砲撃ツヌルずしお遞択され、砲撃自䜓はgitlab-runnerを介しおロヌカルネットワヌク内で実行されたした。 同じロヌカルネットワヌク内の゚ヌゞェントずタヌゲットの堎所はネットワヌクコストの削枛によるものであるため、システムが展開されおいるむンフラストラクチャのパフォヌマンスではなく、コヌド自䜓の実行の確認に重点を眮いおいたす。


システムの䞻芁な特性を決定する堎合、http構成で負荷が盎線的に増加するシナリオが適しおいたす。


val httpConfig: HttpProtocolBuilder = http .baseUrl("https://test.host.ru") .inferHtmlResources() //      .disableCaching //  ,      "" . .disableFollowRedirect //   /// MULTIPLIER   JAVA_OPTS setUp( Scenario.inject( rampUsers(100 * MULTIPLIER) during (200 * MULTIPLIER seconds)) ).protocols(httpConfig) .maxDuration(1 hour) 

この段階で、メむンペヌゞを開いおすべおのリ゜ヌスをダりンロヌドするスクリプトを実装したした



このテストの結果、最倧性胜は1500 rpsであり、負荷匷床がさらに増加するず、softirq時間の増加に䌎うシステムの劣化が発生したした。




Softirqは遅延割り蟌みメカニズムであり、kernel / softirq.sファむルに蚘述されおいたす。 同時に、プロセッサぞの呜什のキュヌをたたき、ナヌザヌモヌドで有甚な蚈算を行えないようにしたす。 割り蟌みハンドラヌは、OSスレッドでのネットワヌクパケットの远加䜜業を遅らせるこずもできたすシステム時間。 ネットワヌクスタックの仕事ず最適化に぀いお簡単には別の蚘事で芋぀けるこずができたす。


䞻な問題の疑いは確認されたせんでした。これは、ネットワヌクアクティビティが少なく、補品のシステム時間が非垞に長いためです。


ナヌザヌスクリプト


次のステップは、カスタムスクリプトを開発し、写真付きのペヌゞを開くだけではないこずを远加するこずでした。 プロファむルには、静的なリ゜ヌスを提䟛するWebサヌバヌではなく、サむトずデヌタベヌスのコヌドを最倧限に含む、重い操䜜が含たれおいたした。


安定した負荷でのテストは最倧倀よりも䜎い匷床で開始され、リダむレクト遷移が構成に远加されたした。


 val httpConfig: HttpProtocolBuilder = http .baseUrl("https://test.host.ru") .inferHtmlResources() //      .disableCaching //  ,      "" . /// MULTIPLIER   JAVA_OPTS setUp( MainScenario .inject(rampUsers(50 * MULTIPLIER) during (200 * MULTIPLIER seconds)), SideScenario .inject(rampUsers(100 * MULTIPLIER) during (200 * MULTIPLIER seconds)) ).protocols(httpConfig) .maxDuration(2 hours) 



システムの最も完党な䜿甚は、システム時間メトリックの増加ず安定性テスト䞭の増加を瀺したした。 実皌働環境の問題が再珟されたした。


Redisずのネットワヌキング


問題を分析するずき、システムのすべおのコンポヌネントを監芖しお、それがどのように機胜し、䟛絊された負荷がシステムに䞎える圱響を理解するこずが非垞に重芁です。


Redisモニタリングの出珟により、システムの䞀般的なメトリックではなく、その特定のコンポヌネントを芋るこずが可胜になりたした。 ストレステストのシナリオも倉曎されたした。これは、远加の監芖ずずもに、問題のロヌカラむズぞのアプロヌチに圹立ちたした。



監芖では、RedisがCPU䜿甚率ず同様の状況を芋たしたが、CPU時間の䞻な䜿甚率がSET操䜜、぀たり倀を保存するためのRAMの割り圓おにある間、システム時間はナヌザヌ時間よりもかなり長くなりたす。



Redisずのネットワヌク盞互䜜甚の圱響を排陀するために、仮説をテストし、Redisをtcp゜ケットではなくUNIX゜ケットに切り替えるこずが決定されたした。 これは、php-fpmがデヌタベヌスに接続するフレヌムワヌクで行われたした。 ファむル/yiisoft/yii/framework/caching/CRedisCache.phpで、hostportの行をハヌドコヌドredis.sockに眮き換えたした。 この蚘事で゜ケットのパフォヌマンスに぀いお詳しく読んでください 。


  /** * Establishes a connection to the redis server. * It does nothing if the connection has already been established. * @throws CException if connecting fails */ protected function connect() { $this->_socket=@stream_socket_client( // $this->hostname.':'.$this->port, "unix:///var/run/redis/redis.sock", $errorNumber, $errorDescription, $this->timeout ? $this->timeout : ini_get("default_socket_timeout"), $this->options ); if ($this->_socket) { if($this->password!==null) $this->executeCommand('AUTH',array($this->password)); $this->executeCommand('SELECT',array($this->database)); } else { $this->_socket = null; throw new CException('Failed to connect to redis: '.$errorDescription,(int)$errorNumber); } } 

残念ながら、これはあたり効果がありたせんでした。 CPU䜿甚率は少し安定したしたが、問題は解決したせんでした-CPU䜿甚率のほずんどはカヌネルモヌドコンピュヌティングでした。




ストレスを䜿甚しおTHP問題を特定するベンチマヌク


ストレスナヌティリティは、問題の堎所を特定するのに圹立ちたした-POSIXシステム甚の単玔なワヌクロヌドゞェネレヌタヌは、CPU、メモリ、IOなどの個々のシステムコンポヌネントをロヌドできたす。
テストはハヌドりェアずOSバヌゞョンで行われたす


Ubuntu 18.04.1 LTS
12Intel®Xeon®CPU

このナヌティリティは、次のコマンドを䜿甚しおむンストヌルされたす。


 sudo apt-get install stress 

負荷がかかった状態でCPUがどのように䜿甚されるかを芋お、300秒間の平方根を蚈算するワヌカヌを䜜成するテストを実行したす。


 -c, --cpu N spawn N workers spinning on sqrt() > stress --cpu 12 --timeout 300s stress: info: [39881] dispatching hogs: 12 cpu, 0 io, 0 vm, 0 hdd 


このグラフは、ナヌザヌモヌドでの完党な䜿甚率を瀺しおいたす。぀たり、システムサヌビスコヌルではなく、すべおのプロセッサコアがロヌドされ、有甚な蚈算が実行されたす。


次のステップは、ioを集䞭的に䜿甚するずきにリ゜ヌスを䜿甚するこずです。 syncを実行する12人のワヌカヌを䜜成しお、300秒間テストを実行したす。 syncコマンドは、メモリにバッファリングされたデヌタをディスクに曞き蟌みたす。 カヌネルは、頻繁に通垞は遅いディスクの読み取りおよび曞き蟌み操䜜を回避するために、デヌタをメモリに保存したす。 syncコマンドは、メモリに保存されおいるすべおのものがディスクに曞き蟌たれるようにしたす。


 -i, --io N spawn N workers spinning on sync() > stress --io 12 --timeout 300s stress: info: [39907] dispatching hogs: 0 cpu, 0 io, 0 vm, 12 hdd 



プロセッサは䞻にカヌネルモヌドで呌び出しを凊理し、iowaitで少し凊理しおいるこずがわかりたす。たた、ディスクぞの35k ops曞き蟌みも確認できたす。 この動䜜は、システム時間が長い問題に䌌おおり、その原因を分析しおいたす。 しかし、ここにはいく぀かの違いがありたすこれらはiowaitであり、iopsはそれぞれ生産的な回路よりも倧きく、これは私たちの堎合には合いたせん。


あなたの蚘憶をチェックする時です。 次のコマンドを䜿甚しお、300秒間メモリを割り圓おお解攟する20人のワヌカヌを起動したす。


  -m, --vm N spawn N workers spinning on malloc()/free() > stress -m 20 --timeout 300s stress: info: [39954] dispatching hogs: 0 cpu, 0 io, 20 vm, 0 hdd 


すぐに、システムモヌドでCPUの䜿甚率が高くなり、ナヌザヌモヌドでCPUの䜿甚率が少し高くなり、2 GBを超えるRAMが䜿甚されるこずがすぐにわかりたす。


このケヌスは、負荷テストでメモリを倧量に䜿甚するこずで確認されるprodの問題ず非垞によく䌌おいたす。 したがっお、メモリ操䜜で問題を探す必芁がありたす。 メモリの割り圓おず解攟はそれぞれmalloc呌び出しずfree呌び出しを䜿甚しお行われ、これらは最終的にカヌネルシステムコヌルによっお凊理されたす。぀たり、システム時間ずしおCPU䜿甚率に衚瀺されたす。


ほずんどの最新のオペレヌティングシステムでは、ペヌゞングを䜿甚しお仮想メモリが線成されたす。このアプロヌチでは、メモリ領域党䜓が固定長のペヌゞに分割されたすたずえば、4096バむト倚くのプラットフォヌムのデフォルト。たずえば、2 GBのメモリを割り圓おる堎合、メモリマネヌゞャは動䜜する必芁がありたす500,000ペヌゞ以䞊。 このアプロヌチでは、管理に倧きなオヌバヌヘッドがあり、Huge PageずTransparent Huge Pagesテクノロゞヌがそれらを削枛するために発明されたした。たずえば、ペヌゞサむズを最倧2MBたで増やすこずができるため、メモリヒヌプ内のペヌゞ数が倧幅に削枛されたす。 テクノロゞヌ間の唯䞀の違いは、Huge Pageの堎合、環境を明瀺的に蚭定し、プログラムの操䜜方法を教える必芁があるのに察しお、Transparent Huge Pagesはプログラムに察しお「透過的に」機胜するこずです。


THPず問題解決


トランスペアレントヒュヌゞペヌゞに関する情報をグヌグル怜玢するず、怜玢結果に「THPをオフにする方法」ずいう質問のあるペヌゞが倚数衚瀺されたす。


結局のずころ、この「クヌルな」機胜はRed Hat CorporationによっおLinuxカヌネルに導入されたした。この機胜の本質は、アプリケヌションが実際のHuge Pageで動䜜するかのようにメモリを透過的に動䜜できるこずです。 ベンチマヌクによるず、THPは抜象アプリケヌションを10高速化したす。プレれンテヌションで詳现を確認できたすが、実際にはすべおが異なりたす。 堎合によっおは、THPはシステムのCPU消費を䞍圓に増加させたす。 詳现に぀いおは、Oracleの掚奚事項を参照しおください。


パラメヌタを確認したす。 刀明したように、THPはデフォルトでオンになっおいたす。次のコマンドでオフにしたす。


 echo never > /sys/kernel/mm/transparent_hugepage/enabled 

THPをオフにする前ず埌に、負荷プロファむルでテストで確認したす。


 setUp( MainScenario.inject( rampUsers(150) during (200 seconds)), Peak.inject( nothingFor(20 minutes), rampUsers(5000) during (30 minutes)) ).protocols(httpConfig) 


THPをオフにする前にこの写真を芋たした



THPをオフにするず、リ゜ヌス䜿甚率がすでに䜎䞋しおいるこずがわかりたす。


䞻な問題はロヌカラむズされたした。 理由はOSでデフォルトで有効化されおいたした
透明な倧きなペヌゞのメカニズム。 THPオプションを無効にした埌、システムモヌドでのCPU䜿甚率が少なくずも2倍枛少し、ナヌザヌモヌド甚のリ゜ヌスが解攟されたした。 䞻な問題の分析䞭に、OSずRedisのネットワヌクスタックずの盞互䜜甚の「ボトルネック」も発芋されたした。これが、より深い研究の理由です。 しかし、これはたったく異なる話です。


おわりに


結論ずしお、パフォヌマンスの問題を正垞に怜玢するためのヒントをいく぀か玹介したす。




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


All Articles