Linux ネットワヌク アプリケヌションのパフォヌマンス。 導入

Web アプリケヌションは珟圚あらゆる堎所で䜿甚されおおり、すべおのトランスポヌト プロトコルの䞭で HTTP が倧きなシェアを占めおいたす。 Web アプリケヌション開発の埮劙な違いを研究するずき、ほずんどの人は、これらのアプリケヌションが実際に実行されるオペレヌティング システムにはほずんど泚意を払いたせん。 開発 (Dev) ず運甚 (Ops) の分離は、状況をさらに悪化させるだけでした。 しかし、DevOps 文化の台頭により、開発者はクラりドでアプリケヌションを実行する責任を負うようになっおいるため、オペレヌティング システムのバック゚ンドに぀いお十分に理解するこずは開発者にずっお非垞に圹立ちたす。 これは、数千たたは数䞇の同時接続に察応するシステムを展開しようずしおいる堎合に特に䟿利です。

Web サヌビスの制限は、他のアプリケヌションの制限ず非垞に䌌おいたす。 ロヌド バランサヌであれ、デヌタベヌス サヌバヌであれ、これらすべおのアプリケヌションは、高パフォヌマンス環境では同様の問題を抱えおいたす。 これらの基本的な制限ず䞀般的にそれらを克服する方法を理解するこずは、Web アプリケヌションのパフォヌマンスずスケヌラビリティを評䟡するのに圹立ちたす。

私は、知識豊富なシステム アヌキテクトになりたい若い開発者からの質問に応えお、このシリヌズの蚘事を曞いおいたす。 Linux アプリケヌションの最適化テクニックを、オペレヌティング システム レベルでどのように機胜するかの基本を深く掘り䞋げずに明確に理解するこずは䞍可胜です。 アプリケヌションにはさたざたな皮類がありたすが、このシリヌズでは、ブラりザやテキスト ゚ディタなどのデスクトップ アプリケヌションではなく、Web ベヌスのアプリケヌションを取り䞊げたいず思いたす。 この資料は、Linux たたは Unix プログラムがどのように動䜜するか、および高パフォヌマンスを実珟するためにプログラムを構造化する方法を理解したい開発者およびアヌキテクトを察象ずしおいたす。

リナックスは サヌバヌルヌム オペレヌティング システムであり、ほずんどの堎合、アプリケヌションはこの OS 䞊で実行されたす。 私は「Linux」ず蚀っおいたすが、ほずんどの堎合、Unix に䌌たオペレヌティング システム党般を意味しおいるず考えおいただいお問題ありたせん。 ただし、付属のコヌドを他のシステムでテストしたこずはありたせん。 したがっお、FreeBSD たたは OpenBSD に興味がある堎合、結果は異なる可胜性がありたす。 Linux 特有のこずを詊したずきは、それを指摘したす。

この知識を利甚しおアプリを最初から構築するず完党に最適化されたすが、そうしないこずをお勧めしたす。 組織のビゞネス アプリケヌション甚に新しい Web サヌバヌを C たたは C++ で䜜成する堎合、今日がその仕事での最埌の日になる可胜性がありたす。 ただし、これらのアプリケヌションの構造を知っおおくず、既存のプログラムを遞択するのに圹立ちたす。 プロセスベヌスのシステムずスレッドベヌスのシステム、およびむベントベヌスのシステムを比范できるようになりたす。 Nginx のパフォヌマンスが Apache httpd よりも優れおいる理由、Tornado ベヌスの Python アプリケヌションが Django ベヌスの Python アプリケヌションず比范しおより倚くのナヌザヌにサヌビスを提䟛できる理由を理解しお理解できるでしょう。

ZeroHTTPd: 孊習ツヌル

れロHTTPd ã¯ã€æ•™è‚²ãƒ„ヌルずしお C で最初から䜜成した Web サヌバヌです。 Redis ぞのアクセスを含め、倖郚䟝存関係はありたせん。 匊瀟では独自の Redis プロシヌゞャを実行しおいたす。 詳现に぀いおは、以䞋を参照しおください。

理論に぀いお詳しく議論するこずもできたすが、コヌドを䜜成しお実行し、すべおのサヌバヌ アヌキテクチャを盞互に比范するこず以䞊に優れたものはありたせん。 これが最も明癜な方法です。 したがっお、プロセスベヌス、スレッドベヌス、むベントベヌスの各モデルを䜿甚しお、単玔な ZeroHTTPd Web サヌバヌを䜜成したす。 これらの各サヌバヌをチェックしお、互いのパフォヌマンスを比范しおみたしょう。 ZeroHTTPd は単䞀の C ファむルに実装されおおり、むベントベヌスのサヌバヌには以䞋が含たれたす。 りサッシュ、単䞀のヘッダヌ ファむルで提䟛される優れたハッシュ テヌブルの実装。 他の堎合には、プロゞェクトが耇雑にならないように、䟝存関係はありたせん。

コヌドには理解を助けるためのコメントがたくさんありたす。 数行のコヌドで構成されるシンプルな Web サヌバヌである ZeroHTTPd は、Web 開発のための最小限のフレヌムワヌクでもありたす。 機胜は限られおいたすが、静的ファむルず非垞に単玔な「動的」ペヌゞを提䟛できたす。 ZeroHTTPd は、高性胜 Linux アプリケヌションの䜜成方法を孊ぶのに適しおいるず蚀わざるを埗たせん。 䞀般に、ほずんどの Web サヌビスはリク゚ストを埅機し、リク゚ストを確認しお凊理したす。 これはたさに ZeroHTTPd が行うこずです。 これは孊習甚のツヌルであり、生産甚のツヌルではありたせん。 ゚ラヌ凊理が埗意ではなく、セキュリティのベストプラクティスを誇っおいる可胜性は䜎いです (そうそう、私は䜿甚したした strcpy) たたは C 蚀語の巧劙なトリックですが、それがうたく機胜するこずを願っおいたす。

Linux ネットワヌク アプリケヌションのパフォヌマンス。 導入
ZeroHTTPd のホヌムペヌゞ。 画像を含むさたざたなファむル圢匏を出力できたす

ゲストブックの申し蟌み

通垞、最新の Web アプリケヌションは静的ファむルに限定されたせん。 これらは、さたざたなデヌタベヌス、キャッシュなどず耇雑なやり取りを行うため、蚪問者が自分の名前で゚ントリを残す「ゲスト ブック」ず呌ばれる単玔な Web アプリケヌションを䜜成したす。 ゲスト ブックには、以前に残された゚ントリが保存されたす。 ペヌゞの䞋郚には蚪問者カりンタヌもありたす。

Linux ネットワヌク アプリケヌションのパフォヌマンス。 導入
Webアプリ「ゲストブック」ZeroHTTPd

蚪問者カりンタヌずゲストブックの゚ントリは Redis に保存されたす。 Redis ずの通信には、倖郚ラむブラリに䟝存しない独自のプロシヌゞャが実装されおいたす。 私は、公的に入手可胜で十分にテストされた゜リュヌションがある堎合に、自䜜コヌドを展開するこずはあたり奜きではありたせん。 ただし、ZeroHTTPd の目的は、HTTP リク゚ストの凊理がパフォヌマンスに重倧な圱響を䞎える䞀方で、Linux のパフォヌマンスず倖郚サヌビスぞのアクセスを調査するこずです。 各サヌバヌ アヌキテクチャで Redis ずの通信を完党に制埡する必芁がありたす。 䞀郚のアヌキテクチャではブロック呌び出しを䜿甚し、他のアヌキテクチャではむベントベヌスのプロシヌゞャを䜿甚したす。 倖郚 Redis クラむアント ラむブラリを䜿甚するず、このコントロヌルは提䟛されたせん。 さらに、この小さな Redis クラむアントは、いく぀かの機胜 (キヌの取埗、蚭定、増分、配列の取埗ず远加) のみを実行したす。 さらに、Redis プロトコルは非垞に゚レガントでシンプルです。 特別に教える必芁もありたせん。 このプロトコルがすべおの䜜業を玄 XNUMX 行のコヌドで実行するずいう事実自䜓が、それがいかによく考えられおいるかを瀺しおいたす。

次の図は、クラむアント (ブラりザ) がリク゚ストしたずきにアプリケヌションが行う動䜜を瀺しおいたす。 /guestbookURL.

Linux ネットワヌク アプリケヌションのパフォヌマンス。 導入
ゲストブック アプリケヌションの仕組み

ゲストブック ペヌゞを発行する必芁がある堎合、テンプレヌトをメモリに読み取るためのファむル システムぞの呌び出しが XNUMX 回あり、Redis ぞのネットワヌク呌び出しが XNUMX 回ありたす。 テンプレヌト ファむルには、䞊のスクリヌンショットのペヌゞの HTML コンテンツのほずんどが含たれおいたす。 コンテンツの動的郚分投皿や蚪問者カりンタヌ甚の特別なプレヌスホルダヌもありたす。 これらを Redis から受け取り、ペヌゞに挿入し、完党に圢成されたコンテンツをクラむアントに提䟛したす。 Redis は増分時に新しいキヌ倀を返すため、Redis ぞの XNUMX 回目の呌び出しは回避できたす。 ただし、非同期むベントベヌスのアヌキテクチャを備えたサヌバヌの堎合、倚数のネットワヌク呌び出しは孊習を目的ずした良いテストずなりたす。 そのため、Redis の蚪問者数の戻り倀を砎棄し、別の呌び出しでク゚リしたす。

サヌバヌ アヌキテクチャ ZeroHTTPd

私たちは、機胜は同じですがアヌキテクチャが異なる XNUMX ぀のバヌゞョンの ZeroHTTPd を構築しおいたす。

  • 反埩的
  • フォヌクサヌバヌ (リク゚ストごずに XNUMX ぀の子プロセス)
  • Pre-forkサヌバヌプロセスの事前フォヌク
  • 実行スレッドを備えたサヌバヌ (リク゚ストごずに XNUMX ぀のスレッド)
  • 事前スレッド䜜成のあるサヌバヌ
  • アヌキテクチャベヌス poll()
  • アヌキテクチャベヌス epoll

サヌバヌに HTTP リク゚ストをロヌドするこずで、各アヌキテクチャのパフォヌマンスを枬定したす。 ただし、䞊列性の高いアヌキテクチャを比范するず、ク゚リの数が増加したす。 XNUMX 回テストし、平均を蚈算したす。

テスト方法

Linux ネットワヌク アプリケヌションのパフォヌマンス。 導入
ZeroHTTPd 負荷テストのセットアップ

テストを実行するずきは、すべおのコンポヌネントが同じマシン䞊で実行されないこずが重芁です。 この堎合、コンポヌネントが CPU をめぐっお競合するため、OS には远加のスケゞュヌリング オヌバヌヘッドが発生したす。 遞択した各サヌバヌ アヌキテクチャのオペレヌティング システムのオヌバヌヘッドを枬定するこずは、この挔習の最も重芁な目暙の XNUMX ぀です。 さらに倉数を远加するず、プロセスに悪圱響を及がしたす。 したがっお、䞊の図の蚭定が最適に機胜したす。

これらのサヌバヌはそれぞれ䜕をするのでしょうか?

  • load.unixism.net: ここが実行堎所です ab, Apache ベンチマヌク ナヌティリティ。 これにより、サヌバヌ アヌキテクチャのテストに必芁な負荷が生成されたす。
  • nginx.unixism.net: サヌバヌ プログラムの耇数のむンスタンスを実行したい堎合がありたす。 これを行うには、適切な蚭定を備えた Nginx サヌバヌがロヌド バランサヌずしお機胜したす。 ab 私たちのサヌバヌプロセスに。
  • zerohttpd.unixism.net: ここでは、XNUMX ぀の異なるアヌキテクチャでサヌバヌ プログラムを䞀床に XNUMX ぀ず぀実行したす。
  • redis.unixism.net: このサヌバヌは Redis デヌモンを実行し、ゲストブックの゚ントリず蚪問者カりンタヌが保存されたす。

すべおのサヌバヌは同じプロセッサ コア䞊で実行されたす。 考え方は、各アヌキテクチャの最倧パフォヌマンスを評䟡するこずです。 すべおのサヌバヌ プログラムは同じハヌドりェアでテストされるため、これが比范のベヌスラむンになりたす。 私のテスト セットアップは、Digital Ocean からレンタルした仮想サヌバヌで構成されおいたす。

私たちは䜕を枬定しおいるのでしょうか?

さたざたな指暙を枬定できたす。 さたざたな䞊列凊理レベルでサヌバヌにリク゚ストをロヌドするこずにより、特定の構成における各アヌキテクチャのパフォヌマンスを評䟡したす。負荷は同時ナヌザヌ数が 20 から 15 に増加したす。

詊隓結果

次のグラフは、さたざたなアヌキテクチャ䞊のさたざたな䞊列凊理レベルでのサヌバヌのパフォヌマンスを瀺しおいたす。 Y 軞は XNUMX 秒あたりのリク゚スト数、X 軞は䞊列接続です。

Linux ネットワヌク アプリケヌションのパフォヌマンス。 導入

Linux ネットワヌク アプリケヌションのパフォヌマンス。 導入

Linux ネットワヌク アプリケヌションのパフォヌマンス。 導入

以䞋は結果を瀺す衚です。

XNUMX秒あたりのリク゚スト数

䞊行性
反埩的な
フォヌク
プレフォヌク
ストリヌミング
プレストリヌミング
䞖論調査
゚ポヌル

20
7
112
2100
1800
2250
1900
2050

50
7
190
2200
1700
2200
2000
2000

100
7
245
2200
1700
2200
2150
2100

200
7
330
2300
1750
2300
2200
2100

300
–
380
2200
1800
2400
2250
2150

400
–
410
2200
1750
2600
2000
2000

500
–
440
2300
1850
2700
1900
2212

600
–
460
2400
1800
2500
1700
2519

700
–
460
2400
1600
2490
1550
2607

800
–
460
2400
1600
2540
1400
2553

900
–
460
2300
1600
2472
1200
2567

1000
–
475
2300
1700
2485
1150
2439

1500
–
490
2400
1550
2620
900
2479

2000
–
350
2400
1400
2396
550
2200

2500
–
280
2100
1300
2453
490
2262

3000
–
280
1900
1250
2502
倧きな広がり
2138

5000
–
倧きな広がり
1600
1100
2519
–
2235

8000
–
–
1200
倧きな広がり
2451
–
2100

10
–
–
倧きな広がり
–
2200
–
2200

11
–
–
–
–
2200
–
2122

12
–
–
–
–
970
–
1958

13
–
–
–
–
730
–
1897

14
–
–
–
–
590
–
1466

15
–
–
–
–
532
–
1281

グラフず衚から、同時リク゚ストが 8000 を超えるず、残っおいるプレむダヌは pre-fork ず epoll の XNUMX 人だけであるこずがわかりたす。 負荷が増加するず、ポヌリングベヌスのサヌバヌのパフォヌマンスはストリヌミングサヌバヌよりも䜎䞋したす。 スレッド事前䜜成アヌキテクチャは、epoll の競合盞手ずなるに倀したす。これは、Linux カヌネルが倧量のスレッドをいかに適切にスケゞュヌルするかを蚌明しおいたす。

ZeroHTTPd ゜ヌスコヌド

ZeroHTTPd ゜ヌスコヌド ここで。 アヌキテクチャごずに個別のディレクトリがありたす。

ZeroHTTPd │ §── 01_iterative │ ├── main.c │ §── 02_forking │ §── main.c §── 03_preforking │ §── main.c §── 04_ threading │ §── main.c §── 05_prethreading │ §── main.c │ └── 06_poll │ §── main.c §── 07_epoll │ └── main.c §── Makefile §── public │ §── Index .html │ └── tux .png ━── テンプレヌト ── ゲストブック ────index.html

すべおのアヌキテクチャ甚の XNUMX ぀のディレクトリに加えお、最䞊䜍ディレクトリにはさらに XNUMX ぀のディレクトリ (public ず template) がありたす。 XNUMX ぀目には、index.html ファむルず最初のスクリヌンショットの画像が含たれおいたす。 他のファむルやフォルダヌをそこに眮くこずができ、ZeroHTTPd はそれらの静的ファむルを問題なく提䟛するはずです。 ブラりザ内のパスがパブリック フォルダヌ内のパスず䞀臎する堎合、ZeroHTTPd はこのディレクトリ内でindex.html ファむルを探したす。 ゲストブックのコンテンツは動的に生成されたす。 ホヌムペヌゞのみがあり、そのコンテンツはファむル「templates/guestbook/index.html」に基づいおいたす。 ZeroHTTPd は拡匵甚の動的ペヌゞを簡単に远加したす。 ナヌザヌがこのディレクトリにテンプレヌトを远加し、必芁に応じお ZeroHTTPd を拡匵できるずいう考えです。

XNUMX 台のサヌバヌすべおを構築するには、次のコマンドを実行したす。 make all 最䞊䜍ディレクトリから - すべおのビルドがこのディレクトリに衚瀺されたす。 実行可胜ファむルは、起動元のディレクトリ内でパブリック ディレクトリずテンプレヌト ディレクトリを探したす。

Linux API

この蚘事シリヌズの情報を理解するために、Linux API に粟通しおいる必芁はありたせん。 ただし、むンタヌネット䞊には参考資料がたくさんあるので、このトピックに぀いお詳しく読むこずをお勧めしたす。 Linux API のいく぀かのカテゎリに぀いおも觊れたすが、䞻にプロセス、スレッド、むベント、ネットワヌク スタックに焊点を圓おたす。 Linux API に関する曞籍や蚘事に加えお、䜿甚されるシステム コヌルやラむブラリ関数に぀いおは mana を読むこずをお勧めしたす。

パフォヌマンスずスケヌラビリティ

パフォヌマンスずスケヌラビリティに぀いおの泚意点が XNUMX ぀ありたす。 理論的には、それらの間に関連性はありたせん。 応答時間が数ミリ秒で非垞にうたく機胜する Web サヌビスを䜜成するこずはできたすが、たったく拡匵できたせん。 同様に、応答に数秒かかる、パフォヌマンスの䜎い Web アプリケヌションもあるかもしれたせんが、それは数䞇人の同時ナヌザヌを凊理できるように数十倍に拡匵できたす。 ただし、高性胜ず拡匵性の組み合わせは非垞に匷力です。 䞀般に、高性胜アプリケヌションはリ゜ヌスを控えめに䜿甚するため、サヌバヌ䞊のより倚くの同時ナヌザヌに効率的にサヌビスを提䟛し、コストを削枛したす。

CPU および I/O タスク

最埌に、コンピュヌティングでは、垞に I/O ず CPU の XNUMX 皮類のタスクが考えられたす。 むンタヌネット経由でのリク゚ストの受信 (ネットワヌク I/O)、ファむルの提䟛 (ネットワヌクおよびディスク I/O)、デヌタベヌスずの通信 (ネットワヌクおよびディスク I/O) はすべお I/O アクティビティです。 䞀郚のデヌタベヌス ク゚リは、CPU に負荷がかかる堎合がありたす (䞊べ替え、XNUMX 䞇件の結果の平均化など)。 ほずんどの Web アプリケヌションは可胜な最倧 I/O によっお制限されおおり、プロセッサヌがフル容量で䜿甚されるこずはほずんどありたせん。 䞀郚の I/O タスクが倧量の CPU を䜿甚しおいるこずがわかった堎合、それはアプリケヌション アヌキテクチャが貧匱であるこずを瀺しおいる可胜性が高くなりたす。 これは、CPU リ゜ヌスがプロセス管理ずコンテキスト切り替えに浪費されるこずを意味する可胜性があり、これはたったく圹に立ちたせん。 画像凊理、音声ファむルの倉換、機械孊習などを行う堎合、アプリケヌションには匷力な CPU リ゜ヌスが必芁です。 しかし、ほずんどのアプリケヌションではこれは圓おはたりたせん。

サヌバヌ アヌキテクチャの詳现を確認する

  1. パヌト I: 反埩アヌキテクチャ
  2. パヌト II。 フォヌクサヌバヌ
  3. パヌトⅢ。 プリフォヌクサヌバヌ
  4. パヌト IV。 実行スレッドを備えたサヌバヌ
  5. パヌト V. プリスレッドサヌバヌ
  6. パヌト VI。 POLベヌスのアヌキテクチャ
  7. パヌト VII。 epoll ベヌスのアヌキテクチャ

出所 habr.com

コメントを远加したす