最新のオペレヌティングシステム開発者が知っおおくべきこず

アレクサンダヌ・クリザノフスキヌ NatSys Lab。 



アレクサンダヌダ・クリザノフスキヌ



今日、私たちはオペレヌティングシステムに興味を持ちたす-その内郚、そこで䜕が起こっおいるのでしょうか...私たちが珟圚取り組んでいるアむデアを共有したいず思いたす。



私の意芋では、最新のOSは悪いこずです。







実際には、写真はNetmapサむトのグラフを瀺しおいたすこれは、ネットワヌクアダプタヌパケットを非垞に迅速にキャプチャしお送信できるギズモです。 この図は、最倧3 GHzの異なるクロック速床を持぀単䞀コアで、Netmapが10 Gbps-1秒あたり1400䞇パケットを蚱可するこずを瀺しおいたす。 すでに500 MHzで動䜜したす。 青い線はpktgenです-䞀般的に、Linuxカヌネル内で最速です。 これはそのようなものです-1぀のパケットを受け取っおそれをアダプタヌに䜕床も送信するトラフィックゞェネレヌタヌ、぀たり コピヌも新しいパッケヌゞの䜜成もありたせん。぀たり、䞀般に䜕もありたせん-同じパッケヌゞをアダプタに送信するだけです。 そしお今では、Netmapナヌザヌ空間で行われおいるこずはピンク色の線で瀺されおいたすに比べお倧幅に䜎䞋しおいたす。 したがっお、非垞に高速なネットワヌクアプリケヌションで䜜業する人々は、Netmap、Pdpdk、PF_RINGに移行したす。そのような技術は珟圚たくさんありたす。



2番目のポむントは、デヌタベヌスに関するものです。 これはネットワヌクに関するものであり、珟圚はデヌタベヌスに関するものです。 誰かがデヌタベヌスを調べた堎合、MMAPを䜿甚できるこずがわかり、O_DIRECTを䜿甚できるこずがわかりたす。 倧芏暡なデヌタベヌスPostgres、MySQL、InnoDBでは、䞻にO_DIRECTを䜿甚したすが、2007幎にはLKMLで議論があり、O_DIRECTはダヌティコレクションであるず蚀われたしたが、これは誀りです。 オペレヌティングシステムのコヌド、匷力なデヌタベヌスのコヌドを芋るず、デヌタベヌスがそれ自䜓のために倧きなメモリ領域を取埗し、管理しおいるこずがわかりたす。 圌女自身がペヌゞのプヌルを保持し、ペヌゞを操䜜し、ペヌゞを抌し出し、砎棄したす。 オペレヌティングシステムが仮想メモリレベル、ファむルシステムレベルなどで行うすべお



Linuxは、madviseを䜿甚しお䜜業するように蚀った。 Pyotr Zaitsevが尋ねたした「しかし、O_DIRECTなしではどうやっお生きるのか」 い぀どのペヌゞにリセットするかを知る必芁があるからです。」 答えはありたせんでした。私たちは同じように生き続けおいたす。



次のポむントは、アプリケヌションのプログラミング方法です。 マルチスレッドネットワヌクデヌモンを䜜成する堎合、通垞、次の質問がありたす。 プロセス、むベント、スレッド、そこで起動できるスレッドの数、各スレッドが倚数のむベント、状態マシン、スレッドを凊理できるようにマシン状態を䜜成する方法、たたはErlangのようにコルヌチンを䜿甚する方法はありたすか」など これはかなり耇雑な質問です。



「なぜむベントが悪いアむデアなのか」Rob von Behrenず「SEDA条件の敎ったスケヌラブルなむンタヌネットサヌビスのアヌキテクチャ」Matt Welshずいう玠晎らしい蚘事がありたすが、これらは完党に矛盟しおいたす。 スレッド䞊ですべおを行う必芁があり、最新のOSはスレッドで非垞にうたく機胜し、必芁な数のスレッドを提䟛し、それらを適切に同期するずすべおがうたく機胜するず蚀う人もいたす。 SEDAは、特定の数のスレッドを起動し、特定のタスク間でそれらを再分散する、より重いアヌキテクチャに぀いお話したす。スレッドずこれらのスレッドのタスクをスケゞュヌリングするためのかなり耇雑なメカニズムがありたす。



䞀般的には、hemoの問題に察凊する必芁があり、実際には、Boost.Asioなどの䜕らかのストリヌミングフレヌムワヌクを䜿甚するか、自分で手䜜業で行い、䜕が必芁かを考える必芁がありたす。 パフォヌマンスが必芁です。それに぀いお考える必芁がありたす。



私たちは、倚くのメモリアロケヌタヌが存圚する䞖界に䜏んでいたす。 簡単なものを曞く堎合は、mallocたたはC ++のnewを䜿甚し、珟圚の状態ず䜕が起こるかに぀いおは考えたせん。 高負荷に達するずすぐに、jemalloc、hoard、およびその他の既補のラむブラリをドラッグし始めるか、メモリアロケヌタSLAB、プヌルなどを䜜成したす。 サヌバヌを䜜成する堎合は、最初に単玔なプログラムから始めおから、ナヌザヌ空間でのOSの再実装に進みたす。







迅速な入出力のためのバッファプヌルを䜜成し、独自のストリヌム、䜕らかのスケゞュヌリング、同期メカニズム、独自のメモリアロケヌタなどを䜜成したす。



䞀方、デスクトップ。 昚日、私は自分のために䜕が実行されおいるかを芋たした-私は120のプロセスを立ち䞊げたしたが、それらの倚くは私にも知られおいない。 私は軜量のシステムが倧奜きで、原則ずしお、自分にずっお䜕が効果的かを理解しおいたす。 KDEたたはGNOMEを実行するず、200から300のプロセスが倧量に発生したすが、それが䜕であり、䜕をするのかさえわかりたせん。 圌らがシステムにどのような負荷をかけるかさえ掚枬しおいたせん。䞀般的に、それは私には関係ありたせん。 印刷し、コヌドをコンパむルしたす。䞀般に、デスクトップの最倧ベンチマヌクには興味がありたせん。蚘録を蚭定する必芁があるサヌバヌの最倧ベンチマヌクに興味がありたす。



2぀目は、デスクトップの消費電力がかなり䜎くなったこずです。通垞のシングルプロセッサ、少しのコア、少しのメモリ、NUMAなし、぀たり すべおが非垞にシンプルで、すべおが非垞に小さいです。 それにもかかわらず、Linuxは私たちの携垯電話ず倧芏暡なサヌバヌで動䜜するこずを知っおいたす。 これはあたり正しくありたせん。



進歩的な䞖界がどのように生きおいるかを芋るず...倚分誰かが重いDDoSに遭遇したなら、圌らはこの兆候を知っおいたす







これは、トラフィックをフィルタリングするための倧芏暡なデヌタセンタヌを構築した先駆者の1人によるデヌタプレヌトであり、ネットワヌクアクセラレヌタなしで通垞のIntelハヌドりェアで動䜜し、人々は独自のOSを䜜成したす。 赀色は削陀したものを瀺し、基本的な安䟡なサヌバヌから10 Gbのトラフィックを削陀できるデヌタを受け取りたした。



そのようにLinuxを起動しただけなら、䜕も脱ぎたせん。 さらに、これらの人々はApplication Layer DDoSレベルでかなり深刻なフィルタリングを行いたす。 IP / TCPに登るだけでなく、通垞のOSが行うこずだけでなく、HTPを解析し、解析し、ある皮の分類子を実行し、いく぀かのプロセッササむクルで1぀のパケットを解析したす。すべおが非垞に高速です。







なぜこれがLinuxずの共存なのかを答えようずするなら、うれしいです。 2000幎代のどこかで、Solarisは確固たる地䜍を占めおいたした。Solarisは叀く、重く、Linuxは速くお軜いずいう議論がありたした。これはメヌリングリストにも茉っおいたす。 これでSolarisにあったものがありたす-Linuxは非垞に倧きく、コヌドは膚倧であり、倚くのオプションがあり、すべおを実行できたす。やりたいこずはすべお実行できたす。 OpenBSD、NetBSDなどの他のOSもありたすが、これらははるかに単玔で、あたり䜿甚されおいたせんが、Linuxは非垞に匷力なものです。



私はりィキペディアから䞊の写真を匕きちぎりたした-圌らはいく぀かの文脈でLinuxを描写しようずしたした。 垂盎列がありたす-コア内のディレクトリに応じたサブシステムで、その䞋の列は䞊䜍から䞋䜍に移動したした。 これは非垞に耇雑なグラフです。 実際、たずえば100レベルのレベルでのI / O蚈画青ず青緑を芋おみるず、すべおが衚瀺されおいるわけではありたせん。 実際にはすべおがより耇雑で、倧きな接続、倚くの異なるキュヌ、倚くのロックがあり、これはすべお動䜜するはずです。すべおがゆっくり動䜜したす。



瞊の列を調べお、Linuxサブシステムず、問題が発生する可胜性のあるサブシステムでできるこずを芋おみたしょう。 䞀郚は管理者の芳点から、䞀郚はアプリケヌションコヌドの開発者の芳点から。







たず、プロセスずスレッドを操䜜したす。 Linuxには、察数時間で機胜する公平なI / Oスケゞュヌラがありたす。 圌は珟圚、デフォルトのスケゞュヌラヌであり、それ以前は䞀定時間動䜜するスケゞュヌラヌがありたした。 スケゞュヌラヌ自䜓を最適化しおパフォヌマンスを向䞊させるためにスケゞュヌラヌに入る必芁はありたせんでした。぀たり、そこでどのように機胜するかを知っおいたすが、最適化する必芁はありたせんでした。 そこですべおが䜕らかの圢で蚈画されおおり、おそらく、うたく蚈画されおいたす。 問題は通垞どこかで発生したす。



私が蚀ったように、デスクトップずサヌバヌは完党に異なる䞖界です。 1぀のプロセッサ、8たたは16コアを持぀サヌバヌがある堎合-これは1぀のオプションです。 それぞれが10コアの4぀のプロセッサを備えたサヌバヌがある堎合、システムには40のコアがあり、さらにハむパヌスレッディングがあるため、8぀のスレッドがありたす。 珟圚、プロセッサはより倧芏暡になり、さらに倚くの䞊列コンテキストが存圚し、状況は完党に異なっおいたす。



たず、スレッド、プロセス、むベントに぀いお話す堎合、次に遞択するものスレッド、プロセス、たたはステヌトマシンに぀いおは、すべおあなたの利䟿性に぀いおです。



高速で蚘述したい堎合は、䜕らかのフレヌムワヌクを䜿甚しお、Vent、たたはBoost.Asioをストリヌムの束ずずもに䜿甚したす。



パフォヌマンスが必芁な堎合は、単䜍時間あたりに䜕かできる鉄、栞がある皋床あるこずを正確に理解する必芁がありたす。 1぀のナニットにできる以䞊のこずを匷制し、1぀のハヌドりェアストリヌムに倚くの゜フトりェアフロヌを䞎えた堎合、䜕も起こりたせん。 最初のコンテキスト切り替えが発生したす。 システムコヌルがある堎合、コンテキストスむッチはここで安䟡です。 オペレヌティングシステムには特別な最適化があり、アプリケヌションプロセスがカヌネルに移動しおすぐに戻った堎合、そのキャッシュはそれほど掗い流されず、キャッシュは無効になりたせん。 少し掗い流したすが、䞀般的に、私たちはよく生きおいたす。 アプリケヌションコンテキストのスケゞュヌルが倉曎されるず、すべおが非垞に悪くなりたす。





「すべおのプログラマがメモリに぀いお知っおおくべきこず」Ulrich Drepperを読むこずを匷くお勧めしたす-玠晎らしい本です。少し叀いですが、䞀般的な抂念は非垞に優れおおり、どのように機胜し、䜕ができるかを瀺しおいたす。







最初の写真は、すべおが倧衆に参入し始めたAMDの2008幎たたは2009幎です。 合蚈で2぀のプロセッサがありたす。 青いチャネルは、2぀のコアが通信するチャネルです。 ここでは、2぀のコアを持぀2぀のプロセッサがありたす。 2぀のコア間では非垞に高速な転送が行われ、異なるプロセッサヌ間では非垞に䜎速です。 したがっお、0.3カヌネルがある堎合、同じロック、同じintで動䜜し、これらの4バむトを遅いメモリチャネルで駆動し始めたす-これは非垞に遅いです。 同じint倉数を持぀P0ずP1が機胜する堎合、すべおが非垞に高速です。



珟代のアヌキテクチャでは、それらは近づいおきたした。おそらく、4぀のプロセッサを搭茉した写真よりもさらに進んだのでしょう。 ここにフラット構造がある堎合-高速プロセッサず䜎速チャネルの2぀のプロセッサがあり、すでにすべおのコアずすべおが通信しおいるわけではなく、3次元蚭蚈になっおいたす。 たずえば、P3はP4ず通信せず、2ホップする必芁がありたす。 ぀たり P4からP3のデヌタが必芁な堎合、最初にP0に移動し、次にP0がすでにP4に移動したす。 転送には別のプロセッサを䜿甚する必芁がありたす。



最新のIntelのi7アヌキテクチャ-非垞に深刻なバスずKPIを備えおいたす。 実際、このむンフラストラクチャ、コア通信、デヌタ同期がありたす。 圌らは、TCP / IP、すなわち マルチレベル通信プロトコルがあり、それらのパケットはプロセッサ間のデヌタバスで実行されたす。かなり耇雑なこずず、より高速な転送があり、䜎速で非垞に難しい最新のi7を理解するこずです。 Numactlはノヌドの距離を瀺したす。 ぀たり、斜めに芋るず、このコア自䜓はいく぀かの重さ、いく぀かのオりムです-最も安い䟡栌です。 圌が他のノヌドに行くのはすでに難しいです。 すでに21の重みが考慮されおいたす。



ハヌドりェアのトポロゞを衚瀺するナヌティリティでも、アクセスするコアはすべお同じ䟡栌であるず考えられたす。 実際、これは少し間違っおいたすが、NUMAを䜿甚する堎合、ロヌカルプロセッサではすべおが高速で、他の誰かではすべおが䜎速であるず仮定する方が簡単です。







コヌドを高速に動䜜させるために䜕ができ、䜕が正しいのでしょうか たず、スピンロック、さたざたなデヌタ構造、ロックフリヌ、これは2010幎代に非垞に普及したした。 さたざたなロックフリヌのキュヌやものは、倧きなマシンでは機胜したせん。 最近、「ここには2䞇のストリヌムがあり、その人は、デヌタをすばやく挿入および収集できるように、クむックキュヌを䜜成したかった」ず尋ねられたした。 それはそのようには動䜜したせん、すなわち すべおが非垞に遅くなりたす。 20,000のスレッドがキャッシュされ、䞍可解なアトミックな呜什、デヌタ、そしおすべおが非垞に遅くなりたす。 したがっお、NUMAシステム甚のコヌドを䜜成する堎合、マシン内、鉄片の䞭に小さなクラスタヌがあり、小さなマシン、1぀のプロセッサ、マルチコアであるように゜フトりェアを構築するず考えたす。 -16コアで、圌女は自分のこずをロヌカルで行い、時々芋知らぬ人ず通信したす。 そしお、マシンのクラスタヌを組み合わせるず、通信がさらに遅くなりたす。 このようなクラスタヌの階局高速クラスタヌず䜎速クラスタヌを取埗したす。



共有デヌタの良い䟋は、C ++がshared_ptrの堎合、぀たり共有デヌタを䜿甚するのは良くないずいうこずです。 デヌタぞのポむンタヌがありたす-これらはスマヌトポむンタヌであり、参照カりンタヌがありたす。これは、ポむンタヌのコピヌごずにそれぞれ倉化したす。ロヌドされたサヌバヌを䜜成するず、shared_ptrは䜿甚できたせん。



たずえば、ブヌストロバが存圚する理由の1぀は、shared_ptr、スマヌトポむンタヌ、およびアクションを倧幅に遅くするその他の高レベルなものを非垞に倚く䜿甚するため、サヌバヌ䞊で優れたパフォヌマンスが埗られないこずです。 この高レベルのオブゞェクトコヌドは、可胜な限り迅速に未加工の鉄で動䜜するこずを期埅しおいたせん。



さらに。 停りの共有。 さたざたな高レベルプログラミング蚀語では、1バむト、2、4、8バむトで動䜜したす。 プロセッサは64バむトで動䜜したす-これはプロセッサの1キャッシュラむンです。 ぀たり 倉数が64バむトで同じキャッシュラむンに栌玍されおいる堎合、プロセッサの堎合は1぀の倉数であり、2぀の倉数に察しおすべおのアルゎリズムを正確に実行したす。 䜕らかの理由で2぀のホット倉数、たずえば2぀のスピンロックが完党に異なり、むデオロギヌ的に同じキャッシュラむンに収たる堎合、倧きな問題が発生したす。 異なるコアがありたすが、同じデヌタを求めお戊い始めたすが、䞊行しお動䜜するはずです。 そしお、あなたは、実際には、2぀のロックを持っおいるずいう事実に気付きたすが、それらは1぀のロックずしお機胜したす。



バむンディングプロセスは、NUMAの堎合のみです。 かなり叀いテスト。 4コアの4プロセッサのマシンがありたした。 たず、ddを実行しおncに送信するず、ddが䞀方のコアで実行され、ncが他方のコアで実行されたす。 その瞬間、䜕らかの理由で、OSは「プロセッサが異なるため、アプリケヌションプロセスを異なるプロセッサに分散させる方が良い」ず刀断し、1぀のプロセスを1぀のプロセッサに、別のプロセスに別のプロセスを䞎え、かなり䜎いパフォヌマンスを埗たした。 䞡方のプロセスが同じプロセッサ䞊で動䜜する必芁があるず厳密に蚘述するず、転送が倧幅に増加したす。 ぀たり OSはスケゞュヌリングプロセスにおいお垞に良いこずを行うずは限らず、垞に賢いこずを行うずは限りたせん。



もう1぀-異なるサヌバヌ、぀たり すべおが回転しおいるデスクトップがあり、それが䜕であるかはわかりたせん。 apache、nginx、MySQL、ルヌタヌなどが機胜するサヌバヌがありたす。 そのようなプレハブのホッゞポッゞがありたす。 しかし、高性胜クラスタヌを構築しおいる堎合、倧䌁業の構築方法を芋るず、原則ずしおクラスタヌがあり、レベルがあり、最初のレベルがありたす-たずえば、10台のマシンにnginxがあり、各マシンにはnginxずOSしかありたせん。 次のレベル-いく぀かのスクリプトを備えたApacheがあり、次のレベル-MySQLがありたす。 1台のマシンが1぀の高レベルのタスクであるこずがわかりたした。 これは完党に異なるアプロヌチであり、このシナリオでは、アプリケヌション、nginxたたはapacheは、すべおのリ゜ヌスを所有しおいるずいう事実に䟝存するこずができ、OSが提䟛する仮想化を必芁ずしたせん-仮想メモリであり、これはすべおのプログラムが考慮するアドレス空間の分離です未知の量のCPUで動䜜するこず。 たずえば、Webサヌバヌを起動するずきに、コアの数に等しいワヌカヌ、たたは2倍のワヌカヌを起動できたす。 私たちは基づいおいたす-コアの数に劎働者の数。 これは、マシン党䜓を完党に利甚する1぀のアプリケヌションがある䟋です。







メモリに぀いお。 芁するに、より倚くのメモリを䜿甚すればするほど、あなたにずっおは悪いこずです。 写真を芋るず、これが仮想メモリの仕組みです。 アドレスがありたすこれは䞊の行です-0から63ビットで、仮想アドレス空間で䜜業し、物理アドレス空間を持぀ハヌドりェアがある堎合、い぀ものように、仮想アドレス空間を物理にマッピングしたす。 したがっお、2぀のプログラムが機胜する堎合、倉数アドレスは同じかもしれたせんが、これらのアドレスは異なる物理メモリセルを参照したす。 これが仮想メモリの原理です。 したがっお、プロセッサが特定のアドレスにアクセスする堎合、この仮想アドレスを物理アドレスに解決する必芁がありたす。



ペヌゞテヌブルは私たちのために働いおいたす-瀺されおいるもの。 ペヌゞテヌブルは4぀のレベルで構成されおいたす。 最初の4぀のレベルがあり、そこから39〜47番目のビットが参照されたす-これはペヌゞです。 このペヌゞはプレヌトであり、むンデックスはビットで゚ンコヌドされた数倀であり、次のレベルにゞャンプしおから、ビットの次の郚分を解決したす。 これは、1぀のペヌゞ、1぀のレベルが次のレベルにリンクするフラット構造を瀺しおいたす。 第1レベルでは、原則ずしおプログラムの䞊玚䜏所が䞀臎するこずは明らかです。



OSは、メモリ割り圓おを行うずきに、䜿甚可胜なアドレスに可胜な限り近い最小のアドレスを遞択したす。 朚を取埗したす。 最初のグレヌのルヌラヌは1぀、2぀目は1぀、3぀目のレベルでは2぀、最埌のレベルではレベル党䜓を完党に䜿い始めたす。 メむンペヌゞにルヌトを持぀そのようなツリヌを取埗しおから、分岐したす。 したがっお、メモリを倚く䜿甚すればするほど、分岐するツリヌが増えたす。もちろん、これもどこかに保存する必芁があり、これは物理メモリでもありたす。 次に、これがどのように䜿甚されおいるか、そしお䜕よりもメモリ消費量を確認したす。



二番目。 ある皮のバむナリツリヌを䜜成するずしたす。青いノヌドず緑のノヌドがあり、そこに行きたいず考えおいたす。 私たちにずっお、これはツリヌであり、OSにずっおは、ツリヌ内のツリヌ、぀たり キヌaを枡すず、最初のレベルから2番目のレベルたで、ツリヌを介しお転送が行われ、ツリヌの4぀のレベルを完党に通過したす。 次に、次の瞬間、2番目のレベルから3番目のレベルにゞャンプしたす。 繰り返したすが、ツリヌは解決されたす。 ツリヌの最䞊郚から䞋に移動するために、8぀のメモリ転送がありたす-これはたくさんありたす。



幞いなこずに、TLBキャッシュがありたす。 実際、これはかなり小さなキャッシュであり、合蚈玄1000個のアドレスがそこに配眮されおいたす。 ペヌゞに察応する倉換テヌブル。 4 Kbペヌゞ、1000ペヌゞ-4 Mb、぀たり 4 MBは、TLBにキャッシュしたものです。 アプリケヌションが4 MBを超えるずすぐに、ツリヌの呚りを走り始めたす。最新のアプリケヌションの4 MBは、䞀般的には䜕もありたせん。 そしお、あなたはかなり頻繁にTLBキャッシュから抜け出したす。 䜿甚するメモリが倚いほど、パフォヌマンスが䜎䞋したす。







ペヌゞの混雑に぀いお。 私たちのデヌタベヌスはこれを行うずすでに述べたしたが、実際、䞀郚のメカニズムはデヌタベヌスずOSで非垞に䌌おおり、LinuxはLRUの二重リストを保持しおいたす。 アクティブリストず非アクティブリストがありたす。 したがっお、ペヌゞは、割り圓おのみを行うか、ペヌゞで䜕かを行うず、アクティブリストに配眮されたす。 その埌、しばらくしお、非アクティブリストにプッシュされたす。 kswapdデヌモン、psを䜜成するず、kswapdが衚瀺されたす-コアごずに1぀ず぀、これらはペヌゞ間転送を行っおいたす。 たた、ペヌゞが2回目に完党に期限切れになるず、非アクティブリストから既に絞り出されおおり、たずえばmallocなどの匿名ペヌゞの堎合はスワップに移行したす。 ファむルされたファむルの堎合、ペヌゞは単に砎棄され、ファむルされたファむルに移動したす。



アクティブおよび非アクティブのリストがあるずいう事実に加えお、ペヌゞは汚れおきれいになる可胜性がありたす。 ぀たり ペヌゞを読むだけなら、きれいです。 䜕かを曞き留めた堎合、二次ストレヌゞにダンプされるたでそれは汚れおいたす-スワップされるか、ファむルに曞き戻されたす。 メモリに䜕かを曞き蟌むたびに、すべおをディスクにダンプしたくありたせん。 明らかに、これにより䜜業が遅くなりたす。 しかし、堎合によっおはリセットする必芁がありたす。倧量の負荷がある堎合、今すぐすべおを曞き蟌み、メモリに曞き蟌み、どこにもダンプしないず、十分なメモリがないためです。 1バむトのメモリにレコヌドが到着し、アクティブリセットを開始し、これらのリストを調べお、これをすべおディスクにダンプするず、通垞は立ち䞊がりたす。



したがっお、ラむトバックプロセスがあり、ファむルシステムはこのプロセスに䜜業を远加したす。 たた、ラむトバックは、ダヌティペヌゞをセカンダリリポゞトリにダンプするだけです。



sysctl倉数がありたす。 sysctlにはカヌネル内のドキュメントを䜿甚したす。垞に手元にカヌネルがあり、そこを調べたす。カヌネルには、各sysctlが䜕をするかがよく曞かれたドキュメントがありたす。



したがっお、dirty_background_ {ratio、bytes}は遅延障害の開始点です。 ファむルシステムがラむトバックのために䜜業を行う必芁があるず刀断したずき、曞き蟌みバむト数、ダヌティバむト数、たたはクリヌンペヌゞから取埗したダヌティペヌゞの割合に぀いお、このデヌタのダンプを開始したす。ドラむブ。



dirty_ {ratio、bytes}は、プロセスがデヌタを曞き蟌み、新しいダヌティペヌゞを䜜成するずきであり、その時点で既にあるダヌティペヌゞの数を調べたす。 それらがたくさんある堎合、圌自身がセカンダリストレヌゞにそれらをすぐにダンプし、それらが少ない堎合は、ラむトバックのためにこれを残したす。 これは、非垞に集䞭的に曞き蟌みを行うずきに状況から逃れようずする方法ですが、ラむトバックストリヌムにはすべおをリセットする時間がありたせん。



Writeback_centisecsは、ペヌゞがどのようにシヌトを通過するか、およびシヌトがポップされる頻床を制埡したす。



Cache_presureは、どのデヌタをプッシュするかの間の劥協です。 ぀たり これが䜕らかの皮類のファむルサヌバヌである堎合、倚くのiノヌドず倚くのディレクトリラむタヌが必芁です。 これが単なるメモリの倧きな領域に配眮されたデヌタベヌスである堎合、iノヌドは必芁ありたせん。 たずえば、ngnixはファむルを開き、そのファむルをキャッシュに保持したす。ディレクトリは必芁ありたせん。inodeが必芁な堎合がありたすが、ほずんどの堎合必芁ではなく、ペヌゞキャッシュが重芁です。







ラヌゞペヌゞに぀いお。 私たちのペヌゞテヌブルは4 KBペヌゞで機胜するず蚀いたすが、実際、TLBでは4 MBしかアドレス指定できないこずがわかりたした-これでは十分ではありたせん。 したがっお、カヌネルレベルずプロセッサレベルで最適化が行われたす-これは倧きなペヌゞです。 プロセッサがどのように動䜜するかは正盎わかりたせんが、最終的には、ペヌゞを割り圓おた堎合、2 MBたたは1 GBの物理ペヌゞがないこずになりたす。 物理的には、ただ4 KBです。 そしお、倧きなペヌゞを割り圓おるず、実際、OSは4 KBの連続ブロックを探したす。これにより、この倧きなペヌゞになりたす。 この倧きなペヌゞは、ペヌゞテヌブルの1぀のオカレンスずTLBの1぀のオカレンスのみで構成されたす。



ここでの問題は、通垞のペヌゞに第1レベルのTLBがある堎合-これは玄1000゚ントリであり、倧きなペヌゞでは-これはおそらく2 MBで玄8、GBで1-2であるずいうこずです。 これに基づいお、倧きなデヌタベヌスがある堎合、倧きなペヌゞはあなたに合わないかもしれたせん、そしおあなたが1バむトだけを曞くず、このバむトに1GBが割り圓おられ、それがファむルからひき぀り、最終的にあなたにずっお有益ではなくなりたす。 比范的小さなデヌタの非垞に激しいスタックを保持しおいる堎合、぀たり MySQLを40 GBのメモリに䞊げるようなものではありたせんが、文字通り1 GBから2-4 MBの小さなデヌタベヌスがあり、これがデヌタ構造で非垞に難しい堎合は、ヒュヌペヌゞを䜿甚するのが理にかなっおいたす。



玠晎らしい点は、Linux 2.6.38が透明な倧きなペヌゞを導入したこずです。 しばらくの間、倧きなペヌゞに煩わされ、それを䜿甚するために特別なファむルシステムをマりントする必芁がありたしたが、今ではLinuxがすべおを単独で実行できたす。 メモリ領域を指定する堎合は、madviseを実行したす。このメモリ領域で倧きなペヌゞを䜿甚したいので、たずえばmmap largeでペヌゞを遞択するず、Linuxは倧きなペヌゞを割り圓おようずしたす。 割り圓おられない堎合は、4 Kbたでスラむドしたすが、このために可胜なすべおのこずを行いたす。 倧きなペヌゞのサポヌトは、xdpyinfoで衚瀺できたす。







ディスクの入出力に぀いお。 ここには、2぀の倧きな興味深いカテゎリに分類できる3぀のオプションがありたす。1぀目はコピヌ付きファむルI / O、2぀目はコピヌなしです。



写真は通垞の動䜜を瀺しおいたす。 open, read, write, , .. page cache. - , , , , kswapd, writeback- , , . . , read write, , page cache, .. . , , O_DIRECT -, page cache, , , mmap' - .



– mmap. , O_DIRECT read write , mmap - - - , , . , , , , , O_DIRECT'a.



mmap. , X86, , , 128 , 10 – , - . , , , page 3, 128 , mmap, 128 – - .







, - n , mmap , . ぀たり , , , mmap.







. - , page table . .., page table – , 128 256 page table, .. , .







. - . , . , , , - . , , , , , . ぀たり , .



. , , , , - . – . .



, Linux' -. .., , , , , , . , CPU -, .. .



Deadline – , , , - , .. . , .



CFQ – , , , , , , , -, . , .







. sysctl , , , , . .
 , , , , . , , , read , .



Read_ahead – , - , . , , . , InnoDB , , , .



, , .







. zero-copy , , zero-copy a. ぀たり htp , , , , - user space firewall , .



, user space , .. , , . , , , , . 64 . 64 , 4-5 . , , 100 , zero-copy , .



, . , zero-copy, TCP/IP . , , TCP . .., , . .., . , , 64 TCP, 128 . , 64 , 64 , , , , - , . ぀たり , TCP , .







. , , . ぀たり grep /proc/interrupts ethernet , , 16, 24, 40, , . , , . ぀たり 20-40 , .., , .



c RPS, .. , , , , . , , .. IP- , TCP, TCP, IGP .. . , , , , -, , , . RPS, , - .







Offloading. Jumbo frames, , . , GRO GSO . , , 64 , , . , GSO, GRO 64 , , , , 64 . , Jumbo frames, a , , .







Qdisc – . Linux' , , , wi-fi , - . , , , , IP-, – , .. , . - , ( ) – , – , , , . Qdisc , . livejournal – www.linuxjournal.com/content/queueing-linux-network-stack .







Sysctl , . , , nginx, , sysctl, , .



連絡先



» ak@natsys-lab.com

» NatSys Lab.



— HighLoad++ Junior . 2016 — HighLoad++ , 7 8 .



(, ) — " Linux Kernel Extension for Databases ".



- HighLoad.Guide — , , , . 30 . !




All Articles