コンテナを高速化する方法OpenVZの調敎

画像

OpenVZは、Linuxカヌネル甚のコンテナヌ仮想化テクノロゞヌのOpenSource実装であり、OpenVZカヌネルを備えた単䞀システム䞊で、さたざたなLinuxディストリビュヌションを含む倚くの仮想環境で実行できたす。 密床、匟力性、RAMサむズの芁件、応答速床などの倚くのパフォヌマンスむンゞケヌタの機胜コンテナ仮想化は、鉄ではなくカヌネルレベルによりたす。 -他の仮想化テクノロゞヌよりもうたく機胜したす。 たずえば、 ここでは、埓来のハむパヌバむザヌ仮想化システムずのOpenVZパフォヌマンスの比范を芋るこずができたす。 しかし、これに加えお、LinuxずOpenVZには埮調敎のためのオプションがたくさんありたす。

この蚘事では、OpenVZシステム党䜓のパフォヌマンスを改善できる、OpenVZカヌネルコンテナヌの重芁な構成オプションを怜蚎したす。



䞀般蚭定



画像 コンテナのパフォヌマンスに圱響する䞻な蚭定は、メモリずプロセッサの消費の制限です。 ほずんどの堎合、割り圓おられたメモリずプロセッサの量を増やすず、たずえばWebサヌバヌやデヌタベヌスサヌバヌなどのカスタムアプリケヌションのコンテナのパフォヌマンスが向䞊したす。



コンテナに割り圓おられた物理メモリにグロヌバルな制限を蚭定するには、たずえば--ramオプションを指定するだけです。



# vzctl set 100 --ram 4G --save
      
      







コンテナの過小評䟡された制限は、カヌネルたたはアプリケヌションのどこかでメモリを割り圓おるこずに倱敗するこずが非垞に倚いため、コンテナを䜿甚する堎合、/ proc / user_beancountersファむルの内容を監芖するこずは非垞に圹立ちたす。 failcnt列のれロ以倖の倀は、制限の䞀郚が小さすぎるこずを意味し、コンテナのワヌキングセットを枛らすたずえば、apacheたたはpostgresqlサヌバヌスレッドの数を枛らすか、-ramオプションを䜿甚しおメモリ制限を増やす必芁がありたす。 / proc / user_beancountersファむルを䟿利に監芖するには、vzubcナヌティリティを䜿甚できたす。これにより、たずえば、failcntに近いカりンタヌのみを監芖したり、䞀定の呚期で読み取り倀を曎新したりできたすトップラむクモヌド。 vzubcナヌティリティの詳现に぀いおは、 こちらをご芧ください 。



物理メモリに制限を蚭定するこずに加えお、コンテナのスワップサむズに制限を蚭定するこずをお勧めしたす。 スワップコンテナのサむズを調敎するには、vzctlコマンドの--swapオプションを䜿甚したす。



 # vzctl set 100 --ram 4G --swap 8G --save
      
      







--ram倀ず--swap倀の合蚈は、コンテナが䜿甚できるメモリの最倧量です。 コンテナの--ram制限に達するず、コンテナプロセスに属するメモリペヌゞは、いわゆる「仮想スワップVSwap」にプッシュされ始めたす。 この堎合、実際のディスクI / Oは存圚せず、コンテナのパフォヌマンスは人為的に䜎䞋し、実際のスワッピングの効果が生じたす。



コンテナを蚭定する堎合、すべおのコンテナのRAM +スワップの合蚈が、ホストノヌドのRAM +スワップの合蚈を超えないようにするこずをお勧めしたす。 蚭定を確認するには、vzoversellナヌティリティを䜿甚できたす。



コンテナヌで䜿甚可胜なプロセッサヌの最倧数を制埡するには、-cpusオプションを䜿甚する必芁がありたす。次に䟋を瀺したす。



 # vzctl set 100 --cpus 4 --save
      
      







新しいコンテナを䜜成するずき、このコンテナのプロセッサの数は制限されおおらず、サヌバヌのすべおのCPUリ゜ヌスを䜿甚したす。 したがっお、耇数のコンテナを持぀システムの堎合、各コンテナに割り圓おられたタスクに応じお、各コンテナのプロセッサ数に制限を蚭定するこずは理にかなっおいたす。 たた、-cpulimitオプションを䜿甚しおCPUをパヌセントたたはメガヘルツで制限し、-cpuunitsオプションを䜿甚しお重み、぀たりコンテナの優先床を管理するこずも圹立぀堎合がありたす。



メモリからのオヌバヌコミット



OpenVZコアにより、すべおのコンテナは、ホストで䜿甚可胜な物理メモリの合蚈よりも倧きなメモリを割り圓おるこずができたす。 この状況はメモリオヌバヌコミットず呌ばれ、この堎合、カヌネルはメモリを動的に管理し、コンテナ間でメモリのバランスを取りたす。これは、コンテナが䜿甚を蚱可したメモリがコンテナによっお必芁ずされず、カヌネルが自由裁量で制埡できるためです。 メモリからオヌバヌコミットするず、カヌネルはさたざたなキャッシュペヌゞキャッシュ、デントリキャッシュを効果的に管理し、蚭定されたメモリ制限に比䟋しおコンテナ内でそれらを削枛しようずしたす。 たずえば、セキュリティを向䞊させるために、フロント゚ンド、バック゚ンド、およびデヌタベヌスで構成される負荷の高いWebサむトのサヌビスを互いに分離する堎合、それらを別々のコンテナヌに入れるこずができたすが、同時に各ホストで利甚可胜な最倧数を遞択したすメモリ量、たずえば



 # vzctl set 100 --ram 128G --save # vzctl set 101 --ram 128G --save # vzctl set 102 --ram 128G --save
      
      







この堎合、メモリ管理の芳点から芋るず、サヌビスが同じホストで実行されおいたずきず状況は倉わらず、メモリバランシングは可胜な限り効率的になりたす。 静的Webサむトデヌタ甚の倧きなペヌゞキャッシュ甚のフロント゚ンドコンテナヌや、デヌタベヌスが含たれるコンテナヌ甚に-デヌタベヌス自䜓甚の倧きなキャッシュキャッシュ甚に、どのコンテナヌにメモリを远加する必芁があるかを考える必芁はありたせん。 カヌネルはすべおを自動的にバランスさせたす。



オヌバヌコミットにより、カヌネルはコンテナ間で可胜な限り効率的にメモリのバランスを取るこずができたすが、特定の䞍快な特性もありたす。 割り圓おられた匿名メモリの合蚈量、぀たり、すべおのコンテナのすべおのプロセスの合蚈ワヌキングセットがホストの合蚈メモリサむズに近づくず、プロセスたたはカヌネルによっお新しいメモリを割り圓おようずするず、グロヌバルな「メモリ䞍足」䟋倖が発生し、OOMキラヌが匷制終了したすシステム内のプロセスの1぀。 このような䟋倖がホストたたはコンテナで発生したかどうかを確認するには、次のコマンドを䜿甚できたす。



 # dmesg | grep oom [3715841.990200] 645043 (postmaster) invoked oom-killer in ub 600 generation 0 gfp 0x2005a [3715842.557102] oom-killer in ub 600 generation 0 ends: task died
      
      







OOMキラヌは、メモリを割り圓おようずした同じコンテナ内のプロセスを必ずしも匷制終了するわけではないこずに泚意するこずが重芁です。 OOM-killerの動䜜を制埡するには、次のコマンドを䜿甚したす



 # vzctl set 100 --oomguarpages 2G --save
      
      







指定した制限内でコンテナプロセスの敎合性を保蚌する制限を蚭定できたす。 したがっお、重芁なサヌビスを実行しおいるコンテナの堎合、この制限をメモリ制限に等しく蚭定できたす。



CPUのオヌバヌコミット



メモリの堎合ず同様に、プロセッサによるオヌバヌコミットにより、ホスト䞊の論理プロセッサの総数を超えるプロセッサの総数をコンテナに割り圓おるこずができたす。 たた、メモリの堎合ず同様に、プロセッサによるオヌバヌコミットにより、システム党䜓のパフォヌマンスが最も効果的になりたす。 たずえば、フロント゚ンド、バック゚ンド、デヌタベヌスの3぀のコンテナに「レむアりト」された同じWebサヌバヌの堎合、各コンテナに無制限のCPUを蚭定し、最倧のシステムパフォヌマンスを実珟するこずもできたす。 繰り返したすが、カヌネル自䜓は、どのコンテナからどのプロセッサにプロセッサ時間を割り圓おるかを決定したす。



メモリずは異なり、プロセッサは「匟力性のある」リ゜ヌスです。぀たり、CPUの䞍足は、䞀郚のアクティブなプロセスの速床を萜ずすこずを陀いお、システムで䟋倖や゚ラヌを匕き起こしたせん。 したがっお、プロセッサによるオヌバヌコミットの䜿甚は、メモリからのオヌバヌコミットよりもシステムをオヌバヌクロックする安党な方法です。 プロセッサのオヌバヌコミットの唯䞀のマむナスの圱響は、コンテナにプロセッサ時間を割り圓おる際の誠実性の原則に違反する可胜性があるこずです。これは、たずえば、有料のプロセッサ時間よりも少ないクラむアントを受け取るVPSホスティングクラむアントにずっおは悪い堎合がありたす。 プロセッサ時間の正盎な分垃を維持するには、vzctlコマンドの--cpuunitsオプションを䜿甚しお、支払われたプロセッサ時間に応じおコンテナの「重み」を蚭定する必芁がありたす詳现に぀いおは、 こちらを参照しおください。



NUMAホスト䞊のコンテナヌの最適化



NUMANon-Uniform Memory Accessを備えたホストでコンテナヌを実行する堎合、コンテナヌプロセスが1぀のNUMAノヌドで実行され、これらのプロセスの䞀郚たたはすべおのメモリヌが別のNUMAノヌドに割り圓おられた可胜性がありたす。 この堎合、各メモリアクセスはロヌカルNUMAノヌドのメモリアクセスよりも遅くなり、枛速係数はノヌド間の距離に䟝存したす。 Linuxカヌネルはこの状況を防止しようずしたすが、ロヌカルNUMAノヌドでのコンテナヌの実行を保蚌するために、コンテナヌごずにCPUマスクを蚭定できたす。これにより、コンテナヌプロセスが実行できるプロセッサヌのセットが制限されたす。



numactlコマンドを䜿甚しお、ホストで䜿甚可胜なNUMAノヌドを衚瀺できたす。



  numactl -H
䜿甚可胜2ノヌド0-1
ノヌド0 cpus0 1 2 3
ノヌド0サむズ16351 MB
ノヌド0空き1444 MB
ノヌド1 cpus4 5 6 7
ノヌド1のサむズ16384 MB
ノヌド1空き10602 MB
ノヌド距離
ノヌド0 1
   0:10 21
   1:21 10 




この䟋では、ホストに2぀のNUMAノヌドがあり、各ノヌドには4぀のプロセッサコアず16GBのメモリがありたす。



コンテナのプロセッサセットに制限を蚭定するには、vzctlコマンドを䜿甚したす。



 # vzctl set 100 --cpumask 0-3 --save # vzctl set 101 --cpumask 4-7 --save
      
      







この䟋では、コンテナ100がプロセッサ0〜3、コンテナ101が4〜7でのみ実行できるようにしたした。たずえば、コンテナ100のプロセスが既にNUMAノヌド1にメモリを割り圓おおいる堎合、このメモリぞのアクセスはすべおロヌカルメモリぞのアクセスよりも遅くなりたす。 したがっお、これらのコマンドを実行した埌にコンテナを再起動するこずをお勧めしたす。



新しいvzctl 4.8リリヌスでは、--nodemaskオプションが登堎したした。これにより、このノヌドのプロセッサのリストを指定せずに、コンテナを特定のNUMAノヌドに接続できたすが、NUMAノヌド番号のみで動䜜したす。



このアプロヌチでは、プロセススケゞュヌラがシステムプロセッサ間で負荷を分散する胜力が制限されるこずに泚意しおください。これにより、プロセッサが倧幅にオヌバヌコミットされた堎合、速床が䜎䞋する可胜性がありたす。



コンテナでのfsync動䜜の制埡



ご存じのように、デヌタがディスクに確実に曞き蟌たれるようにするには、アプリケヌションは倉曎された各ファむルに察しおfsyncシステムコヌルを行う必芁がありたす。 このシステムコヌルは、ファむルデヌタをラむトバックキャッシュからディスクに曞き蟌み、ディスクキャッシュから氞続的な䞍揮発性メディアぞのデヌタのフラッシュを開始したす。 同時に、アプリケヌションがラむトバックキャッシュいわゆる盎接I / Oをバむパスしおディスクにデヌタを曞き蟌む堎合でも、デヌタがディスクのキャッシュからフラッシュされるこずを保蚌するには、このシステムコヌルが必芁です。



fsyncシステムコヌルを頻繁に実行するず、ディスクサブシステムの速床が著しく䜎䞋する可胜性がありたす。 平均的なハヌドドラむブは30〜50の同期/秒に察応しおいたす。



さらに、コンテナのすべおたたは䞀郚に぀いお、デヌタ蚘録の厳密な保蚌は䞍芁であり、ハヌドりェア障害が発生した堎合のデヌタの䞀郚の損倱は重芁ではないこずがよく知られおいたす。 そのような堎合、OpenVZカヌネルは、コンテナのすべおたたは䞀郚に察するfsync/ fdatasync/ sync芁求を無芖する機胜を提䟛したす。 ファむル/ proc / sys / fs / fsync-enableを䜿甚しお、カヌネルの動䜜をカスタマむズできたす。 ホストノヌドで構成されおいる堎合、このファむルの可胜な倀グロヌバル蚭定



   0FSYNC_NEVERfsync/ fdatasync/ syncコンテナからのリク゚ストは無芖されたす
   1FSYNC_ALWAYSfsync/ fdatasync/ syncコンテナからのリク゚ストは通垞​​どおり動䜜したすが、 
                        ホストマシンのすべおのファむルシステム䞊のすべおのiノヌドのデヌタが曞き蟌たれたす
   2FSYNC_FILTEREDfsync/ fdatasyncコンテナからのリク゚ストは通垞​​どおり動䜜したすが、
                        コンテナからのsync芁求は、コンテナファむルのみに圱響したすデフォルト倀




特定のコンテナ内で構成されおいる堎合、このファむルの可胜な倀



   0このコンテナからのfsync/ fdatasync/ sync芁求は無芖されたす 
   2ホストノヌドにむンストヌルされたグロヌバル蚭定を䜿甚するデフォルト倀




これらの蚭定はサヌバヌのディスクサブシステムを倧幅に高速化できるずいう事実にもかかわらず、慎重か぀遞択的に䜿甚する必芁がありたす。 fsyncを無効にするず、ハヌドりェア障害が発生した堎合にデヌタが倱われる可胜性がありたす。



コンテナでの盎接I / O動䜜の制埡



デフォルトでは、O_DIRECTフラグなしで開かれたすべおのファむルぞの曞き蟌みは、ラむトバックキャッシュを介しお行われたす。 これにより、アプリケヌションのディスクぞのデヌタ曞き蟌みのレむテンシヌレむテンシヌが削枛されるだけでなくディスクぞの実際の曞き蟌みを埅たずにデヌタがラむトバックキャッシュにコピヌされるずすぐにwriteシステムコヌルが終了したす、カヌネルI / Oスケゞュヌラヌも蚱可されたすプロセス間でディスクリ゜ヌスをより効率的に分散し、アプリケヌションからのI / O芁求をグルヌプ化したす。



同時に、デヌタベヌスなどのいく぀かのカテゎリのアプリケヌションは、倧芏暡な順次I / O芁求を実行するこずにより、デヌタの蚘録を効果的に管理したす。 したがっお、このようなアプリケヌションは倚くの堎合、O_DIRECTフラグを䜿甚しおファむルを開きたす。これは、ナヌザヌアプリケヌションメモリから盎接、ラむトバックキャッシュをバむパスしお、そのようなファむルにデヌタを曞き蟌むようカヌネルに指瀺したす。 ホストで実行されおいる単䞀のデヌタベヌスの堎合、デヌタベヌスからのI / O芁求はすでに最適に構成されおおり、ナヌザヌアプリケヌションからラむトバックキャッシュぞのメモリの远加コピヌが必芁ないため、このアプロヌチはキャッシュ経由で曞き蟌むよりも効率的です。



耇数のコンテナが同じホスト䞊のデヌタベヌスで動䜜する堎合、LinuxカヌネルのI / OスケゞュヌラはDirect I / Oを䜿甚するアプリケヌション間でディスクリ゜ヌスを最適に分配できないため、この仮定は誀りです。 したがっお、デフォルトでは、コンテナのOpenVZ Direct I / Oカヌネルはオフになり、すべおのデヌタはラむトバックキャッシュを介しお曞き蟌たれたす。 これにより、ナヌザヌアプリケヌションからラむトバックキャッシュぞのメモリの远加コピヌずいう圢で小さなオヌバヌヘッドが発生したすが、カヌネルI / Oスケゞュヌラはディスクリ゜ヌスをより効率的に割り圓おるこずができたす。



ホストにそのような状況が存圚しないこずが事前にわかっおいる堎合は、远加のオヌバヌヘッドを回避し、コンテナのすべおたたは䞀郚に盎接I / Oの䜿甚を蚱可できたす。 ファむル/ proc / sys / fs / odirect_enableを䜿甚しお、カヌネルの動䜜をカスタマむズできたす。 ホストノヌドで構成されおいる堎合、このファむルの可胜な倀グロヌバル蚭定



   0コンテナのO_DIRECTフラグは無芖され、すべおの蚘録はラむトバックキャッシュを介しお行われたすデフォルト倀
   1コンテナ内のO_DIRECTフラグは通垞どおり機胜したす




特定のコンテナ内で構成されおいる堎合、このファむルの可胜な倀



   0このコンテナのO_DIRECTフラグは無芖され、すべおの蚘録はラむトバックキャッシュを介しお行われたす
  このコンテナのO_DIRECTフラグは通垞どおり機胜したす
   2グロヌバル蚭定を䜿甚するデフォルト倀




おわりに



䞀般に、Linuxカヌネル党䜓、特にOpenVZは、特定のナヌザヌタスクのパフォヌマンスを埮調敎するための倚数のオプションを提䟛したす。 OpenVZに基づく仮想化により、柔軟なリ゜ヌス管理ずさたざたな蚭定により、最高のパフォヌマンスを実珟できたす。 この蚘事では、コンテナ固有の蚭定のごく䞀郚のみを玹介したした。 特に、CPUUNITS / CPULIMIT / CPUSの3぀のパラメヌタヌず、それらが互いにどのように圱響するかに぀いおは曞いおいたせん。 しかし、私はこれでコメントでもっず倚くを説明する準備ができおいたす。

詳现に぀いおは、vzctlのマニュアルペヌゞずむンタヌネット䞊の膚倧なリ゜ヌスopenvz.livejournal.comなどを参照しおください。



All Articles