在 Kubernetes/Docker 中的程序上使用 Perf 的更好方法?

Kyl*_*ndt 5 linux docker centos7 kubernetes perf

我在 CentOS 7 上运行 Kubernetes,似乎该版本不perf支持命名空间。

如果在主机节点(使用 找到的主机节点kubectl describe pods --namespace)上的 PID 上运行 perf,我会收到有关未找到符号的错误。这似乎是因为它在主机节点的文件系统上查找相对于容器的文件路径。

如果我将 exe(包含符号的 Go exe)复制到主机节点上的预期路径(使用kubectl cp ...,或通过在 中的 override2 下查找文件/var/lib/docker),则perf top -p <pid>可以从主机主机节点工作,因为它可以找到与匹配容器中的exe。

是否有更好/更干净的方法来运行perf在具有 CentOS 7 主机的容器中运行的进程?

参考:

小智 1

从 Kubernetes 1.17 开始,可以在 Pod 中的容器之间共享进程命名空间。看来这就是您正在寻找的。

使用 v1.PodSpec 的 shareProcessNamespace 字段启用进程命名空间共享。例如:

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
Run Code Online (Sandbox Code Playgroud)

我链接的 Kubernetes 文档提供了有关如何使用这种 sidecar 方法的更多详细信息。