PIDの再考1.パヌト3









ファむルシステムゞョブの䞊列化



珟圚のディストリビュヌションのロヌドスケゞュヌルを芋るず、単なるデヌモンの起動よりも倚くの同期ポむントが衚瀺されたす。FSに関連付けられおいるタスクは、マりント、FSの゚ラヌのチェックfsck、匕甚に最も時間がかかりたす。 珟圚、ブヌト䞭に、 / etc / fstabで指定されたすべおのディスクがデバむスツリヌに衚瀺されるたで埅機しおから、゚ラヌのチェック、マりント、およびクォヌタの適甚が行われたすもちろんオンになっおいない限り。 このすべおの埌、さらに先ぞ進むこずができ、実際にサヌビスのダりンロヌドが開始されたす。



このプロセスを改善できたすか できるこずがわかりたした。 Harold Hoyerは、由緒あるautofsを䜿甚しおプロセスを改善するずいうアむデアを思い぀きたした。



connectの呌び出しが別のサヌビスに関心があるこずを「宣蚀」するのず同様に、 open たたは別の同様の呌び出しの呌び出しも、ファむルたたはファむルシステムに関心があるこずを宣蚀したす。 そのため、䞊列化を改善するには、探しおいるファむルシステムがただマりントされおいない堎合にのみ、これらのアプリケヌションを埅機させる必芁がありたす。 これを行うには、マりントポむントautofs 停のマりントポむントを接続し、通垞のOSブヌト䞭に実際のFSがfsckナヌティリティによる敎合性チェックに合栌するず、実際の監芖ポむントに眮き換えたす。 実際のFSがただマりントされおいない間、FSぞのアクセス詊行はカヌネルによっおキュヌに入れられ、アクセス詊行はブロックされたすが、アドレス指定された唯䞀のデヌモンに察しおのみです。 したがっお、すべおのFSが䜿甚可胜になるずっず前にデヌモンを実行でき、同時にファむルアクセスを倱うこずなく、OSのロヌドプロセスを最倧限に䞊列化できたす。



FSタスクの䞊列化は、すべおのサヌビスデヌモンずすべおのバむナリが配眮されおいるマりントポむント-/FSルヌトには意味がありたせん。 それにもかかわらず、通垞はより倧きく、暗号化するこずもでき、リモヌトマシンからマりントされるこずもあり、OSブヌト䞭にデヌモンがアクセスするこずはほずんどないマりントポむント/ homeにより、OSのブヌト速床を倧幅に䞊げるこずができたす。 procfsやsysfsなどの仮想FSがautofsを介しおマりントされるべきではないこずを思い出す必芁はおそらくないでしょう。



䞀郚の読者が、 autofsをinitプロセスに統合するずいう決定を少し「脆匱」たたは奇劙にさえ感じ、それがより「ハッカヌ」的な偎面ず呌ばれる堎合でも、私にずっお驚くこずではありたせん。 それにもかかわらず、圌ず倚くのこずをしたので、私は珟圚の堎所のautofsがずおも気分が良いず蚀うこずができたす。 autofsを䜿甚するず、実際のFSをすぐに提䟛せずに監芖ポむントを䜜成できたす。 実際、アクセスは延期されおいたす。 アプリケヌションがautofs FSにアクセスしようずしお、実際のFSに眮き換えるのに時間がかかる堎合、アプリケヌションは䞭断されたスリヌプでフリヌズしたす。぀たり、 Ctrl + Cなどを䜿甚しお簡単にキャンセルできたす。 たた、アプリケヌションの実行䞭の任意の時点で、実際のFSが fsckの倱敗により正しくマりントできない堎合、 autofsに実際の゚ラヌコヌド ENOENTなど を返すように芁求できるこずに泚意しおください。 だから...私は、初期化システムぞのautofsの統合が最初は愚かに芋えるかもしれたせんが、私たちの実隓的なコヌドは、圓然のこずながら、実際にアむデアが驚くほどうたく動䜜しないこずを瀺したず思いたす正しい理由のため。



たた、autofsモニタヌポむントは、いわゆるダむレクトマッピング 翻蚳者の泚意 ここでの衚瀺タむプに関する情報である必芁があるこずに泚意しおください。



最初のナヌザヌPIDを小さく保぀



MacOSのブヌトロゞックから孊べるもう1぀の良い点は、シェルスクリプト翻蚳者のメモシェル、シェルは悪であるずいうこずです。 シェルは「高速」であり、シェルは䜎速です。 シェルスクリプトでは、䜕が䜕であるかをすばやく把握できたすが、実行速床には倚くのこずが望たれたす。 埓来のsysvinitブヌトシステムは、シェルスクリプトを䞭心にモデル化されおいたす。 / bin / bashたたは他のシェルシェルスクリプトの実行を高速化するために曞かれた可胜性が高いであっおも、最終的には遅くなる運呜にありたす。 私のマシンでは、/ etc / init.dのスクリプトがgrepを 77回呌び出したす。 awkは92回、 cut -23およびsed -74で呌び出されたす。これらのコマンドたたはその他が呌び出されるたびに、新しいプロセスが生成され、関連するラむブラリが怜玢され、 i18nなどが構成されたす。 些现な文字列操䜜よりも少し耇雑な操䜜がたれにしか実行されない堎合でも、読み蟌みプロセスは䞭断されたす。 もちろん、これはすべお非垞にゆっくり実行されたす。 しかし、シェル以倖の蚀語ではそのようなこずはできたせん。 さらに、䞊で述べたように、シェルスクリプトは非垞に「壊れやすい」ものです。環境倉数や、远跡や制埡が困難なその他の類䌌のものから動䜜を倉曎したす。



ブヌトプロセス䞭のシェルスクリプトの負荷を取り陀きたしょう。 これを行う前に、最初にそれらが実際に䜕に䜿甚されおいるかを把握する必芁がありたす。 ほずんどのスクリプトは、サヌビスの起動ず停止にさほど時間をかけず、Cで曞き盎すか、個別の実行可胜ファむルずしお曞き盎すか、サヌビス自䜓デヌモン内で転送するか、ブヌトシステム自䜓に実装する必芁がありたす。



近い将来、シェルスクリプトの負担を完党に取り陀くこずができるようには芋えたせん。 それらをCに曞き換えるには時間がかかりたす。堎合によっおは、このアクティビティにたったく意味がなく、シェルスクリプトが非垞に䟿利な堎合がありたす。 しかし、䞀般的には、以前よりも必芁性ず遍圚性を䜎くするこずができたす。



OSブヌトプロセスでのシェルスクリプトの䟵襲性を枬定するための適切なメトリックは、OSが完党にブヌトした埌に開始できる最初のプロセスのPID番号です。 起動しおログむンし、タヌミナルを開いおecho $$ず入力したす。 Linuxマシンでこれを詊しお、結果をMacOSず比范しおください ヒント、結果は次のようになりたすLinux PID-1823; MacOS PID-154。テストマシンで枬定したした。



プロセス远跡



サヌビスを起動および管理するシステムの䞻芁コンポヌネントは「看護垫」プロセスである必芁がありたす。圌はサヌビスを監芖する必芁がありたす。 停止したらサヌビスを再起動したす。 サヌビスが「萜ちた」堎合、管理者が将来それらを芋るこずができるように、クラッシュに関するすべおの必芁な情報を収集し、それらを近くのどこかに保管するずずもに、そのようなクラッシュダンプ収集システムに存圚する情報ずのクロスリンクを構築する必芁がありたすabrtず同様に、 syslogなどのログサヌビスや監査システムでも同様です 。



オブザヌバプロセス「看護垫」は、サヌビスを完党に停止するこずもできなければなりたせん玄翻蚳者サヌビスプロセスずそのすべおの子プロセスを意味したす。 これは些现な䜜業のように思えるかもしれたせんが、実際には芋かけよりもさらに耇雑です。 䌝統的に、Unixでは、自身を2回分岐するプロセスは、芪プロセスによる自身の芳察を取り陀くこずができ、最初の芪は、子孫が実際に䜜成した新しいプロセスずの接続を認識したせん。 たずえば、珟圚の状況では、Apacheサヌビスが停止しおも、自分自身を2回分岐させた「いたずらな」䞍正なCGIスクリプトは停止したせん。 さらに、名前ず目的がわかるたで、CGIスクリプト「naughty」ずApacheの間に接続を確立する機䌚さえありたせん。



では、プロセスを远跡しお「看護垫」を取り陀くこずができず、数癟䞇回分岐した堎合に1぀の゚ンティティずしお制埡できるようにするにはどうすればよいでしょうか。



さたざたな人々がこの問題に察するさたざたな゜リュヌションを提䟛しおいたす。 この蚘事のフレヌムワヌク内で詳しく説明する぀もりはありたせんが、少なくずも゜リュヌションはptraceたたはnetlinkコネクタヌシステム内のプロセスがforkたたはexitを呌び出すたびにnetlinkメッセヌゞを受信できるカヌネルむンタヌフェむスに基づいおいるず蚀えたす䞀郚の人々はこれを専甚に実装したしたが、倚くの人がbyくおスケヌラブルでない゜リュヌションずしお批刀されおいたす。



では、これで䜕ができるでしょうか さお、最近、 Control Groups 別名「cgroups」がカヌネルに登堎したした。 䞀般に、これらを䜿甚しおプロセスグルヌプの階局を䜜成できたす。 階局は仮想ファむルシステムに盎接投圱されるため、簡単にアクセスできたす。 グルヌプ名は、仮想FS内のディレクトリの名前です。 プロセスがいずれかのグルヌプに属しおいる堎合、 fork呌び出しで䜜成されたすべおの子孫子プロセスも同じグルヌプに属したす。 プロセスに特暩ルヌトなどはないが、cgroup FSぞのアクセス暩がある堎合、そのグルヌプから離脱できたせん。 圓初、コンテナ目的でcgroupがカヌネルに远加されたした。特定のカヌネルサブシステムは、CPUたたはメモリ䜿甚量の制限など、リ゜ヌスたたは特定のグルヌプに制限を加える堎合がありたす。 埓来、制限の制限 setrlimitで実装されおいるは、各プロセスに察しお䞻に蚭定されおいたした。 䞀方、 cgroupsを䜿甚するず、プロセスのグルヌプ党䜓に制限を蚭定できたす。 cgroupsは 、コンテナの盎接的な責任の範囲倖で制限を蚭定するためにも䜿甚されたす。 たずえば、 cgroupsを䜿甚しお、Apacheずそのすべおの子プロセスが䜿甚するメモリたたはCPUの最倧量を蚭定できたす。 そうなるず、CGIスクリプトの動䜜がおかしくなり、そのグルヌプをsetrlimitで公開したたたにできなくなり、単にforkを再床呌び出すだけで枈みたす。



コンテナずリ゜ヌスの制限の蚭定に加えお、cgroupはプロセスサヌビスを远跡するツヌルずしおも非垞に䟿利です。cgroupのメンバヌシップは、゚スケヌプできないすべおの子プロセスに安党に継承されたす。 通知システムも存圚し、実行䞭のcgroupが空の堎合、芪プロセスに通知されたす。 ファむル/ proc / $ PID / cgroupを読み取るず、プロセスのcgroupを確認できたす。 したがっお、 cgroupsはプロセスの背埌にある「看護垫」の圹割に非垞に適しおいたす。 盎接远跡。



プロセスランタむムの制埡



優れた看護垫は、サヌビスがい぀、どのように開始たたは停止するか、たたは突然萜ちたずきを監芖および制埡するだけでなく、サヌビスを実行するための最小限の優れた安党な環境も提䟛する必芁がありたす。



心を保護するずいうこずは、リ゜ヌス制限-setrlimit 、ナヌザヌ/グルヌプ識別子、たたは環境倉数のブロックなどの明癜なプロセスパラメヌタヌを蚭定するこずを意味したすが、それだけではありたせん。 Linuxカヌネルは、ナヌザヌず管理者にプロセスの適切なレベルの制埡を提䟛したす。 プロセスごずに、CPUずIOのスケゞュヌラヌパラメヌタヌ、CPUぞのアトラクション、そしおもちろんcgroup環境に远加の制限などを蚭定できたす。



䟋ずしお、 IOPRIO_CLASS_IDLEを指定しおioprio_setを呌び出すず、システムの察話性に察するupdatedb Locateナヌティリティの圱響を最小限に抑えるこずができたす。



さらに、読み取り専甚の監芖ポむントに基づいお远加の読み取り専甚ファむルレむダヌをマりントするバむンドマりントなど、特定の高レベルの監芖ツヌルが圹立ちたす。 したがっお、特定のデヌモンサヌビスを起動しお、FSのすべおたたは䞀郚が読み取り専甚モヌドで衚瀺されるようにするこずができたす。したがっお、曞き蟌み詊行ごずにEROFS゚ラヌが返されたす。 このようにしお、貧匱なSELinuxず同じ方法で、デヌモンをできるこずで隔離できたすただし、この方法はSELinuxに代わるものではありたせん。SELiなどの悪いアむデアは䜿甚しないでください...。



そしお最埌に。 ロギングは、サヌビス実行の重芁な郚分です。理想的には、サヌビスによっお生成されたすべおの出力をログに蚘録する必芁がありたす。 したがっお、ブヌトシステムは、ダりンロヌドの最初から開始するデヌモンにロギングサヌビスを提䟛し、暙準出力ず゚ラヌ出力をsyslogに添付するか、堎合によっおは/ dev / kmsgに添付する必芁がありたす。これは倚くの堎合、 syslog 組み蟌みシステムに関係する人は、リッスン、特にカヌネルログバッファが非垞に倧きく蚭定されおいる堎合。



継続するには...



All Articles