사용자가 서비스(sudo로 시작된 nginx 프로세스)에 대한 성능 통계를 수집할 수 없는 이유를 모르겠습니다. 보시다시피 커널 버전과 성능 버전이 일치합니다.
$ uname -r
4.19.125
$ which perf
/home/mahmood/bin/perf
$ /home/mahmood/bin/perf --version
perf version 4.19.125
하지만 실행하면 perf record -e cycles:u -j any,u -a -o perf.data -p 4018
이런 오류가 발생합니다.
Warning:
PID/TID switch overriding SYSTEM
Error:
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
값이 -1이고, -1이면 모든 사용자가 데이터를 수집할 수 있음을 분명히 명시하고 있습니다.
그렇다면 이 문제를 어떻게 해결해야 할까요?
답변1
@waltinator의 댓글
인력 읽기 및 사용자 ID 할당
CAP_SYS_ADMIN
추천능력(7), 현재 다음과 같이 말합니다.
CAP_PERFMON
(Linux 5.8부터) 다음을 포함한 다양한 성능 모니터링 메커니즘을 사용합니다.
- perf_event_open(2)을 호출합니다.
- 성능에 영향을 미치는 다양한 BPF 작업을 사용합니다.
이 기능은 다음에 추가되었습니다.리눅스 5.8과부하 기능과 성능 모니터링 기능 분리
CAP_SYS_ADMIN
능력. 커널 소스 파일도 참조하세요.Documentation/admin-guide/perf-security.rst
.
이에 대해서는 자세히 설명하지 않겠습니다.어떻게이를 수행하기 위해 마지막에는 다음을 포함한 프로그램 목록이 제공됩니다.getcap
(8)그리고setcap
(8)특정 파일에 추가된 기능을 검사하고 기능을 수정하는 데 사용할 수 있습니다.
OP의 질문에는 Ubuntu(예: Debian)라는 태그가 지정되어 있습니다. 일부 다른 시스템의 경우 이러한 설정을 적용하는 구성 파일이 있을 수 있습니다. 예를 들면 다음과 같습니다.CentOS 7에서 cap_sys_admin
사용자에게 권한을 추가하는 방법은 무엇입니까?, 그러나 Debian 등에서는 일반적으로 패키지 설치 스크립트를 통해 수행됩니다.
예를 들어 Ubuntu 18.04를 실행하면 다음이 발생합니다 getcap /usr/bin/*
.
/usr/bin/gnome-keyring-daemon = cap_ipc_lock+ep
/usr/bin/mtr-packet = cap_net_raw+ep
mtr-tiny
은(는) 의 일부이며 mtr
,패키지 파일postinstall
이에 대한 스크립트를 포함합니다 .
#!/bin/sh
set -e
if [ "$1" = configure ]; then
# If setcap is installed, try setting cap_net_raw+ep,
# which allows us to install our binaries without the setuid
# bit.
if command -v setcap > /dev/null; then
if ! setcap cap_net_raw+ep /usr/bin/mtr-packet; then
echo "Setcap failed on /usr/bin/mtr-packet, falling back to setuid" >&2
chmod u+s /usr/bin/mtr-packet
fi
else
echo "Setcap is not installed, falling back to setuid" >&2
chmod u+s /usr/bin/mtr-packet
fi
fi
#DEBHELPER#
exit 0
관련 명령에서
setcap cap_net_raw+ep /usr/bin/mtr-packet
이것은 cap_net_raw
분명해야합니다. 저것ep
너무 명확하지 않습니다. 보고 있다소스 코드
printf("%s differs in [%s%s%s]\n", *argv,
CAP_DIFFERS(cmp, CAP_PERMITTED) ? "p" : "",
CAP_DIFFERS(cmp, CAP_INHERITABLE) ? "i" : "",
CAP_DIFFERS(cmp, CAP_EFFECTIVE) ? "e" : "");
이 단락을 명확히 하는 데 도움이 됩니다.텍스트에 캡(3):
각 절에 대한 쉼표로 구분된 기능 이름(또는 단어) 목록
all
) 다음에 작업 목록이 표시됩니다. 작업 목록은 일련의 연산자-플래그 쌍으로 구성됩니다. 법적 연산자에는 다음이 포함됩니다.=
,'+', 그리고-
. 법적 플래그는 다음과 같습니다.e
,i
, 그리고p
. 이러한 플래그는 대소문자를 구분하며 유효한 세트, 상속 가능한 세트, 허용되는 세트를 각각 지정합니다.
즉, setcap
사용 중인 커널에 필요한 모든 기능을 추가할 수 있습니다.perf
적절한 플래그가 포함된 프로그램 파일.
답변2
그냥 사용스도앞으로성능나를 위해 이 문제를 해결해줘
sudo perf record -e cycles:u -j any,u -a -o perf.data -p 4018