Linux(커널) 네임스페이스에 대한 현재 이해는 다음 조건 중 하나가 충족되는 한 생성 후 수명 주기가 지속된다는 것입니다.
- 하나 이상의 프로세스/스레드가 네임스페이스 X에 조인(연결, ...)되었습니다.
- 네임스페이스 X에 대해 하나 이상의 바인드 마운트가 있습니다.
- 네임스페이스 X를 참조하는 열린 fd가 하나 이상 있습니다.
- 사용자/PID 네임스페이스의 경우: X에 하나 이상의 하위 네임스페이스 Y가 있습니다.
나는 위의 조건이 더 이상 유지되지 않으면 Linux 커널이 "가능한 한 빨리" 네임스페이스를 파괴할 것이라고 순진하게 믿었습니다. 그러나 네임스페이스가 더 이상 사용되지 않고 손상되기까지 약간의 지연이 있다는 것을 알았습니다. 제 기억이 맞다면 그렇습니다.
다음의 작은 Python3 스크립트는 일련의 새로운 네트워크 네임스페이스를 생성하고 각 네임스페이스에 즉시 들어가며 이전 네임스페이스는 남겨 둡니다. 다른 프로세스와 스레드는 이전에 생성된 네트워크 네임스페이스에 대한 참조를 보유하지 않으므로 오래되고 결국 사라지게 됩니다. 간접적인 신호는 네임스페이스 inode 번호가 재사용된다는 것입니다.
이제 스크립트가 "임시" 네트워크 네임스페이스를 두 가지 순서로 생성하는 방법에 주목하세요. 한 번은 유휴 시간이 많은 느린 방식으로, 한 번은 빠른 방식으로 생성됩니다.
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 번호가 재사용되지 않고 "쌓이는" 것으로 알 수 있듯이 사용되지 않는 네임스페이스는 파괴(가비지 수집)되지 않는 것처럼 보입니다.
아이노드 번호의 재사용을 기반으로 네임스페이스가 파괴된 시기를 간접적으로만 추론할 수 있다는 점에 유의하세요. 이것은 잘못된 가정일 수도 있습니다.
Linux 커널 지식이 있는 사람이 Linux의 동작, 즉 커널이 실제로 네임스페이스를 언제 파괴하는지에 대해 더 많은 정보를 제공할 수 있습니까? 파기가 연기되는 경우 이 "가비지 수집"에 고유한 세분성이 있습니까?
답변1
첫 번째,"NSFS 파일 시스템이란 무엇입니까?"에 대한 답변입니다.Linux 커널이 네임스페이스 수명주기를 관리하는 방법에 대한 추가 설명: proc 파일 시스템 내부에 도입된 소위 "nsfs" 파일 시스템을 사용합니다. 따라서 이 질문에 언급된 요소 중 하나에서 해당 아이노드를 더 이상 참조하지 않으면 네임스페이스는 소멸될 준비가 된 것입니다.
네트워크 네임스페이스는 파괴(정리) 측면에서 특히 복잡한 것으로 나타났습니다. 네트워크 네임스페이스 관리는 다음과 같습니다.넷/코어/net_namespace.c.
한가지 눈길을 끄는 것은네트워크 네임스페이스를 정리하는 데 사용되는 작업 대기열 정의:
static DECLARE_WORK(net_cleanup_work, cleanup_net);
작업 대기열(linux-kernel-labs.github.io Lab)은 잠재적으로 차단되는 작업이 프로세스 컨텍스트에서 실행되도록 예약하기 위해 여러 곳에서 사용됩니다. 그런 다음 네트워크 네임스페이스 정리는 다른 작업 대기열도 제공하는 커널 작업자 스레드에 의해 처리됩니다. Linux 커널 문서도 참조하세요.동시 관리 작업 대기열(cmwq)작업 대기열 배경 정보에 대해 자세히 알아보세요.
다른 네임스페이스 관리 구현을 간략하게 살펴보겠습니다(사용fs/proc/namespace.c좋은 사람으로서,잘, 특정 구현에 대한 트램폴린)은 네임스페이스 정리를 위해 작업 대기열을 사용해야 함을 나타내지 않습니다.