Linuxはいつ名前空間を「ガベージコレクション」しますか?

Linuxはいつ名前空間を「ガベージコレクション」しますか?

Linux(カーネル)ネームスペースの現在の理解は、次のいずれかの条件が満たされている限り、作成後にライフサイクルが持続することです。

  • 1つ以上のプロセス/スレッドが名前空間Xに結合(接続、...)されました。
  • 名前空間Xには1つ以上のバインドマウントがあります。
  • 名前空間Xを参照する1つ以上のオープンfdがあります。
  • ユーザー/PID 名前空間の場合: X に 1 つ以上の子名前空間 Y があります。

私は上記の条件がもはや維持されなければ、Linuxカーネルが「できるだけ早く」名前空間を破壊すると信じていました。しかし、名前空間が使用されなくなり、破損するまで少し遅れがあることがわかりました。私の記憶が正しいなら、そうです。

次の小さなPython3スクリプトは、一連の新しいネットワーク名前空間を作成し、各名前空間にすぐに入り、古い名前空間を残します。他のプロセスとスレッドは、以前に作成されたネットワーク名前空間への参照を保持しないため、古くて最終的に消えます。間接的なシグナルは、名前空間のinode番号が再利用されることです。

スクリプトが「一時」ネットワーク名前空間を2つの順序で生成する方法に注意してください。一度はアイドル時間が多い遅い方法で、一度は速い方法で生成されます。

import unshare
import os
import time

def trash(delay):
        for i in range(4):
                unshare.unshare(unshare.CLONE_NEWNET)
                print('trash net:[%d]' % os.stat('/proc/self/ns/net').st_ino)
                time.sleep(delay) # wait for penguins to collect garbage namespaces

# user namespaces can be created by unprivileged processes
# (unless on mispatched Debian kernels): this gives us all
# capabilities inside this new user namespace owned by our
# user, so we can create other namespaces.
unshare.unshare(unshare.CLONE_NEWUSER)
print('original net:[%d]' % os.stat('/proc/self/ns/net').st_ino)

print('slow trashing...')
trash(0.5)

time.sleep(0.5)
print('fast trashing...')
trash(0.01)

実行すると、出力は次のようになります。

$ python3 nsgarbage.py
original net:[4026531905]
slow trashing...
trash net:[4026532268]
trash net:[4026532344]
trash net:[4026532268]
trash net:[4026532344]
fast trashing...
trash net:[4026532268]
trash net:[4026532419]
trash net:[4026532494]
trash net:[4026532569]

0.5秒遅延の遅い順序で、使用されていないネットワーク名前空間が破壊され、対応するiNode番号が再利用されることを確認してください。新しく作成されたネットワーク名前空間のアノード番号が振動します。

対照的に、クイックシーケンスの場合、inode番号が再利用されず、「積み重ねられる」ことがわかるように、未使用の名前空間は破壊(ガベージコレクション)されないように見えます。

アイノード番号の再利用に基づいて、名前空間が破壊された時期を間接的にのみ推論できることに注意してください。これは間違った仮定かもしれません。

Linuxカーネルの知識のある人がLinuxの動作、つまりカーネルが実際に名前空間をいつ破壊するかについて、より多くの情報を提供できますか?破棄が延期された場合、この「ガベージコレクション」に固有の粒度はありますか?

答え1

まず、「NSFSファイルシステムとは何ですか?」への回答です。Linuxカーネルがネームスペースライフサイクルを管理する方法の追加の説明:procファイルシステム内に導入されたいわゆる「nsfs」ファイルシステムを使用します。したがって、この質問に記載されている要素の1つで対応するiノードを参照しなくなった場合、名前空間は消滅する準備が整いました。

ネットワーク名前空間は、破壊(整理)の観点から特に複雑であることがわかりました。ネットワーク名前空間の管理は次のとおりです。ネット/コア/net_namespace.c

一つ目を引くのはネットワーク名前空間をクリーンアップするために使用されるジョブキューの定義:

static DECLARE_WORK(net_cleanup_work, cleanup_net);

ジョブキュー(linux-kernel-labs.github.io Lab) は、潜在的にブロックされるジョブがプロセスコンテキストで実行されるようにスケジュールするために複数の場所で使用されます.その後、ネットワーク名前空間のクリーンアップは、他のジョブキューも提供するカーネルワーカースレッドによって処理されます。 Linuxカーネルのドキュメントも参照してください。同時管理ジョブキュー(cmwq)ジョブキューの背景情報の詳細をご覧ください。

他の名前空間管理の実装を簡単に見てみましょう(使用fs/proc/namespace.c良い人として、よく、特定の実装のためのトランポリン)は、名前空間クリーンアップに作業キューを使用する必要があることを示していません。

関連情報