Docker Alpine 和 perf 在 docker 容器中相处不融洽

Rev*_*low 3 perf docker alpine-linux

第一件事:

  1. 高山版本 3.9.0
  2. 性能[来自:http: //dl-cdn.alpinelinux.org/alpine/edge/testing ] 4.18.13
  3. Docker 18.09.3 构建 774a1f4

我的 Dockerfile

FROM alpine:latest

# Set the working directory to /app
WORKDIR /app/

# Install any needed packages specified in requirements.txt
RUN yes | apk add vim
RUN echo "http://dl-cdn.alpinelinux.org/alpine/edge/testing" | tee -a  /etc/apk/repositories
RUN apk add --update perf
Run Code Online (Sandbox Code Playgroud)

问题,这些是在容器内运行的命令:

/ # cat /proc/sys/kernel/perf_event_paranoid 
-1
/ # perf stat -d sleep 1
Error:
No permission to enable task-clock event.

You may not have permission to collect stats.

Consider tweaking /proc/sys/kernel/perf_event_paranoid,
which controls use of the performance events system by 
unprivileged users (without CAP_SYS_ADMIN).

The current value is -1:

   -1: Allow use of (almost) all events by all users
       Ignore mlock limit after perf_event_mlock_kb without CAP_IPC_LOCK
 >= 0: Disallow ftrace function tracepoint by users without CAP_SYS_ADMIN
       Disallow raw tracepoint access by users without CAP_SYS_ADMIN
 >= 1: Disallow CPU event access by users without CAP_SYS_ADMIN
 >= 2: Disallow kernel profiling by users without CAP_SYS_ADMIN

 To make this setting permanent, edit /etc/sysctl.conf too, e.g.:

      kernel.perf_event_paranoid = -1

 / # 
Run Code Online (Sandbox Code Playgroud)

启动镜像的命令:

docker run -it --mount type=tmpfs,tmpfs-size=512M,destination=/app/ alpy
Run Code Online (Sandbox Code Playgroud)

我已经与 perf 合作了很长时间。但是,这是第一次。有谁知道为什么 perf 知道我有权进行个人资料,但不允许我这样做?

谢谢你。

Rev*_*low 8

问题是 Docker 默认会阻止系统调用列表,包括 perf_event_open,这是 perf 严重依赖的。

官方 docker 参考:https : //docs.docker.com/engine/security/seccomp/

解决方案:

  • 下载 docker 的标准 seccomp(安全计算)文件。这是一个json文件。
  • 找到“perf_event_open”,只出现一次,删除。
  • 在 syscalls 部分添加一个新条目:

    { "names": [ "perf_event_open" ], "action": "SCMP_ACT_ALLOW" },

  • 将以下内容添加到您的命令中以运行容器:--security-opt seccomp=path/to/default.json

那是为我做的。