さまざまなchrootに対して合計10,000個のバインドマウントを作成する必要があります。約3000-4000回マウントした後は100/sから約5-10/sにかなり遅くなります。私はこれがカーネルで可能な割り当ての奇妙な内部制限に達し、カーネルがインストールごとにそれを拡張する必要があると仮定します。これを事前に改善できる既知のsysctl設定はありますか?
答え1
名前空間の観点から考えると、必要なインストール数を減らすことができます。 chroot環境に使用しているので、各環境に対して複数のインストールを行っているようです。
テンプレート環境を作成して独自のネームスペースにアプリケーションをインストールすることで、これを減らすことができます。
Linux名前空間は2002年2.4.19カーネルで始まりました。
名前空間内で他のプロセスと共有されないマウントを作成できます。したがって、新しい名前空間を起動し、アプリケーションをchroot環境にバインドマウントしてから、その環境にchrootできます。他のアプリケーションでは、最後のインストールを見ることはできません。
各環境に必要なものがわかっていると仮定すると、次のように/etc
/dev
/proc
/sys
/tmp
/bin
テンプレートを作成できます/chroot_env
。
# bind mount
/chroot_env
/chroot_env/etc
/chroot_env/dev
/chroot_env/proc
/chroot_env/sys
/chroot_env/tmp
/chroot_env/bin
# With empty directories
/chroot_env/opt
/chroot_env/opt/app
その後、実際に電話をかける前に、次のことがchroot
できます。
# Start a new shell in a new namespace
unshare --mount
mount --bind /opt/my_app /chroot_env/opt/app
# run the app as a chroot
chroot /chroot_env /opt/my_app
スクリプトでこれを行うには、次のことが必要になる場合があります。
unshare --mount sh -c 'mount --bind /opt/my_app /chroot_env/opt/app && chroot /chroot_env /opt/my_app/run'
つまり/opt/app
、環境ごとに 1 回ではなく、アプリケーションごとに 1 回 (?) だけをインストールするだけです。