Назад | Перейти на главную страницу

Странная проблема с переключением сетевого пространства имен Linux

Я пишу малый экспортер прометея в Перейти, чтобы опубликовать сетевые метрики для контейнеров докеров.

Существует горутина, которая собирает значения следующим образом:

1. Get all docker containers using docker SDK
2. Locks the goroutine in its current thread
3. Remembers current namespace
4. For each container
4.1. Switches network namespace into the contanier's one (setns() syscall)
4.2. Reads the file /proc/net/netstat
4.3. Parses the contend and makes it available in a shared map
5. Restores the namespace to the remembered one

Обработчик запросов сервера ищет общую карту и форматирует данные в метриках Prometheus.

Проблема в том, что он работает так, как ожидалось, примерно в 5 раз. 20% случаев, и кажется, что переключатель пространства имен не работает должным образом, как если бы переключение пространства имен было выполнено асинхронно, или содержимое файла / proc / net / netstat где-то кэшируется. В остальное время содержимое / proc / net / netstat находится из «корневого» (или начального) пространства имен или прикрепляется к одному из пространств имен докеров.

Есть предложения, где я мог бы посмотреть дальше, чтобы он работал надежно? Я озадачен таким поведением.

РЕДАКТИРОВАТЬ: лучшая формулировка

Хорошо, похоже, я упустил из виду важную деталь страница руководства по procfs:

/proc/net
         [...]

          With the advent of network namespaces, various information
          relating to the network stack is virtualized (see
          network_namespaces(7)).  Thus, since Linux 2.6.25, /proc/net
          is a symbolic link to the directory /proc/self/net, which con‐
          tains the same files and directories as listed below.  How‐
          ever, these files and directories now expose information for
          the network namespace of which the process is a member.

Таким образом, похоже, что сетевая статистика для каждого процесса, и изменение пространства имен NW одного потока, принадлежащего определенному процессу, не отражается в файле / proc / net / netstat.