スレッドプヌルNGINX 9回以䞊の高速化

ご存じのずおり、NGINXは非同期むベントアプロヌチを䜿甚しお接続を凊理したす。 埓来のアヌキテクチャのサヌバヌが行うように各リク゚ストに個別のスレッドたたはプロセスを割り圓おる代わりに、NGINXは単䞀のワヌクフロヌで耇数の接続ずリク゚ストの凊理を倚重化したす。 このため、゜ケットは非ブロッキングモヌドで䜿甚され、 epollやkqueueなどのむベントを凊理する効果的な方法が䜿甚されたす。



フルりェむトの凊理フロヌは少数で䞀定であるため通垞はコアごずに1぀、メモリずプロセッサリ゜ヌスは切り替えコンテキストで節玄されたす。 NGINXの䟋でこのアプロヌチのすべおの利点を十分に芳察できたす。NGINX自䜓は、数癟䞇のリク゚ストを同時に凊理でき、拡匵性に優れおいたす。







各プロセスはメモリを消費し、プロセスを切り替えるたびに远加のプロセッササむクルが必芁になり、Lキャッシュのリヌチングにも぀ながりたす。



コむンには欠点もありたす。 非同期アプロヌチの䞻な問題、たたは「敵」ず蚀った方がよいのは、操䜜をブロックするこずです。 そしお、残念ながら、NGINXの機胜の原理を理解しおいないサヌドパヌティモゞュヌルの倚くの䜜成者は、モゞュヌルでブロッキング操䜜を実行しようずしたす。 このような操䜜は、NGINXのパフォヌマンスを完党に損なう可胜性があるため、いかなる堎合でも回避する必芁がありたす。



しかし、珟圚のNGINX実装でも、ロックを回避するこずが垞に可胜ずは限りたせん。 そしお、この問題を解決するために、NGINXバヌゞョン1.7.11は「スレッドプヌル」の新しいメカニズムを導入したした。 それが䜕であるか、そしおそれをさらに適甚する方法を分析し、最初に敵を盎接知るこずになりたす。



問題



問題をよりよく理解するために、NGINXがどのように機胜するかに関する䞻芁なポむントを最初に詳现に調べたす。



動䜜原理によれば、NGINXはそのようなむベントハンドラヌであり、接続で発生したすべおのむベントに関する情報をカヌネルから受け取り、オペレヌティングシステムに䜕をするかを指瀺するコントロヌラヌです。 実際、NGINXはシステムリ゜ヌスを操䜜する最も困難なタスクを解決し、オペレヌティングシステムはすべおのルヌチンを実行し、情報のバむトを読み取り、送信したす。 したがっお、NGINXワヌクフロヌがむベントにどれだけ迅速か぀タむムリヌに応答するかが重芁です。







ワヌクフロヌは、カヌネルからむベントを受信しお​​凊理したす。



このようなむベントには、タむマヌむベント、新しいデヌタの到着、応答の送信、バッファ内のスペヌスの解攟、接続゚ラヌたたはそのクロヌズの通知がありたす。 NGINXはそのようなむベントのパケットを受信し、順番に凊理を開始し、必芁なアクションを実行したす。 したがっお、むベントキュヌのすべおの凊理は、1぀のスレッドで単玔なサむクルで行われたす。 NGINXはキュヌからむベントを次々ず抜出し、゜ケットぞのデヌタの曞き蟌みや読み取りなどのいく぀かのアクションを実行したす。 ほずんどの堎合、これは非垞に迅速に行われるためほずんどの堎合、メモリ内の少量のデヌタをコピヌするだけです、すべおのむベントを瞬時に凊理するこずを怜蚎できたす。







すべおの凊理は、1぀のスレッドで単玔なサむクルで行われたす。



しかし、ある皮の長くお難しい操䜜を実行しようずするずどうなりたすか むベントルヌプ党䜓が、この操䜜の完了を埅機しなくなりたす。



したがっお、ブロッキング操䜜ずは、むベント凊理のサむクルを倧幅に遅らせる操䜜を意味したす。 操䜜は、さたざたな理由でブロッキングず呌ばれるこずがありたす。 たずえば、NGINXは長時間の蚈算集玄的な操䜜でビゞヌであるか、䜕らかのリ゜ヌスハヌドディスク、ミュヌテックス、ラむブラリ呌び出し、同期モヌドでのデヌタベヌスからの応答を埅機するなどぞのアクセスを期埅する堎合がありたす。 ここで重芁なのは、これらの操䜜䞭、ワヌクフロヌは他に圹立぀こずは䜕もできず、他のむベントを凊理できないこずです。ただし、倚くの堎合、ただ空きリ゜ヌスがあり、キュヌでさらに埅機しおいるむベントはそれらを䜿甚できたす。



巚倧な買い手が䞊んでいる店の売り手を想像しおください。 そしお今、列の最初の人がチェックアりトカりンタヌに近づき、窓にはないが遠くの倉庫にある商品を賌入したいず考えおいたす。 売り手は数時間埅぀ように頌み、商品の倉庫に向けお出発したす。 䞊んでいる他の顧客の反応を想像できたすか 埅機時間はこれら2時間増加したしたが、倚くの堎合、必芁なものはカりンタヌの䞊に数メヌトルありたす。







ラむン党䜓は、最初のバむダヌの泚文の実行を埅機せざるを埗たせん。



NGINXでも同様の状況が発生したす。送信されるファむルがメモリ内ではなく、ハヌドドラむブ䞊にある堎合です。 ディスクは䜎速であり特に回転するディスク、キュヌで凊理されるのを埅機しおいる他の芁求はハヌドドラむブぞのアクセスを必芁ずしない堎合がありたすが、それでも埅機する必芁がありたす。 その結果、遅延が増倧し、システムリ゜ヌスが完党に利甚されない堎合がありたす。







1回のブロッキング操䜜で、埌続のすべおの凊理が倧幅に遅延する可胜性がありたす。



䞀郚のオペレヌティングシステムは、ファむルを非同期で読み取るためのむンタヌフェむスを提䟛し、NGINXはそれらを効率的に䜿甚できたす aioディレクティブの説明を参照。 そのようなシステムの良い䟋は、FreeBSDです。 残念ながら、Linuxでも同じこずは蚀えたせん。 Linuxにはファむルを読み取るための特定の非同期むンタヌフェむスがありたすが、倚くの重倧な欠点がありたす。 そのような芁件の1぀は、読み取りずバッファヌのアラむメントです。 NGINXはこれにうたく察凊できたすが、2番目の問題はさらに深刻です。 非同期読み取りでは、ファむル蚘述子にO_DIRECT



フラグを蚭定する必芁がありたす。 これは、すべおのデヌタがオペレヌティングシステムのペヌゞキャッシュいわゆるペヌゞキャッシュ をバむパスしおディスクから読み取られるこずを意味したす。倚くの堎合、これは最適ではなく、ディスクサブシステムの負荷が倧幅に増加したす。



特に、この問題を解決するために、NGINX 1.7.11はスレッドプヌルの新しいメカニズムを導入したした。 これらはただNGINX Plusに含たれおいたせんが、スレッドプヌルを䜿甚しおNGINX Plus R6アセンブリを詊しおみたい堎合は、営業郚門にお問い合わせください。



そしお、それらが䜕であり、どのように機胜するかをより詳现に分析したす。



スレッドプヌル



䞍運な売り手に戻りたしょう。 しかし、今回は圌はより機知に富んでいるこずがわかりたしたたたは、怒った顧客にbeatられた埌ですかそしお、宅配䟿を組織したした。 珟圚、バむダヌがカりンタヌにない商品を芁求するず、カりンタヌを離れるのではなく、自分で商品を探しお他の党員に埅たせ、商品の配達芁求を宅配䟿に送信しお、顧客の列にサヌビスを提䟛し続けたす。 したがっお、ストアに泚文がなかった買い手のみが配達を埅っおおり、その間、売り手は問題なく残りにサヌビスを提䟛できたす。







クヌリ゚による泚文凊理は、キュヌをブロックしたせん。



NGINXの堎合、スレッドプヌルはクヌリ゚ずしお機胜したす。 ゞョブキュヌず、このキュヌを凊理する個々の軜量スレッドのセットで構成されたす。 ワヌクフロヌは、それ自䜓で行うのではなく、朜圚的に長い操䜜を必芁ずする堎合、凊理タスクをプヌルキュヌに入れ、そこから任意のフリヌストリヌムがすぐに凊理を開始できたす。







ワヌクフロヌは、ブロッキング凊理をスレッドプヌルに送信したす。



ここで別のタヌンが圢成されたようです。 そうです。 ただし、この堎合、このキュヌは特定のリ゜ヌスに制限されたす。 圌ができるよりも速くディスクから読み取るこずはできたせんが、少なくずも読み取りを埅぀こずで、他のむベントの凊理が遅れるこずはありたせん。



ディスクからの読み取りは、ブロッキング操䜜の最も䞀般的な䟋ずしお取り䞊げられおいたすが、実際には、NGINXのスレッドプヌルは、メむンワヌクサむクル内で実行するのが非合理的な他のタスクに䜿甚できたす。



珟圚、スレッドプヌルぞのアップロヌド操䜜は、ほずんどのオペレヌティングシステムのreadシステムコヌル、およびLinuxのsendfileに察しおのみ実装されおいたす。 この問題の調査を継続し、おそらくパフォヌマンスが向䞊する堎合は、今埌、スレッドプヌルによる他の操䜜の実行を実装する可胜性がありたす。



パフォヌマンスのテスト



理論から実践ぞず移行する時が来たした。 スレッドプヌルを䜿甚した効果を瀺すために、簡単な実隓を行いたす。 ぀たり、ディスクアクセスでのブロッキングの問題が完党に明らかになったずきに、NGINXにブロッキングずノンブロッキングの読み取りの混合を実行させる、最も難しい条件を再珟したす。



これには、オペレヌティングシステムのキャッシュに収たらないこずが保蚌されおいるデヌタセットが必芁です。 RAM容量が48 GBのマシンでは、ランダムデヌタを含む各4 MBの256 GBのファむルが生成され、NGINXバヌゞョン1.9.0が起動しおそれらを配垃したした。



構成は非垞に簡単です。



 worker_processes 16; events { accept_mutex off; } http { include mime.types; default_type application/octet-stream; access_log off; sendfile on; sendfile_max_chunk 512k; server { listen 8000; location / { root /storage; } } }
      
      





ご芧のずおり、最高のパフォヌマンスを埗るために少し調敎が行われたした。ロギングが無効になり、 accept_mutexが無効になり、 sendfileがオンになり、 sendfile_max_chunkが蚭定されたす。 埌者を䜿甚するず、 sendfile()



呌び出しのロック時間を短瞮できたす。この堎合、NGINXは䞀床にファむル党䜓の読み取りず送信を詊行せず、512キロバむトの郚分で実行するためです。



このマシンには、2぀のIntel Xeon E5645プロセッサ合蚈12コア、24のHyperThreadingスレッドず10 GBネットワヌクむンタヌフェむスが装備されおいたす。 ディスクサブシステムは、RAID10アレむに結合された4台のWestern Digital WD1003FBYXハヌドドラむブで構成されおいたす。 これらはすべお、Ubuntu Server 14.04.1 LTSオペレヌティングシステムによっお制埡されたす。





テストベッド構成。



顧客は特性が䌌おいる2台のマシンです。 それらの1぀はwrkを実行し、Luaスクリプトで䞀定の負荷を䜜成したす。 スクリプトは、200の䞊列接続を䜿甚しお、ストレヌゞからファむルをランダムな順序で芁求したす。 この負荷を寄生ず呌びたす。



別のクラむアントマシンからwrk



を実行し、50個のスレッドで同じファむルを芁求したす。 このファむルは垞にアクセスされおいるため、ランダムな順序で芁求されたファむルずは異なり、オペレヌティングシステムのキャッシュから掗い萜ずされる時間がなく、その読み取りは垞にメモリから行われたす。 これを負荷テストず呌びたす。



サヌバヌ䞊のifstat



むンゞケヌタず2番目のクラむアントマシンからのwrk



統蚈によっおパフォヌマンスを枬定したす。



そのため、スレッドプヌルを䜿甚しない最初の実行では、非垞に控えめな結果が瀺されたす。



 % ifstat -bi eth2 eth2 Kbps in Kbps out 5531.24 1.03e+06 4855.23 812922.7 5994.66 1.07e+06 5476.27 981529.3 6353.62 1.12e+06 5166.17 892770.3 5522.81 978540.8 6208.10 985466.7 6370.79 1.12e+06 6123.33 1.07e+06
      
      





この構成を芋るずわかるように、このような負荷の䞋で、サヌバヌは毎秒玄1ギガビットを発行できたす。 同時に、䞊郚では、ほずんどの堎合、すべおのNGINXワヌクフロヌがI / Oでブロックされた状態にあるこずがわかりたす文字D



マヌクされおいたす。



 top - 10:40:47 up 11 days, 1:32, 1 user, load average: 49.61, 45.77 62.89 Tasks: 375 total, 2 running, 373 sleeping, 0 stopped, 0 zombie %Cpu(s): 0.0 us, 0.3 sy, 0.0 ni, 67.7 id, 31.9 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem: 49453440 total, 49149308 used, 304132 free, 98780 buffers KiB Swap: 10474236 total, 20124 used, 10454112 free, 46903412 cached Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 4639 vbart 20 0 47180 28152 496 D 0.7 0.1 0:00.17 nginx 4632 vbart 20 0 47180 28196 536 D 0.3 0.1 0:00.11 nginx 4633 vbart 20 0 47180 28324 540 D 0.3 0.1 0:00.11 nginx 4635 vbart 20 0 47180 28136 480 D 0.3 0.1 0:00.12 nginx 4636 vbart 20 0 47180 28208 536 D 0.3 0.1 0:00.14 nginx 4637 vbart 20 0 47180 28208 536 D 0.3 0.1 0:00.10 nginx 4638 vbart 20 0 47180 28204 536 D 0.3 0.1 0:00.12 nginx 4640 vbart 20 0 47180 28324 540 D 0.3 0.1 0:00.13 nginx 4641 vbart 20 0 47180 28324 540 D 0.3 0.1 0:00.13 nginx 4642 vbart 20 0 47180 28208 536 D 0.3 0.1 0:00.11 nginx 4643 vbart 20 0 47180 28276 536 D 0.3 0.1 0:00.29 nginx 4644 vbart 20 0 47180 28204 536 D 0.3 0.1 0:00.11 nginx 4645 vbart 20 0 47180 28204 536 D 0.3 0.1 0:00.17 nginx 4646 vbart 20 0 47180 28204 536 D 0.3 0.1 0:00.12 nginx 4647 vbart 20 0 47180 28208 532 D 0.3 0.1 0:00.17 nginx 4631 vbart 20 0 47180 756 252 S 0.0 0.1 0:00.00 nginx 4634 vbart 20 0 47180 28208 536 D 0.0 0.1 0:00.11 nginx 4648 vbart 20 0 25232 1956 1160 R 0.0 0.0 0:00.08 top 25921 vbart 20 0 121956 2232 1056 S 0.0 0.0 0:01.97 sshd 25923 vbart 20 0 40304 4160 2208 S 0.0 0.0 0:00.53 zsh
      
      





この堎合、すべおがディスクサブシステムのパフォヌマンスに䟝存したすが、プロセッサはほずんどの時間アむドル状態です。 wrk



結果も残念です。



 Running 1m test @ http://192.0.2.1:8000/1/1/1 12 threads and 50 connections Thread Stats Avg Stdev Max +/- Stdev Latency 7.42s 5.31s 24.41s 74.73% Req/Sec 0.15 0.36 1.00 84.62% 488 requests in 1.01m, 2.01GB read Requests/sec: 8.08 Transfer/sec: 34.07MB
      
      





メモリからファむルを1぀だけ配垃する堎合でも、倧幅な遅延が発生したす。 すべおのワヌクフロヌはディスクからの読み取りでビゞヌであり、スプリアスロヌドを䜜成する最初のマシンから200の接続を提䟛し、これらのテスト芁求をタむムリヌに凊理できたせん。



次に、スレッドプヌルを接続したす。このために、ストレヌゞを䜿甚しおlocation



ブロックにaio threads



ディレクティブを远加したす。



 location / { root /storage; aio threads; }
      
      





そしお、NGINXに蚭定を再読み蟌みするよう䟝頌したす。



テストを繰り返したす。



 % ifstat -bi eth2 eth2 Kbps in Kbps out 60915.19 9.51e+06 59978.89 9.51e+06 60122.38 9.51e+06 61179.06 9.51e+06 61798.40 9.51e+06 57072.97 9.50e+06 56072.61 9.51e+06 61279.63 9.51e+06 61243.54 9.51e+06 59632.50 9.50e+06
      
      





これで、サヌバヌは9.5ギガビット/秒スレッドプヌルなしで〜1ギガビット/秒を発行したす



それはおそらくより倚くを䞎える可胜性がありたすが、これは特定のネットワヌクむンタヌフェむスの実際的な制限であり、NGINXはネットワヌク垯域幅に䟝存したす。 ワヌクフロヌは、ほずんどの時間、むベントを埅機しおスリヌプしたす状態S



。



 top - 10:43:17 up 11 days, 1:35, 1 user, load average: 172.71, 93.84, 77.90 Tasks: 376 total, 1 running, 375 sleeping, 0 stopped, 0 zombie %Cpu(s): 0.2 us, 1.2 sy, 0.0 ni, 34.8 id, 61.5 wa, 0.0 hi, 2.3 si, 0.0 st KiB Mem: 49453440 total, 49096836 used, 356604 free, 97236 buffers KiB Swap: 10474236 total, 22860 used, 10451376 free, 46836580 cached Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 4654 vbart 20 0 309708 28844 596 S 9.0 0.1 0:08.65 nginx 4660 vbart 20 0 309748 28920 596 S 6.6 0.1 0:14.82 nginx 4658 vbart 20 0 309452 28424 520 S 4.3 0.1 0:01.40 nginx 4663 vbart 20 0 309452 28476 572 S 4.3 0.1 0:01.32 nginx 4667 vbart 20 0 309584 28712 588 S 3.7 0.1 0:05.19 nginx 4656 vbart 20 0 309452 28476 572 S 3.3 0.1 0:01.84 nginx 4664 vbart 20 0 309452 28428 524 S 3.3 0.1 0:01.29 nginx 4652 vbart 20 0 309452 28476 572 S 3.0 0.1 0:01.46 nginx 4662 vbart 20 0 309552 28700 596 S 2.7 0.1 0:05.92 nginx 4661 vbart 20 0 309464 28636 596 S 2.3 0.1 0:01.59 nginx 4653 vbart 20 0 309452 28476 572 S 1.7 0.1 0:01.70 nginx 4666 vbart 20 0 309452 28428 524 S 1.3 0.1 0:01.63 nginx 4657 vbart 20 0 309584 28696 592 S 1.0 0.1 0:00.64 nginx 4655 vbart 20 0 30958 28476 572 S 0.7 0.1 0:02.81 nginx 4659 vbart 20 0 309452 28468 564 S 0.3 0.1 0:01.20 nginx 4665 vbart 20 0 309452 28476 572 S 0.3 0.1 0:00.71 nginx 5180 vbart 20 0 25232 1952 1156 R 0.0 0.0 0:00.45 top 4651 vbart 20 0 20032 752 252 S 0.0 0.0 0:00.00 nginx 25921 vbart 20 0 121956 2176 1000 S 0.0 0.0 0:01.98 sshd 25923 vbart 20 0 40304 3840 2208 S 0.0 0.0 0:00.54 zsh
      
      





たた、プロセッサリ゜ヌスはただ十分に䟛絊されおいたす。



2番目のマシンのwrk



結果



 Running 1m test @ http://192.0.2.1:8000/1/1/1 12 threads and 50 connections Thread Stats Avg Stdev Max +/- Stdev Latency 226.32ms 392.76ms 1.72s 93.48% Req/Sec 20.02 10.84 59.00 65.91% 15045 requests in 1.00m, 58.86GB read Requests/sec: 250.57 Transfer/sec: 0.98GB
      
      





4 MBファむルの平均アップロヌド時間は、7.42秒から226.32ミリ秒に短瞮されたした。 〜33倍、1秒間に凊理されるリク゚ストの数は31倍8に察しお250増加したした



これは、ワヌクフロヌがディスクからの読み取りをブロックされおいる間、リク゚ストが凊理のためにキュヌで埅機するこずはなくなり、空きスレッドによっお凊理されるようになったずいう事実によっお説明されたす。 そしお、ディスクサブシステムができる限りゞョブを実行し、最初のマシンから「停の」トラフィックを凊理したすが、NGINXは残りのプロセッサリ゜ヌスずネットワヌク垯域幅を䜿甚しお、メモリから2番目のクラむアントを凊理したす。



特効薬は存圚したせん



ブロック操䜜ずそのような驚くべき結果に関するすべおの恐ろしい話の埌、あなたの倚くはおそらく圌らのサヌバヌでスレッドプヌルをオンにしたいず思うでしょう。 急がないでください。



幞いなこずに、ほずんどの堎合、ファむル操䜜は䜎速のハヌドドラむブからの読み取りには぀ながりたせん。 十分なRAMがある堎合、最新のオペレヌティングシステムは、いわゆるペヌゞキャッシュで頻繁にアクセスされるファむルをキャッシュするのに十分スマヌトです。



ペヌゞキャッシュは非垞によく凊理され、これにより、NGINXは垞に最も䞀般的な状況で高いパフォヌマンスを発揮するこずができたした。 ペヌゞキャッシュからの読み取りは非垞に迅速に行われ、この操䜜をブロッキングず呌ぶこずはできたせん。 同時に、スレッドプヌルずの察話には、远加の同期コストがかかりたす。



したがっお、十分なRAMず少量のホットデヌタがあれば、すでに問題はなく、NGINXはスレッドプヌルを䜿甚せずに最適な方法で動䜜したす。



実際、読み取り操䜜を別のスレッドプヌルにアンロヌドするず、かなり狭い範囲のタスクが解決されたす。 定期的に芁求されるデヌタの量がRAMに収たらない状況に限定されるため、オペレヌティングシステムのペヌゞキャッシュが非効率的になりたす。 そのような䟋は、負荷の高いメディア配信サヌビスです。 この状況をテストでシミュレヌトしたした。



読み取り操䜜のスレッドプヌルぞのアンロヌドは、必芁なデヌタがメモリ内にあるかどうかを事前に確認する効果的な方法があれば、読み取り操䜜に察しおより汎甚的になり、遅延を枛らしたす。埌者の堎合のみ、操䜜を別のストリヌムにアンロヌドしたす。



店舗ず遠く離れた倉庫の䟋えに戻るず、売り手は商品が窓にあるこずを知る機䌚がなく、垞に宅配䟿を利甚せざるを埗たせん。



実際には、オペレヌティングシステムのカヌネルからの察応するサポヌトはありたせん。 最初に、この機胜をfincoreシステムコヌルの圢匏でLinuxに远加しようず詊みたしたが、2010幎に遡りたすが、「ただありたす」。 埌にpreadv2()



システムコヌルおよびRWF_NONBLOCK



フラグの圢匏で詊行が行われたした詳现は、LWN.netのノンブロッキングバッファヌファむル読み取り操䜜および非同期バッファヌ読み取り操䜜の蚘事に蚘茉されおいたす -しかし、これらのパッチの運呜は䟝然ずしお疑問です。 このすべおのせいが悪名高い自転車運転 フェルトペンの匂いの色に぀いおの議論であるように思われるのは悲しいこずです。



FreeBSDナヌザヌは心配する必芁はありたせんが、カヌネルに実装された正垞に機胜する非同期読み取りメカニズムを持っおいたす。 スレッドプヌルの代わりに䜿甚するこずをお勧めしたす。



構成



そのため、タスクのスレッドプヌルから利益を埗るこずができるず確信しおいる堎合は、スレッドプヌルを有効にしお構成する方法に関する疑問が必ず生じたす。



構成は非垞にシンプルであるず同時に非垞に柔軟です。 たず、-with --with-threads



フラグでコンパむルされたNGINXバヌゞョン1.7.11以降が必芁です。 最も単玔なケヌスでは、セットアップは基本的に芋えたす。 読み取りおよびファむルのスレッドプヌルぞのダりンロヌドを可胜にするために必芁なのは、スレッドに蚭定されたhttp



、 server



たたはlocation



レベルのaio



ディレクティブだけです。



 aio threads;
      
      





これは、スレッドプヌルを構成するための最小のオプションです。 実際、これはこの構成の短瞮バヌゞョンです。



 thread_pool default threads=32 max_queue=65536; aio threads=default;
      
      





default



スレッドプヌルを蚭定しdefault



。32個のスレッドが機胜し、ゞョブキュヌの最倧蚱容サむズは65536です。ゞョブキュヌがいっぱいの堎合、NGINXはリク゚ストを拒吊し、゚ラヌを蚘録したす。



 thread pool "NAME" queue overflow: N tasks waiting
      
      





これは、スレッドが䜜業量に察応せず、キュヌが凊理されるよりも早く満たされる堎合に可胜です。 この堎合、最倧キュヌサむズを増やすこずを詊みるこずができたす。これが圹に立たない堎合、システムは単玔にそのような倚数のリク゚ストを凊理できたせん。



ご芧のずおり、 thread_poolディレクティブを䜿甚しお、スレッド数、最倧キュヌサむズ、およびこのスレッドプヌルの名前を蚭定できたす。 埌者には、耇数の独立したプヌルを構成し、それらを異なるタスクの構成の異なる郚分で䜿甚する機胜が含たれたす。



 thread_pool one threads=128 max_queue=0; thread_pool two threads=32; http { server { location /one { aio threads=one; } location /two { aio threads=two; } } 
 }
      
      





プヌル2のようにmax_queue



パラメヌタヌmax_queue



明瀺的に指定されおいない堎合、デフォルト倀の65536が䜿甚されたす䟋からわかるように、キュヌサむズをれロに蚭定できたす。 その埌、プヌルは、空きスレッドず同数のゞョブのみを同時に受け入れるこずができ、キュヌで埅機しおいるゞョブはありたせん。



ここで、バック゚ンドのキャッシュプロキシずしお機胜する3台のハヌドドラむブを備えたサヌバヌがあるずしたす。 同時に、掚定キャッシュサむズは、䜿甚可胜なRAMの量の䜕倍にもなりたす。 本質的に、これは個人のコンテンツ配信ネットワヌクCDN䞊のキャッシュノヌドのようなものです。 この堎合、キャッシュされたデヌタを返す際の䞻な負担はディスクサブシステムにありたす。 もちろん、利甚可胜な3぀のドラむブから最倧のパフォヌマンスを匕き出す必芁がありたす。



ここでの解決策の1぀は、RAIDアレむの線成です。 もちろん、このアプロヌチには長所ず短所がありたす。 しかし、今日NGINXはあなたに異なるアプロヌチを提䟛する準備ができおいたす



 #             : # /mnt/disk1, /mnt/disk2  /mnt/disk3  thread_pool pool_1 threads=16; thread_pool pool_2 threads=16; thread_pool pool_3 threads=16; http { proxy_cache_path /mnt/disk1 levels=1:2 keys_zone=cache_1:256m max_size=1024G use_temp_path=off; proxy_cache_path /mnt/disk2 levels=1:2 keys_zone=cache_2:256m max_size=1024G use_temp_path=off; proxy_cache_path /mnt/disk3 levels=1:2 keys_zone=cache_3:256m max_size=1024G use_temp_path=off; split_clients $request_uri $disk { 33.3% 1; 33.3% 2; * 3; } server { 
 location / { proxy_pass http://backend; proxy_cache_key $request_uri; proxy_cache cache_$disk; aio threads=pool_$disk; sendfile on; } } }
      
      





この構成では、3぀の独立したキャッシュを䜿甚したす。各ハヌドドラむブに1぀ず、ディスクにも3぀の独立したスレッドプヌルです。



キャッシュおよび、それに応じおハヌドドラむブ間で負荷を均等に分散するには、 split_clientsモゞュヌルを䜿甚したす。これはこれに最適です。



use_temp_path=off



ディレクティブのuse_temp_path=off



パラメヌタヌは、 use_temp_path=off



に、キャッシュデヌタが眮かれおいるのず同じディレクトリに䞀時ファむルを保存するように指瀺したす。 これは、応答をキャッシュに保存するずきに、あるドラむブから別のドラむブにデヌタをコピヌするこずを避けるためです。



これらすべおを組み合わせるこずで、NGINXは個別のスレッドプヌルを介しお各ディスクず䞊行しお独立しお察話するため、このディスクサブシステムから最倧のパフォヌマンスを匕き出すこずができたす。 各ディスクは16の独立したストリヌムによっお凊理され、ファむルの読み取りず送信のためのタスクの個別のキュヌが圢成されたす。



結局のずころ、あなたの顧客は個々のアプロヌチが奜きですか ハヌドドラむブも確認しおください。 ;



この䟋は、ハヌドりェアを盎接構成する際のNGINXの非垞に高い柔軟性のデモです。 NGINXに、このサヌバヌずデヌタのディスクサブシステムず最適に察話する方法を指瀺しおいたす。 そしお、このような埮調敎は、ナヌザヌレベルたでの゜フトりェアが最も最適な方法で機噚ず連携するずきに、特定のシステムのすべおのリ゜ヌスの最も効率的な䜿甚を保蚌したす。



結論



スレッドプヌルは、非同期アプロヌチの䞻な有名な敵であるブロッキング操䜜ず戊う玠晎らしいメカニズムです。これにより、NGINXは、特に非垞に倧量のデヌタに぀いお話しおいる堎合に、新しいレベルのパフォヌマンスを取るこずができたす。



前述のように、スレッドプヌルは他の操䜜に䜿甚でき、非同期むンタヌフェむスを持たないラむブラリを操䜜できたす。朜圚的に、これにより、モゞュヌルず機胜の実装の新しい可胜性が開かれたすが、パフォヌマンスを損なうこずなく実装するこずは、以前は劥圓な時間では実珟できたせんでした。既存のラむブラリの非同期バヌゞョンを䜜成するか、そのようなむンタヌフェむスを远加しようずするず、倚くの劎力ず時間を費やすこずができたすが、「ゲヌムには䟡倀がありたすか」ずいう疑問が生じたした。スレッドプヌルを䜿甚するず、ブロックコヌルで動䜜するモゞュヌルを䜜成し、NGINXがメむンタスクを実行しお残りのリク゚ストを凊理するこずなく、このタスクをはるかに簡単に解決できたす。



そのため、NGINXには将来、倚くの新しく興味深いものが埅っおいたす。私たちず䞀緒にいおください



All Articles