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

Лучший способ использовать Perf в программе в Kubernetes / Docker?

Я использую Kubernetes на CentOS 7, и мне кажется, что версия perf знает пространство имен.

Если запустить perf для PID на хост-узле (хост-узел найден с kubectl describe pods --namespace) Я получаю сообщение о том, что символы не найдены. Это похоже на то, что он ищет путь к файлу относительно контейнера, но в файловой системе хост-узла.

Если я скопирую exe (Go exe, который включает символы) на ожидаемый путь на хост-узле (либо с kubectl cp ..., или найдя файл под overlay2 в /var/lib/docker) затем perf top -p <pid> работает с хост-узла, так как он может найти те же символы, которые соответствуют исполняемому файлу в контейнере.

Есть ли способ лучше / чище? perf против процесса, запущенного в контейнере с хостом CentOS 7?

Ссылки:

Начиная с Kubernetes 1.17 возможно Совместное использование пространства имен процессов между контейнерами в модуле. Похоже, это то, что вы ищете.

Совместное использование пространства имен процессов включается с помощью поля shareProcessNamespace v1.PodSpec. Например.:

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  shareProcessNamespace: true
  containers:
  - name: nginx
    image: nginx
  - name: shell
    image: busybox
    securityContext:
      capabilities:
        add:
        - SYS_PTRACE
    stdin: true
    tty: true

Документы Kubernetes, на которые я ссылаюсь, дают немного больше подробностей о том, как работать с этим подходом.