現在、Go 言語の主な応用分野の 1 つは、コンテナ (Docker に代表される)、Kubernetes、Prometheus などを含むクラウド ネイティブ テクノロジーです。後ほど、クラウド ネイティブ テクノロジー スタックの主要テクノロジーを紹介する一連の記事を書く予定です。 過去 2 年間、多くの大企業にとって主要な技術的方向性の 1 つは、アプリケーションをクラウドに移行することでした。このプロセスにおける典型的な誤用は、コンテナを仮想マシンとして使用し、コンテナ内で一連のプロセスを開始することです。ただし、コンテナと仮想マシンのプロセス管理機能には大きな違いがあります。コンテナでも仮想マシンでも、プロセス番号 1 が存在します。仮想マシンでは systemd プロセスであり、コンテナではエントリポイントの起動プロセスです。その後、他のすべてのスレッドはプロセス番号 1 の子プロセス、または子プロセスの子プロセスとなり、これを再帰的に繰り返します。ここでの主な違いは、systemd プロセスがゾンビ プロセスをリサイクルできるかどうかです。より多くのコンテナ技術の専門家とコミュニケーションを取りたい場合は、私の WeChat liyingjiese を追加し、「グループに参加」と記入してください。このグループは、世界中の大手企業のベストプラクティスと業界の最新動向を毎週報告しています。
ゾンビプロセス ゾンビ プロセスといえば、Linux システムにおけるプロセスの状態について簡単に説明します。 ps や top などのコマンドを使用して、システム内のプロセスを表示できます。たとえば、ecs 仮想マシンで ps aux を実行すると、次の出力が得られます。
最初のものは、先ほど説明したプロセス No. 1 systemd であることがわかります。 STAT 列はプロセスのステータスです。ここでのステータスはすべて S に関連していますが、通常は R、D、Z などのステータスもあります。各ステータスの意味を簡単に説明すると次のようになります。
ゾンビプロセスに関しては、ここで議論を続けましょう。通常の使用では、子プロセスを作成するには、通常、親プロセスがシステム コール wait() または waitpid() を介して子プロセスが終了するのを待機し、子プロセスのリソースを再利用する必要があります。この方法に加えて、リサイクルは非同期的に実行することもできます。この方法の基本は、子プロセスが終了した後、親プロセスに SIGCHLD シグナルを送信することです。これに基づいて、親プロセスは子プロセスのリソースをリサイクルするための SIGCHLD シグナル処理関数を登録します。これら 2 つの方法を覚えておいてください。それらについては後で説明します。 ゾンビ プロセスの最大の害は、プロセス番号などのリソースが永続的に占有されることです。システムには最大プロセス数 n の制限があり、プロセス番号 1 から n が占有されると、システムはプロセスとスレッドを作成できなくなります (OS では、プロセスとスレッドは同じデータ構造 task_struct で表されます)。この時点で、ユーザーの直感では、シェルはコマンドを実行できないと感じます。その理由は、シェルコマンド実行の本質は fork だからです。
孤立したプロセス 前述したように、子プロセスが親プロセスより先に終了し、親プロセスが子プロセスの残りのリソースをリサイクルしない場合は、ゾンビ プロセスが生成されます。ここに別の状況があります。親プロセスが子プロセスより先に終了した場合、子プロセスのリソースを誰が再利用するのでしょうか? 親プロセスは子プロセスより先に終了します。この時点で、まだ実行中の子プロセスを一般に孤立プロセスと呼びます。ただし、実際には孤立プロセスの明確な定義はなく、そのステータスは上記で説明したいくつかのプロセス状態のままです。では、孤立プロセスのリソースを誰が回収するのでしょうか?この状況に対応して、Unix 系システムでは、これらの孤立プロセスの親プロセスをプロセス番号 1、つまり systemd プロセスに設定し、systemd は孤立プロセスのリソースを再利用します。 シングルプロセスモデルの本質 上記の 2 つのセクションを読んだ後、仮想マシンまたは完全な OS がゾンビ プロセスを回避する方法がわかるはずです。ただし、コンテナでは、プロセス 1 が一般にエントリ ポイント プロセスになります。コンテナは、ゾンビプロセス処理を回避するために、孤立プロセスの親プロセスをプロセス番号 1 に設定する上記の方法を処理できません。これにより、孤立プロセスなどの異常なシナリオでは、コンテナ内のゾンビプロセスを完全に処理できないというジレンマが発生します。 したがって、コンテナの単一プロセス モデルの本質は、コンテナ内のプロセス 1 には、複数のプロセスや複数のスレッドなどの複雑なシナリオを管理する機能がないことです。これらの複雑な状況をコンテナ内で処理する必要がある場合、開発者はエントリ ポイント プロセスにこの機能を提供する必要があります。これにより、開発者の精神的負担が増大することは間違いありません。これは、一般的なテクノロジーやプラットフォーム フレームワークが望まない恥ずかしい状況です。 回避方法 開発者がエントリポイント プロセスに複数のプロセスを管理する機能を与えることについてのセクション 2 での説明に加えて、これを行うには Kubernetes を使用することをお勧めします。今では誰もコンテナを手動で管理していないと思います。ほとんどの人はコンテナ オーケストレーションおよびスケジューリング ツール Kubernetes に目を向けています (まだ Swarm を使用している人には、できるだけ早く暗闇を捨てて光に参加することをお勧めします :))。 Kubernetes では、複数のコンテナを Pod にオーケストレーションし、同じ Linux NameSpace を共有できます。この技術の本質は、Kubernetes を使用して一時停止イメージを提供することです。詳しく説明すると、一時停止イメージを使用して最初に NameSpace をインスタンス化し、次に他のコンテナーをこの NameSpace に追加して NameSpace の共有を実現します。突然、これにはコンテナと名前空間の技術的な背景が必要であることに気付きました。スペースが限られているため、この技術的な背景についてはご自身で調べていただければ幸いです。あるいは、次の記事でコンテナ技術の本質について論じるつもりです。 では早速、一時停止について紹介しましょう。 Pause は、Kubernetes バージョン 1.16 で導入されたテクノロジーです。 pause を使用するには、次のように、Pod によって作成された yaml で shareProcessNamespace パラメータを true に指定するだけです。
ポッドを作成する:
Pod に接続し、ps を使用してプロセス リストを表示します。
Pod 内のプロセス 1 が /pause になり、他のコンテナのエントリポイント プロセスがプロセス 1 の子プロセスになることがわかります。ここで、問題の核心に迫ります。/pause プロセスは、ゾンビ プロセスを回避するために、どのようにして孤立プロセスの親をプロセス 1 に設定するのでしょうか。ソースコードを見てみましょう。git リポジトリ: pause.c:
35 行目と 13 行目に特に注意してください。これが上で説明した内容です。
SIGCHLD シグナル処理関数の中核は、 while (waitpid(-1, NULL, WNOHANG) > 0) の行です。ここで、WNOHANG パラメータは、親プロセスがブロックせずに直接戻ることを可能にします。 要約する コンテナ化への変革への道のりは非常に長いです。変換プロセス中、多くのビジネス関係者は、思考の慣性によりコンテナを仮想マシンとして使用したいと考えますが、これにより多くの問題が発生する可能性があります。おそらく、より良い実践のために、いくつかのコンテナ設計パターンを検討することができるでしょう。 |
<<: クラウド コンピューティングによる混乱を経験している 3 つのホットな市場はどれですか?
>>: IBM はハイブリッド クラウドでクラウド コンピューティングの状況を変えることができるでしょうか?
公開アカウントであっても、親アカウントであっても、コンテンツが王様であるというルールは依然として適用...
パスカルは人間は考える葦であると言った。これは、人間の尊さと価値を強調する儒教の「人間本位」の考えと...
私はSEOを半月以上やっています。今やっている仕事はSEO業界の最も基本的で簡単な仕事に過ぎず、まだ...
Taobao 検索ランキングの最適化は、Taobao SEO とも呼ばれ、Taobao ストアを開設...
ウェブサイトの最適化の過程で、ウェブサイトのランキングが変動する原因に遭遇することはよくありますが、...
他のウェブマスターと話し合った結果、Xiaomao は、新しいウェブサイトを構築した友人たちが皆、ウ...
WeChat 5.0のリリースは、最近比較的大きなニュースです。コミュニケーション機能から始まった製...
「EU Rebate Network」のスクリーンショット。完全に英語で書かれているので、かなり威圧...
ご存知のとおり、電子商取引ネットワーク マーケティングの発展に伴い、企業の Web サイトは徐々にイ...
適切なクラウド データベースを導入すると、クラウドからモバイル、エッジに至るまで、企業が依存するさま...
平日の午前 3 時、ある会社の AIops ツールは、ネットワーク トラフィックが飽和点に達したこと...
クラウドネイティブ時代において、国内外の多くのクラウドベンダーが強力な技術的配当をリリースしています...
[[347277]] 「Read the Papers」は、コンピューターおよびソフトウェア エンジ...
4月25日、百度幹部の李氏は再び外部リンクに関する声明を発表した。百度のアルゴリズム更新に伴い、百度...
インターネット企業を経営している方なら、Baidu、Google、Yahoo などの検索エンジンでウ...