操作步骤
1、在容器中集成了arthas诊断和调试工具,想生产火焰图,执行profiler start,报错
如下:
[arthas@1]$ profiler start
AsyncProfiler error: Can not find libasyncProfiler so, please check the arthas directory.
2、发现alpine基础镜像中缺乏libstdc++.so.6库,于是按照提示安装libstdc++,容器中执行命令apk add libstdc++,报错如下:
/home # apk add libstdc++
fetch http://dl-cdn.alpinelinux.org/alpine/v3.12/main/x86_64/APKINDEX.tar.gz
ERROR: http://dl-cdn.alpinelinux.org/alpine/v3.12/main: IO ERROR
WARNING: Ignoring APKINDEX.2c4ac24e.tar.gz: No such file or directory
fetch http://dl-cdn.alpinelinux.org/alpine/v3.12/community/x86_64/APKINDEX.tar.gz
ERROR: http://dl-cdn.alpinelinux.org/alpine/v3.12/community: IO ERROR
WARNING: Ignoring APKINDEX.40a3604f.tar.gz: No such file or directory
ERROR: unsatisfiable constraints:
libstdc++ (missing):
required by: world[libstdc++]
通过报错提示可以得出,是dl-cdn.alpinelinux.org这个仓库找不到对应的文件,默认的软件仓库在国外
解法:使用国内的软件包镜像
在容器中分别执行如下命令即可
// 使用国内源完全覆盖 /etc/apk/repositories,执行下属命令
echo -e http://mirrors.ustc.edu.cn/alpine/v3.12/main/ > /etc/apk/repositories
// 更新
apk update
apk add libstdc++
注意:在容器中执行只是临时生效,如果容器重启,这些配置又会丢失
配置永久生效,需要在dockerfile文件中加入如下命令
RUN echo -e http://mirrors.ustc.edu.cn/alpine/v3.12/main/ > /etc/apk/repositories
RUN apk update
RUN apk add libstdc++
如果docker容器是通过docker-compose构建的,则需要重新build,例如:
docker-compose -f docker-compose.yml build
docker-compose -f docker-compose.yml up -d
3、再次执行profiler start,又出现了如下错误
Perf events unavailable. See stderr of the target process.
官方列出了以下原因:
/proc/sys/kernel/perf_event_paranoid 设置为受限模式(> = 2)(通常是这个原因)
seccomp disables perf_event_open API in a container(seccomp禁用容器中的perf_event_open API。).
OS runs under a hypervisor that does not virtualize performance counters.(操作系统在不虚拟化性能计数器的管理程序下运行。)
perf_event_open API is not supported on this system, e.g. WSL.(该系统不支持perf_event_open API,例如WSL。)
看下系统的/proc/sys/kernel/perf_event_paranoid 这个配置项
[arthas@1]$ cat /proc/sys/kernel/perf_event_paranoid
2
发现该系统配置参数的值确实是大于等于2。 根据官方文档的描述。尝试将/proc/sys/kernel/perf_event_paranoid的值设置为1
[arthas@1]$ echo 1 > /proc/sys/kernel/perf_event_paranoid
[arthas@1]$ bash: /proc/sys/kernel/perf_event_paranoid: Read-only file system
说明权限不足。这时问题又来,通常情况下基础镜像的都是使用的非root权限。如果我们硬要修改这个配置项,需要重新构建镜像了
解决方案
Docker
修改docker-compose.yml,增加
cap_add:
- SYS_ADMIN
例如:
version: '1'
services:
xxx:
container_name: xxx
hostname: xxx
image: xxx
...
# 使得arthas中可以打印火焰图
cap_add:
- SYS_ADMIN
k8s
修改svc配置文件,增加
securityContext:
capabilities:
add: ["SYS_ADMIN"]
例如:
metadata:
labels:
service: servie1
spec:
containers:
- image: "alpine:3.4"
command: ["/bin/echo", "hello", "world"]
# 使得arthas中可以打印火焰图
securityContext:
capabilities:
add:
- SYS_ADMIN
重新构建下镜像即可