Arthas生成火焰图命令报错汇总

操作步骤

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

重新构建下镜像即可
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值