Man page - perf_event_open(2)
Packages contains this manual
- __malloc_initialize_hook(3)
- getpwuid(3)
- frexpl(3)
- fchown(2)
- setttyent(3)
- pthread_attr_setstacksize(3)
- calloc(3)
- clog(3)
- seteuid(2)
- res_nquerydomain(3)
- y0l(3)
- catanl(3)
- catanh(3)
- inet_addr(3)
- getcwd(2)
- epoll_create1(2)
- atol(3)
- pciconfig_write(2)
- htonl(3)
- timer_settime(2)
- munmap(2)
- cexpl(3)
- rt_sigsuspend(2)
- msgctl(2)
- tan(3)
- get_mempolicy(2)
- roundf(3)
- towctrans(3)
- xdr_opaque(3)
- psignal(3)
- error_at_line(3)
- xdrmem_create(3)
- select(2)
- getdate_r(3)
- getprotobyname_r(3)
- nrand48_r(3)
- inet_netof(3)
- inet_ntoa(3)
- nextafterl(3)
- innetgr(3)
- on_exit(3)
- expm1l(3)
- strfmon(3)
- strdup(3)
- getservbyport(3)
- arch_prctl(2)
- j0(3)
- wait4(2)
- personality(2)
- bpf(2)
- pvalloc(3)
- getresuid32(2)
- des_setparity(3)
- prctl(2)
- clog10(3)
- aio_init(3)
- pthread_getconcurrency(3)
- csinl(3)
- linkat(2)
- vsscanf(3)
- isascii(3)
- xdr_union(3)
- nan(3)
- utimensat(2)
- ioctl_vt(2)
- _newselect(2)
- ldexpl(3)
- fabsf(3)
- chown(2)
- mkstemps(3)
- pthread_attr_getstacksize(3)
- listxattr(2)
- getpgrp(2)
- xdr_short(3)
- tcflush(3)
- pthread_cond_wait(3)
- argz_add(3)
- wcpncpy(3)
- reallocarray(3)
- llrintf(3)
- outsl(2)
- qsort(3)
- authnone_create(3)
- tzname(3)
- setresuid32(2)
- isspace(3)
- open_by_handle_at(2)
- drem(3)
- conjf(3)
- nanosleep(2)
- pthread_kill(3)
- putc(3)
- pthread_condattr_destroy(3)
- getpwuid_r(3)
- strverscmp(3)
- res_init(3)
- cacosl(3)
- qecvt_r(3)
- iswgraph(3)
- gethostbyname(3)
- ntohl(3)
- acct(2)
- asinl(3)
- envz_merge(3)
- strdupa(3)
- idle(2)
- getopt_long_only(3)
- hstrerror(3)
- fanotify_init(2)
- fputs_unlocked(3)
- sleep(3)
- vfprintf(3)
- scalb(3)
- nanl(3)
- lchown32(2)
- getnetent_r(3)
- fcntl(2)
- inw(2)
- rintl(3)
- arc4random(3)
- getsockopt(2)
- ilogbl(3)
- clog2(3)
- encrypt(3)
- sqrtf(3)
- isspace_l(3)
- tanl(3)
- cfmakeraw(3)
- assert(3)
- strtoull(3)
- xdrstdio_create(3)
- optopt(3)
- setrlimit(2)
- lround(3)
- xdr_accepted_reply(3)
- fmin(3)
- mq_notify(3)
- svcerr_auth(3)
- sbrk(2)
- recv(2)
- mq_unlink(2)
- strxfrm(3)
- ctan(3)
- atoi(3)
- xcrypt(3)
- sgetspent(3)
- fread(3)
- isless(3)
- ceil(3)
- pthread_cond_broadcast(3)
- oldfstat(2)
- outl(2)
- times(2)
- wcslen(3)
- popen(3)
- wprintf(3)
- labs(3)
- getrpcbynumber(3)
- shmat(2)
- clock_gettime(2)
- btree(3)
- s390_sthyi(2)
- siggetmask(3)
- getgid32(2)
- puts(3)
- scalblnl(3)
- strpbrk(3)
- catanhl(3)
- vlimit(3)
- getrpcent(3)
- tgammal(3)
- strtoll(3)
- funlockfile(3)
- xdecrypt(3)
- pthread_key_delete(3)
- setgrent(3)
- wmemmove(3)
- gnu_dev_major(3)
- regexec(3)
- lrintl(3)
- __ppc_set_ppr_med(3)
- rmdir(2)
- io_getevents(2)
- request_key(2)
- ecvt(3)
- __ppc_mdoom(3)
- mktemp(3)
- key_gendes(3)
- le64toh(3)
- statvfs(3)
- rpc(3)
- getdate_err(3)
- munlockall(2)
- close(2)
- xdr_rejected_reply(3)
- dlerror(3)
- le32toh(3)
- feclearexcept(3)
- insque(3)
- clntraw_create(3)
- getutid(3)
- strtof(3)
- settimeofday(2)
- mkdir(2)
- rewind(3)
- logf(3)
- tmpnam(3)
- iswpunct(3)
- wcrtomb(3)
- epoll_pwait(2)
- getitimer(2)
- wordexp(3)
- clog2f(3)
- capset(2)
- strrchr(3)
- outsb(2)
- freeifaddrs(3)
- getwc_unlocked(3)
- ustat(2)
- bswap_16(3)
- program_invocation_short_name(3)
- ldiv(3)
- exp10f(3)
- vprintf(3)
- wcsncpy(3)
- iscntrl(3)
- readlink(2)
- semget(2)
- connect(2)
- psiginfo(3)
- epoll_ctl(2)
- removexattr(2)
- envz_strip(3)
- fgetxattr(2)
- atexit(3)
- putgrent(3)
- bswap(3)
- getegid32(2)
- qecvt(3)
- asinh(3)
- isfdtype(3)
- setenv(3)
- readdir(3)
- rtime(3)
- nearbyint(3)
- getgroups32(2)
- statx(2)
- modify_ldt(2)
- cpow(3)
- eventfd_read(3)
- sendfile64(2)
- getnetbyname(3)
- fremovexattr(2)
- uselib(2)
- inet(3)
- endutxent(3)
- clnt_spcreateerror(3)
- pututline(3)
- nexttowardl(3)
- getipnodebyaddr(3)
- fts_set(3)
- memmem(3)
- fmodl(3)
- setfsuid32(2)
- wordfree(3)
- fadvise64(2)
- getppid(2)
- qsort_r(3)
- toupper(3)
- getwc(3)
- fputws(3)
- mrand48(3)
- preadv(2)
- sincosf(3)
- fstatat64(2)
- dirfd(3)
- jnf(3)
- static_assert(3)
- wctype(3)
- vwarn(3)
- setfsent(3)
- listen(2)
- wcstok(3)
- argz_insert(3)
- select_tut(2)
- ctanl(3)
- getunwind(2)
- difftime(3)
- daylight(3)
- sigpause(3)
- wcscat(3)
- dlclose(3)
- __ppc_set_ppr_med_low(3)
- pread(2)
- fstatvfs(3)
- cbrtf(3)
- strnlen(3)
- sinhl(3)
- inl_p(2)
- setregid32(2)
- putwc(3)
- register_printf_type(3)
- nextafterf(3)
- opendir(3)
- strtod(3)
- tgamma(3)
- malloc_get_state(3)
- aio_write(3)
- timezone(3)
- xdr_pmaplist(3)
- sysfs(2)
- index(3)
- svcerr_noproc(3)
- envz(3)
- klogctl(3)
- pselect(2)
- get_current_dir_name(3)
- xdr_char(3)
- asinhf(3)
- preadv2(2)
- inotify_init1(2)
- pthread_attr_setstackaddr(3)
- getline(3)
- tanhf(3)
- rtnetlink(3)
- pkey_alloc(2)
- edata(3)
- stailq(3)
- isastream(2)
- setregid(2)
- copy_file_range(2)
- rcmd_af(3)
- futex(2)
- prof(2)
- siglongjmp(3)
- hdestroy(3)
- catan(3)
- pthread_cond_signal(3)
- mkfifoat(3)
- clntudp_create(3)
- getentropy(3)
- vsprintf(3)
- fabs(3)
- lseek64(3)
- pthread_setname_np(3)
- conjl(3)
- chroot(2)
- ccoshf(3)
- erand48_r(3)
- wcsnrtombs(3)
- rindex(3)
- fputc_unlocked(3)
- setresgid32(2)
- gettimeofday(2)
- cexp(3)
- inotify_add_watch(2)
- set_robust_list(2)
- nice(2)
- strtold(3)
- mq_getattr(3)
- xdr(3)
- getxattr(2)
- getrandom(2)
- splice(2)
- strerror(3)
- fcntl64(2)
- fnmatch(3)
- ungetwc(3)
- getspnam_r(3)
- clearenv(3)
- atan2(3)
- get_myaddress(3)
- open(2)
- pthread_setcancelstate(3)
- newlocale(3)
- open_memstream(3)
- setprotoent(3)
- logbf(3)
- ilogb(3)
- wmemcpy(3)
- tcsendbreak(3)
- be16toh(3)
- perfmonctl(2)
- strtoq(3)
- getgrgid_r(3)
- pthread_timedjoin_np(3)
- memfd_create(2)
- getttynam(3)
- mcheck_pedantic(3)
- _llseek(2)
- renameat2(2)
- ioperm(2)
- ecb_crypt(3)
- pthread_condattr_init(3)
- fminl(3)
- lio_listio(3)
- envz_add(3)
- setbuf(3)
- setkey(3)
- expm1(3)
- strtoul(3)
- getcwd(3)
- setutxent(3)
- getrpcent_r(3)
- unimplemented(2)
- fclose(3)
- epoll_create(2)
- getfsent(3)
- key_secretkey_is_set(3)
- vserver(2)
- vswprintf(3)
- sigsuspend(2)
- pututxline(3)
- clnt_freeres(3)
- cacheflush(2)
- ioprio_set(2)
- alarm(2)
- fgetc(3)
- __fpurge(3)
- getlogin_r(3)
- vfork(2)
- bstring(3)
- div(3)
- getrusage(2)
- gettid(2)
- dprintf(3)
- strtoumax(3)
- jrand48(3)
- iswcntrl(3)
- vwarnx(3)
- cacos(3)
- ccoshl(3)
- fesetexceptflag(3)
- res_nclose(3)
- shmop(2)
- mcheck_check_all(3)
- vscanf(3)
- tolower(3)
- landlock_add_rule(2)
- argz_next(3)
- lroundl(3)
- ruserok(3)
- glob(3)
- brk(2)
- rename(2)
- strcspn(3)
- sched_getscheduler(2)
- wcstoumax(3)
- dbopen(3)
- xdr_bytes(3)
- fegetenv(3)
- scalbf(3)
- pkey_free(2)
- fgetgrent(3)
- strchrnul(3)
- fork(2)
- log1pf(3)
- strtoimax(3)
- fputs(3)
- putspent(3)
- ttyname_r(3)
- iswlower(3)
- epoll_wait(2)
- minor(3)
- wcsspn(3)
- sendmmsg(2)
- pthread_attr_getsigmask_np(3)
- erand48(3)
- setpgrp(2)
- db(3)
- readv(2)
- cimagf(3)
- pthread_sigmask(3)
- getresuid(2)
- gamma(3)
- logwtmp(3)
- imaxabs(3)
- y1(3)
- swapoff(2)
- svcerr_weakauth(3)
- mbtowc(3)
- madvise(2)
- __fbufsize(3)
- swapon(2)
- towlower(3)
- asin(3)
- initgroups(3)
- svc_getreqset(3)
- pthread_attr_destroy(3)
- scalblnf(3)
- ispunct(3)
- casin(3)
- xdr_pmap(3)
- sigvec(3)
- dlmopen(3)
- localeconv(3)
- tcgetattr(3)
- mempcpy(3)
- clnt_perrno(3)
- clock_getcpuclockid(3)
- setaliasent(3)
- clock(3)
- ftok(3)
- svc_run(3)
- getsubopt(3)
- coshf(3)
- pow(3)
- getpwent(3)
- ntp_gettime(3)
- xdrrec_skiprecord(3)
- symlink(2)
- shmctl(2)
- mq_timedreceive(2)
- malloc(3)
- tgkill(2)
- l64a(3)
- unlockpt(3)
- mallopt(3)
- creal(3)
- syscalls(2)
- set_tid_address(2)
- exp2f(3)
- fstatfs(2)
- statfs(2)
- dreml(3)
- feenableexcept(3)
- ftw(3)
- fanotify_mark(2)
- clnt_sperror(3)
- realpath(3)
- sysconf(3)
- _syscall(2)
- set_mempolicy(2)
- mq_unlink(3)
- freehostent(3)
- rresvport_af(3)
- nl_langinfo_l(3)
- fmaxl(3)
- iscntrl_l(3)
- copysignf(3)
- llseek(2)
- bzero(3)
- ioctl_fsmap(2)
- remquof(3)
- malloc_trim(3)
- pthread_getattr_default_np(3)
- isalnum_l(3)
- mlock(2)
- nearbyintf(3)
- confstr(3)
- sinf(3)
- ioctl_eventpoll(2)
- sigstack(3)
- seed48_r(3)
- utmpname(3)
- malloc_stats(3)
- stpncpy(3)
- getservbyport_r(3)
- cabsl(3)
- isblank(3)
- sigprocmask(2)
- isinfl(3)
- isinff(3)
- pathconf(3)
- xdr_u_short(3)
- acos(3)
- timerfd_create(2)
- key_encryptsession(3)
- log2f(3)
- oldlstat(2)
- res_querydomain(3)
- memcmp(3)
- gethostbyaddr(3)
- sighold(3)
- gtty(2)
- xdr_void(3)
- getmsg(2)
- io_setup(2)
- ttyslot(3)
- recno(3)
- cuserid(3)
- nanf(3)
- pthread_getaffinity_np(3)
- if_indextoname(3)
- remainderf(3)
- putpwent(3)
- pow10f(3)
- pwritev(2)
- swapcontext(3)
- cfsetospeed(3)
- envz_remove(3)
- cosh(3)
- a64l(3)
- uselocale(3)
- yn(3)
- msgget(2)
- pthread_equal(3)
- prlimit(2)
- setspent(3)
- newfstatat(2)
- renameat(2)
- truncf(3)
- pthread_yield(3)
- tkill(2)
- islessequal(3)
- isnanf(3)
- sethostent(3)
- setvbuf(3)
- gnu_get_libc_release(3)
- atoll(3)
- getgrnam(3)
- get_robust_list(2)
- __ppc_yield(3)
- __memalign_hook(3)
- eventfd2(2)
- mq_setattr(3)
- tmpnam_r(3)
- pmap_getport(3)
- svcfd_create(3)
- getfsspec(3)
- setgid(2)
- getlogin(3)
- get_nprocs(3)
- canonicalize_file_name(3)
- pthread_mutexattr_getrobust(3)
- strerrorname_np(3)
- csinh(3)
- malloc_set_state(3)
- tcgetsid(3)
- ssignal(3)
- secure_getenv(3)
- significandl(3)
- wcschr(3)
- isgraph(3)
- pthread_mutexattr_gettype(3)
- creat(2)
- cabsf(3)
- __ppc_set_ppr_med_high(3)
- fchdir(2)
- backtrace_symbols(3)
- exp10l(3)
- euidaccess(3)
- sync_file_range(2)
- getutxline(3)
- isdigit(3)
- sinhf(3)
- lgetxattr(2)
- getaliasent(3)
- memrchr(3)
- io_submit(2)
- clnt_create(3)
- __setfpucw(3)
- _flushlbf(3)
- lcong48_r(3)
- clog10l(3)
- pmap_getmaps(3)
- memalign(3)
- xdr_authunix_parms(3)
- execl(3)
- getdate(3)
- cfsetispeed(3)
- tanhl(3)
- wmempcpy(3)
- outw_p(2)
- faccessat(2)
- rresvport(3)
- nextup(3)
- fgetgrent_r(3)
- getopt(3)
- xdr_vector(3)
- aio_error(3)
- frexpf(3)
- getpw(3)
- sscanf(3)
- mprotect(2)
- exp(3)
- sched_getaffinity(2)
- accept4(2)
- remainderl(3)
- pthread_key_create(3)
- endian(3)
- setmntent(3)
- get_phys_pages(3)
- argz(3)
- _exit(2)
- towupper_l(3)
- lrand48(3)
- csqrt(3)
- hdestroy_r(3)
- remquo(3)
- feof_unlocked(3)
- isprint(3)
- pivot_root(2)
- arc4random_uniform(3)
- strfroml(3)
- getdomainname(2)
- va_end(3)
- getresgid(2)
- cosf(3)
- endhostent(3)
- setgid32(2)
- ioctl_fs(2)
- getaddrinfo(3)
- fgetwc(3)
- lock(2)
- getservbyname_r(3)
- sys_nerr(3)
- insb(2)
- usleep(3)
- security(2)
- cfree(3)
- tanf(3)
- fprintf(3)
- pthread_mutexattr_setpshared(3)
- xprt_unregister(3)
- alphasort(3)
- getgrent(3)
- scandirat(3)
- iruserok(3)
- ttyname(3)
- tdestroy(3)
- strcasecmp(3)
- getpgid(2)
- drand48_r(3)
- mmap(2)
- sigtimedwait(2)
- pthread_once(3)
- mq_receive(3)
- pthread_mutexattr_setkind_np(3)
- iopl(2)
- s390_runtime_instr(2)
- lckpwdf(3)
- memmove(3)
- __fpending(3)
- mbsrtowcs(3)
- restart_syscall(2)
- memset(3)
- significandf(3)
- openat2(2)
- timeradd(3)
- conj(3)
- flockfile(3)
- madvise1(2)
- inet_aton(3)
- fstatfs64(2)
- fmax(3)
- fmemopen(3)
- fmaf(3)
- lseek(2)
- registerrpc(3)
- kexec_file_load(2)
- gammal(3)
- feof(3)
- pidfd_open(2)
- crealf(3)
- clogl(3)
- getutmp(3)
- umount(2)
- inet_pton(3)
- flistxattr(2)
- xdr_wrapstring(3)
- socketcall(2)
- setrpcent(3)
- rint(3)
- vm86(2)
- sincosl(3)
- getprotoent_r(3)
- mknod(2)
- getdents64(2)
- gai_cancel(3)
- srandom_r(3)
- getnetbyname_r(3)
- sigaddset(3)
- htole16(3)
- endnetent(3)
- nextafter(3)
- timerisset(3)
- getgrent_r(3)
- freeaddrinfo(3)
- endprotoent(3)
- mbind(2)
- sigorset(3)
- pthread_rwlockattr_setkind_np(3)
- cimag(3)
- waitid(2)
- abs(3)
- unlink(2)
- recvmsg(2)
- getaliasbyname(3)
- wctrans(3)
- kill(2)
- strtol(3)
- __ppc_set_ppr_very_low(3)
- membarrier(2)
- getnetbyaddr_r(3)
- writev(2)
- errx(3)
- tfind(3)
- clone3(2)
- __freading(3)
- outw(2)
- regfree(3)
- accept(2)
- timer_getoverrun(2)
- shmdt(2)
- svcerr_decode(3)
- getnameinfo(3)
- endusershell(3)
- execvpe(3)
- cbc_crypt(3)
- res_send(3)
- xdr_destroy(3)
- getcontext(3)
- pkey_mprotect(2)
- twalk_r(3)
- isalnum(3)
- timercmp(3)
- setxattr(2)
- pthread_cleanup_pop_restore_np(3)
- stat(2)
- isupper(3)
- vsyslog(3)
- strlen(3)
- pthread_attr_setinheritsched(3)
- xdr_inline(3)
- strtouq(3)
- raise(3)
- getpeername(2)
- capget(2)
- atanl(3)
- ferror_unlocked(3)
- isxdigit_l(3)
- modfl(3)
- pthread_mutexattr_init(3)
- pthread_mutexattr_getkind_np(3)
- phys(2)
- llabs(3)
- sched_rr_get_interval(2)
- asprintf(3)
- explicit_bzero(3)
- asctime(3)
- clone(2)
- munlock(2)
- __realloc_hook(3)
- atof(3)
- rt_tgsigqueueinfo(2)
- syslog(2)
- inet_makeaddr(3)
- epoll_pwait2(2)
- iswalpha(3)
- netlink(3)
- sched_setattr(2)
- sigdescr_np(3)
- access(2)
- getc_unlocked(3)
- dysize(3)
- inet_net_pton(3)
- sched_setparam(2)
- timerfd_settime(2)
- nexttowardf(3)
- expf(3)
- svcerr_progvers(3)
- getwchar(3)
- ftime(3)
- if_nametoindex(3)
- argz_add_sep(3)
- vasprintf(3)
- unlinkat(2)
- putenv(3)
- pthread_mutexattr_setrobust_np(3)
- error_message_count(3)
- setfsgid(2)
- cmsg(3)
- setpwent(3)
- cfgetospeed(3)
- end(3)
- pidfd_send_signal(2)
- scalbn(3)
- closelog(3)
- srandom(3)
- argz_replace(3)
- ioctl_tty(2)
- va_arg(3)
- towlower_l(3)
- isblank_l(3)
- remove(3)
- expl(3)
- fscanf(3)
- versionsort(3)
- pow10(3)
- hsearch(3)
- gethostid(3)
- fchownat(2)
- group_member(3)
- getchar_unlocked(3)
- getservbyname(3)
- pthread_mutexattr_destroy(3)
- setpgid(2)
- acosf(3)
- ctanhf(3)
- shm_open(3)
- towupper(3)
- getdents(2)
- chown32(2)
- hypotf(3)
- undocumented(3)
- drand48(3)
- csinf(3)
- ctime_r(3)
- setlinebuf(3)
- ulimit(3)
- spu_create(2)
- fcvt_r(3)
- ipc(2)
- ftruncate64(2)
- fdopen(3)
- svcerr_noprog(3)
- getrpcport(3)
- csin(3)
- sinh(3)
- nrand48(3)
- openpty(3)
- xdr_double(3)
- pthread_attr_getscope(3)
- vfscanf(3)
- catanhf(3)
- inb(2)
- wcpcpy(3)
- ldexp(3)
- getopt_long(3)
- strerrordesc_np(3)
- mbsinit(3)
- argz_stringify(3)
- setbuffer(3)
- byteorder(3)
- expm1f(3)
- pthread_attr_setscope(3)
- gnu_dev_makedev(3)
- pipe(2)
- updwtmp(3)
- fts_read(3)
- ioctl_fat(2)
- h_errno(3)
- sem_getvalue(3)
- iswupper(3)
- lrint(3)
- perror(3)
- xdr_u_int(3)
- timer_create(2)
- iswdigit(3)
- fgetspent(3)
- fwrite_unlocked(3)
- reboot(2)
- ftruncate(2)
- getutmpx(3)
- pwrite64(2)
- getauxval(3)
- xdr_pointer(3)
- getprotobynumber(3)
- svc_destroy(3)
- vmsplice(2)
- inet_network(3)
- readdir_r(3)
- setsockopt(2)
- rexec(3)
- flock(2)
- getw(3)
- mmap2(2)
- j1f(3)
- cprojf(3)
- mkstemp(3)
- symlinkat(2)
- tempnam(3)
- pthread_attr_getaffinity_np(3)
- gethostbyname_r(3)
- signalfd4(2)
- sys_siglist(3)
- erfc(3)
- truncate64(2)
- verr(3)
- pthread_kill_other_threads_np(3)
- eaccess(3)
- fsetpos(3)
- slist(3)
- pmap_unset(3)
- modf(3)
- ioctl_pipe(2)
- vfwprintf(3)
- getresgid32(2)
- statfs64(2)
- cexp2(3)
- stdio_ext(3)
- login_tty(3)
- xdr_long(3)
- dlsym(3)
- clog2l(3)
- malloc_usable_size(3)
- fegetexceptflag(3)
- basename(3)
- fwrite(3)
- vhangup(2)
- printf(3)
- setnetent(3)
- gethostbyname2(3)
- mallinfo2(3)
- signbit(3)
- clnt_broadcast(3)
- sched_yield(2)
- sem_open(3)
- sigsetjmp(3)
- cacoshl(3)
- sem_unlink(3)
- setresuid(2)
- signgam(3)
- putw(3)
- imaxdiv(3)
- regex(3)
- alloc_hugepages(2)
- modff(3)
- exp10(3)
- cprojl(3)
- utime(2)
- clogf(3)
- pthread_mutex_unlock(3)
- erff(3)
- ioctl_userfaultfd(2)
- iswprint(3)
- roundl(3)
- sqrtl(3)
- fpurge(3)
- getusershell(3)
- fcloseall(3)
- xdr_opaque_auth(3)
- gethostent_r(3)
- fgetwc_unlocked(3)
- fchmod(2)
- strptime(3)
- lutimes(3)
- htole64(3)
- putchar_unlocked(3)
- create_module(2)
- isascii_l(3)
- sigaction(2)
- stdout(3)
- geteuid32(2)
- xprt_register(3)
- freopen(3)
- ccosl(3)
- pthread_setschedprio(3)
- rt_sigaction(2)
- getmntent(3)
- putwchar_unlocked(3)
- logl(3)
- remque(3)
- unsetenv(3)
- sigwaitinfo(2)
- pthread_mutexattr_getrobust_np(3)
- initstate_r(3)
- getfsfile(3)
- exp2l(3)
- isatty(3)
- lgamma_r(3)
- lrintf(3)
- outb(2)
- __clone2(2)
- strcpy(3)
- clnt_call(3)
- hypot(3)
- fegetexcept(3)
- tcsetpgrp(3)
- gets(3)
- malloc_info(3)
- nextupf(3)
- pthread_attr_getdetachstate(3)
- getaliasent_r(3)
- fstat64(2)
- futimesat(2)
- dl_iterate_phdr(3)
- posix_madvise(3)
- endnetgrent(3)
- tolower_l(3)
- pthread_attr_setstack(3)
- pread64(2)
- sigsetops(3)
- stty(2)
- process_vm_readv(2)
- isfinite(3)
- gethostbyaddr_r(3)
- cproj(3)
- gai_strerror(3)
- key_decryptsession(3)
- inet_ntop(3)
- __ppc_mdoio(3)
- btowc(3)
- setstate_r(3)
- if_nameindex(3)
- fdetach(2)
- random_r(3)
- iruserok_af(3)
- truncl(3)
- clearerr(3)
- lgammaf(3)
- lfind(3)
- ctanf(3)
- strcat(3)
- pthread_attr_getschedpolicy(3)
- pthread_rwlockattr_getkind_np(3)
- sigrelse(3)
- daemon(3)
- pthread_setcanceltype(3)
- sigevent(7)
- iswalnum(3)
- pmap_set(3)
- stdin(3)
- ceilf(3)
- asctime_r(3)
- poll(2)
- svc_unregister(3)
- isnanl(3)
- carg(3)
- getprotobyname(3)
- arm_fadvise(2)
- optind(3)
- mount_setattr(2)
- dlvsym(3)
- ntp_adjtime(3)
- abort(3)
- pthread_getname_np(3)
- execlp(3)
- bind(2)
- bsearch(3)
- endspent(3)
- register_printf_specifier(3)
- landlock_create_ruleset(2)
- mkostemp(3)
- setgroups(2)
- toupper_l(3)
- argz_extract(3)
- sigblock(3)
- j0l(3)
- argz_delete(3)
- setusershell(3)
- getspnam(3)
- optarg(3)
- vm86old(2)
- sigandset(3)
- getdtablesize(3)
- getsockname(2)
- pthread_sigqueue(3)
- ptsname(3)
- j1(3)
- lgamma(3)
- getpagesize(2)
- pthread_mutex_lock(3)
- setsid(2)
- strncat(3)
- ioctl_kd(2)
- tsearch(3)
- mq_notify(2)
- fcvt(3)
- clntudp_bufcreate(3)
- getpwent_r(3)
- pthread_getspecific(3)
- memfrob(3)
- arc4random_buf(3)
- forkpty(3)
- powl(3)
- dlopen(3)
- stderr(3)
- set_thread_area(2)
- query_module(2)
- sem_close(3)
- strndup(3)
- __malloc_hook(3)
- setjmp(3)
- stdio(3)
- bdflush(2)
- sendto(2)
- mpx(2)
- fopen(3)
- setpriority(2)
- nextdownl(3)
- mprobe(3)
- oldstat(2)
- sem_destroy(3)
- bcopy(3)
- remap_file_pages(2)
- isgreaterequal(3)
- getpass(3)
- seekdir(3)
- break(2)
- authunix_create_default(3)
- tty_ioctl(4)
- process_madvise(2)
- endfsent(3)
- atoq(3)
- strftime(3)
- fts(3)
- getgrgid(3)
- isxdigit(3)
- ftello(3)
- regcomp(3)
- error(3)
- getenv(3)
- clnt_sperrno(3)
- readahead(2)
- y0(3)
- roundup(3)
- io_destroy(2)
- vsnprintf(3)
- lgammal(3)
- eventfd_write(3)
- pthread_mutex_trylock(3)
- lchown(2)
- dladdr(3)
- error_print_progname(3)
- pthread_mutexattr_settype(3)
- strspn(3)
- __after_morecore_hook(3)
- localtime(3)
- fsync(2)
- ether_aton(3)
- csinhl(3)
- trunc(3)
- xdr_u_char(3)
- syslog(3)
- y1f(3)
- ioctl_nsfs(2)
- wmemcmp(3)
- ffsll(3)
- ether_ntohost(3)
- bswap_32(3)
- umount2(2)
- sigfillset(3)
- landlock_restrict_self(2)
- pthread_join(3)
- sysinfo(2)
- clock_settime(2)
- llrint(3)
- s390_guarded_storage(2)
- getc(3)
- inet_lnaof(3)
- tcgetpgrp(3)
- clock_getres(2)
- etext(3)
- strfmon_l(3)
- putwc_unlocked(3)
- xdr_replymsg(3)
- scalbl(3)
- fdim(3)
- getspent(3)
- sem_timedwait(3)
- posix_fallocate(3)
- res_nmkquery(3)
- pthread_spin_unlock(3)
- mq_timedsend(2)
- opterr(3)
- getloadavg(3)
- strsignal(3)
- finite(3)
- inw_p(2)
- csinhf(3)
- execveat(2)
- seed48(3)
- sigset(3)
- setgroups32(2)
- logbl(3)
- wcsdup(3)
- clnt_geterr(3)
- sys_errlist(3)
- inotify_rm_watch(2)
- qgcvt(3)
- wcspbrk(3)
- sin(3)
- lookup_dcookie(2)
- s390_pci_mmio_read(2)
- wcscmp(3)
- getutxent(3)
- pciconfig_read(2)
- initstate(3)
- backtrace(3)
- putc_unlocked(3)
- fedisableexcept(3)
- rt_sigprocmask(2)
- clock_adjtime(2)
- fwprintf(3)
- jnl(3)
- grantpt(3)
- cimagl(3)
- getgrnam_r(3)
- remquol(3)
- swprintf(3)
- mbrtowc(3)
- fileno_unlocked(3)
- readlinkat(2)
- sigignore(3)
- strndupa(3)
- semctl(2)
- assert_perror(3)
- sendfile(2)
- shm_unlink(3)
- log(3)
- ungetc(3)
- erf(3)
- qfcvt(3)
- pthread_atfork(3)
- login(3)
- setservent(3)
- jrand48_r(3)
- wcsnlen(3)
- tcflow(3)
- pthread_cond_destroy(3)
- inl(2)
- srand48_r(3)
- erfcf(3)
- iconv(3)
- pthread_mutex_consistent_np(3)
- fabsl(3)
- pclose(3)
- nfsservctl(2)
- gai_error(3)
- wcsncmp(3)
- islower_l(3)
- iswctype(3)
- svc_register(3)
- arm_sync_file_range(2)
- strfry(3)
- strfromd(3)
- getttyent(3)
- rand(3)
- fchown32(2)
- ctime(3)
- fsetxattr(2)
- feupdateenv(3)
- random(3)
- getpwnam_r(3)
- sigwait(3)
- aio_fsync(3)
- mq_open(2)
- tanh(3)
- localtime_r(3)
- bsd_signal(3)
- strsep(3)
- mknodat(2)
- cexpf(3)
- cacosh(3)
- mbrlen(3)
- aio_cancel(3)
- mq_getsetattr(2)
- fdatasync(2)
- htons(3)
- sem_post(3)
- htobe16(3)
- vtimes(3)
- fgetpwent_r(3)
- getwchar_unlocked(3)
- mkdirat(2)
- dup(2)
- free_hugepages(2)
- feraiseexcept(3)
- lockf(3)
- userfaultfd(2)
- pthread_attr_setaffinity_np(3)
- memcpy(3)
- prlimit64(2)
- ferror(3)
- ldexpf(3)
- aio_return(3)
- adjtimex(2)
- execle(3)
- tailq(3)
- cabs(3)
- endaliasent(3)
- execvp(3)
- hasmntopt(3)
- if_freenameindex(3)
- signal(2)
- dn_comp(3)
- pthread_attr_getstack(3)
- ether_hostton(3)
- re_comp(3)
- cexp2l(3)
- getwd(3)
- llroundl(3)
- cos(3)
- pthread_mutex_consistent(3)
- isalpha_l(3)
- io_cancel(2)
- frexp(3)
- finitel(3)
- perf_event_open(2)
- pthread_exit(3)
- ioctl_console(2)
- timelocal(3)
- timersub(3)
- setresgid(2)
- semop(2)
- getgroups(2)
- envz_entry(3)
- xdr_u_long(3)
- seccomp(2)
- ftrylockfile(3)
- setuid(2)
- wcwidth(3)
- llround(3)
- cacoshf(3)
- pthread_attr_setschedpolicy(3)
- fgetpos(3)
- xdr_array(3)
- sprintf(3)
- wmemset(3)
- setcontext(3)
- copysignl(3)
- be64toh(3)
- matherr(3)
- hypotl(3)
- rawmemchr(3)
- fmodf(3)
- mount(2)
- mktime(3)
- stdarg(3)
- clnttcp_create(3)
- string(3)
- profil(3)
- clnt_perror(3)
- getpriority(2)
- regerror(3)
- clone2(2)
- getgid(2)
- pthread_spin_lock(3)
- iswblank(3)
- ftell(3)
- dup3(2)
- toascii(3)
- strncpy(3)
- mrand48_r(3)
- setstate(3)
- sigqueue(3)
- cpowf(3)
- setlogmask(3)
- sched_getcpu(3)
- htobe32(3)
- list(3)
- isdigit_l(3)
- chdir(2)
- fstat(2)
- pwritev2(2)
- get_thread_area(2)
- freelocale(3)
- acoshl(3)
- socketpair(2)
- scalbln(3)
- fpclassify(3)
- getpwnam(3)
- pthread_getcpuclockid(3)
- ioprio_get(2)
- strtok_r(3)
- exit_group(2)
- scalbnf(3)
- xdrrec_create(3)
- pthread_mutex_destroy(3)
- sqrt(3)
- dirname(3)
- exit(2)
- ulckpwdf(3)
- cargl(3)
- powerof2(3)
- simpleq(3)
- process_vm_writev(2)
- fdopendir(3)
- getpt(3)
- floorl(3)
- va_start(3)
- lcong48(3)
- strerror_l(3)
- xdrrec_eof(3)
- key_setsecret(3)
- lstat64(2)
- memfd_secret(2)
- sigreturn(2)
- casinhf(3)
- valloc(3)
- stat64(2)
- jn(3)
- sinl(3)
- pthread_testcancel(3)
- cfgetispeed(3)
- dup2(2)
- getnetent(3)
- pthread_setconcurrency(3)
- memccpy(3)
- rt_sigqueueinfo(2)
- ccosf(3)
- sincos(3)
- tcdrain(3)
- ccos(3)
- chmod(2)
- cacosf(3)
- lstat(2)
- pthread_spin_trylock(3)
- sigisemptyset(3)
- getrpcbyname(3)
- fpathconf(3)
- copysign(3)
- round(3)
- wmemchr(3)
- qfcvt_r(3)
- fattach(2)
- __fsetlocking(3)
- adjtime(3)
- makedev(3)
- des_crypt(3)
- iswspace(3)
- twalk(3)
- exec(3)
- link(2)
- fileno(3)
- endpwent(3)
- logb(3)
- wcscspn(3)
- console_ioctl(4)
- fgetpwent(3)
- setegid(2)
- clnt_destroy(3)
- getaddrinfo_a(3)
- svc_getargs(3)
- addmntent(3)
- globfree(3)
- islower(3)
- muntrace(3)
- clnt_pcreateerror(3)
- llrintl(3)
- clnt_control(3)
- fgetspent_r(3)
- strstr(3)
- putmsg(2)
- __fwritable(3)
- res_nsearch(3)
- fseeko(3)
- mq_timedreceive(3)
- log10(3)
- fexecve(3)
- gammaf(3)
- pthread_setschedparam(3)
- wcscpy(3)
- xdr_float(3)
- pthread_attr_setdetachstate(3)
- sem_wait(3)
- pow10l(3)
- re_exec(3)
- rand_r(3)
- putpmsg(2)
- getdelim(3)
- utimes(2)
- mq_close(3)
- setutent(3)
- creall(3)
- mq_send(3)
- telldir(3)
- powf(3)
- erfl(3)
- pthread_self(3)
- pselect6(2)
- unlocked_stdio(3)
- insw(2)
- cfsetspeed(3)
- argz_create(3)
- xdr_string(3)
- pthread_attr_getguardsize(3)
- finitef(3)
- setlocale(3)
- bcmp(3)
- fmtmsg(3)
- sendmsg(2)
- pthread_cleanup_push(3)
- inb_p(2)
- mmap64(3)
- getuid32(2)
- truncate(2)
- mlock2(2)
- fegetround(3)
- ugetrlimit(2)
- getprotobynumber_r(3)
- utmpxname(3)
- isinf(3)
- clearerr_unlocked(3)
- stime(2)
- nftw(3)
- duplocale(3)
- svcraw_create(3)
- svc_getcaller(3)
- ctanhl(3)
- cbrt(3)
- floorf(3)
- sethostid(3)
- sigemptyset(3)
- sigaltstack(2)
- mkfifo(3)
- lsearch(3)
- getservent_r(3)
- islessgreater(3)
- floor(3)
- argz_append(3)
- tzset(3)
- res_mkquery(3)
- fstatat(2)
- strchr(3)
- semtimedop(2)
- bindresvport(3)
- tcsetattr(3)
- warn(3)
- getservent(3)
- atanhl(3)
- tdelete(3)
- ynf(3)
- ether_ntoa_r(3)
- fesetenv(3)
- mq_timedsend(3)
- quotactl(2)
- init_module(2)
- rcmd(3)
- fenv(3)
- getutxid(3)
- pthread_mutexattr_getpshared(3)
- scalbnl(3)
- atan2l(3)
- argz_count(3)
- rpmatch(3)
- timerfd_gettime(2)
- ualarm(3)
- pthread_attr_init(3)
- vdprintf(3)
- pthread_cancel(3)
- fflush(3)
- setkey_r(3)
- mbstowcs(3)
- mremap(2)
- strcasestr(3)
- hcreate_r(3)
- siginterrupt(3)
- offsetof(3)
- atan(3)
- wctomb(3)
- getutent(3)
- significand(3)
- arm_fadvise64_64(2)
- dremf(3)
- wcswidth(3)
- syscall(2)
- rintf(3)
- bswap_64(3)
- pthread_attr_getschedparam(3)
- lroundf(3)
- timegm(3)
- posix_fadvise(2)
- getrlimit(2)
- svc_freeargs(3)
- xdr_enum(3)
- hcreate(3)
- ptrace(2)
- backtrace_symbols_fd(3)
- fetestexcept(3)
- ccosh(3)
- htole32(3)
- kexec_load(2)
- fallocate(2)
- timer_gettime(2)
- tgammaf(3)
- errno(3)
- sched_get_priority_max(2)
- xdr_getpos(3)
- vwprintf(3)
- ssetmask(2)
- ether_ntoa(3)
- waitpid(2)
- sched_getattr(2)
- inotify_init(2)
- fma(3)
- gnu_get_libc_version(3)
- svctcp_create(3)
- wcstombs(3)
- gethostname(2)
- strerror_r(3)
- sigismember(3)
- fgetws_unlocked(3)
- hash(3)
- circleq(3)
- getrpcbynumber_r(3)
- pthread_cond_timedwait(3)
- uname(2)
- fgetc_unlocked(3)
- mq_open(3)
- cosl(3)
- rewinddir(3)
- nextdown(3)
- longjmp(3)
- execv(3)
- iconv_open(3)
- xencrypt(3)
- ctermid(3)
- isgraph_l(3)
- move_pages(2)
- isunordered(3)
- msgsnd(2)
- rt_sigtimedwait(2)
- syncfs(2)
- mlockall(2)
- pthread_getschedparam(3)
- lsetxattr(2)
- getutid_r(3)
- log1pl(3)
- catanf(3)
- passwd2des(3)
- iconv_close(3)
- aligned_alloc(3)
- sched_setscheduler(2)
- gmtime(3)
- __free_hook(3)
- acoshf(3)
- mtrace(3)
- resolver(3)
- clog10f(3)
- sethostname(2)
- pthread_attr_setguardsize(3)
- tuxcall(2)
- atanh(3)
- ispunct_l(3)
- svcudp_bufcreate(3)
- ctanh(3)
- j1l(3)
- log10l(3)
- alloca(3)
- sigpending(2)
- nexttoward(3)
- isnormal(3)
- svc_getreq(3)
- putchar(3)
- getnetbyaddr(3)
- cpowl(3)
- get_kernel_syms(2)
- getutline_r(3)
- pthread_setaffinity_np(3)
- isnan(3)
- getprotoent(3)
- catclose(3)
- getsid(2)
- endrpcent(3)
- fts_close(3)
- gnu_dev_minor(3)
- ruserok_af(3)
- getutent_r(3)
- getegid(2)
- sgetmask(2)
- posix_memalign(3)
- atanf(3)
- unshare(2)
- lremovexattr(2)
- strncasecmp(3)
- endutent(3)
- updwtmpx(3)
- outsw(2)
- sched_getparam(2)
- setuid32(2)
- catgets(3)
- nextupl(3)
- openat(2)
- logout(3)
- free(3)
- setfsuid(2)
- getutline(3)
- svc_sendreply(3)
- fadvise64_64(2)
- cargf(3)
- __ppc_set_ppr_low(3)
- casinh(3)
- outb_p(2)
- fputwc(3)
- log10f(3)
- getnetgrent(3)
- fputws_unlocked(3)
- ffsl(3)
- endttyent(3)
- isgreater(3)
- sigmask(3)
- sgetspent_r(3)
- fmaxf(3)
- openlog(3)
- strncmp(3)
- closedir(3)
- rexec_af(3)
- exp2(3)
- mcheck(3)
- isalpha(3)
- pthread_mutex_init(3)
- catopen(3)
- clock_nanosleep(2)
- ioctl(2)
- remainder(3)
- olduname(2)
- getcpu(2)
- setns(2)
- asinhl(3)
- wcscasecmp(3)
- nearbyintl(3)
- atan2f(3)
- wctob(3)
- nextdownf(3)
- gmtime_r(3)
- fmal(3)
- setfsgid32(2)
- dlinfo(3)
- posix_spawnp(3)
- fgets_unlocked(3)
- major(3)
- fseek(3)
- xdr_callhdr(3)
- execve(2)
- exit(3)
- makecontext(3)
- sysctl(2)
- oldolduname(2)
- getgrouplist(3)
- pthread_getattr_np(3)
- ffs(3)
- sem_init(3)
- gcvt(3)
- fts_children(3)
- rt_sigreturn(2)
- mallinfo(3)
- insl(2)
- geteuid(2)
- signalfd(2)
- erfcl(3)
- sched_get_priority_min(2)
- sched_setaffinity(2)
- wcsrchr(3)
- xdr_reference(3)
- snprintf(3)
- delete_module(2)
- j0f(3)
- malloc_hook(3)
- casinf(3)
- y0f(3)
- endgrent(3)
- y1l(3)
- pthread_create(3)
- wcsncasecmp(3)
- pidfd_getfd(2)
- htobe64(3)
- _sysctl(2)
- lrand48_r(3)
- warnx(3)
- lgammaf_r(3)
- verrx(3)
- finit_module(2)
- gsignal(3)
- recvfrom(2)
- log2(3)
- fflush_unlocked(3)
- getaliasbyname_r(3)
- pthread_mutexattr_setrobust(3)
- getdirentries(3)
- getrpcbyname_r(3)
- ppoll(2)
- tmpfile(3)
- isupper_l(3)
- xdr_free(3)
- res_nquery(3)
- fts_open(3)
- shutdown(2)
- xdr_callmsg(3)
- coshl(3)
- ntp_gettimex(3)
- afs_syscall(2)
- be32toh(3)
- fchmodat(2)
- addseverity(3)
- pause(2)
- strcmp(3)
- mkostemps(3)
- wcsrtombs(3)
- scandir(3)
- __freadable(3)
- killpg(3)
- add_key(2)
- strcoll(3)
- migrate_pages(2)
- pthread_setattr_default_np(3)
- pthread_attr_setsigmask_np(3)
- sigabbrev_np(3)
- readdir(2)
- subpage_prot(2)
- strfromf(3)
- sysv_signal(3)
- gethostbyname2_r(3)
- outl_p(2)
- sync(2)
- pthread_attr_getinheritsched(3)
- socket(2)
- msgrcv(2)
- fgetws(3)
- pthread_cleanup_push_defer_np(3)
- getnetgrent_r(3)
- ynl(3)
- endservent(3)
- srand(3)
- endmntent(3)
- cbrtl(3)
- setitimer(2)
- pmap_rmtcall(3)
- svcerr_systemerr(3)
- fesetround(3)
- ilogbf(3)
- __fwriting(3)
- log1p(3)
- futimens(3)
- xdrrec_endofrecord(3)
- setreuid32(2)
- swab(3)
- pthread_spin_init(3)
- memchr(3)
- fminf(3)
- getipnodebyname(3)
- msgop(2)
- wait(2)
- ether_aton_r(3)
- open_wmemstream(3)
- xdr_bool(3)
- pthread_tryjoin_np(3)
- xdr_int(3)
- inet_net_ntop(3)
- fdimf(3)
- srand48(3)
- xdr_setpos(3)
- asinf(3)
- program_invocation_name(3)
- write(2)
- mkdtemp(3)
- pthread_cleanup_pop(3)
- ptsname_r(3)
- lgammal_r(3)
- pthread_attr_getstackaddr(3)
- authunix_create(3)
- getpmsg(2)
- ceill(3)
- cexp2f(3)
- kcmp(2)
- setup(2)
- err(3)
- sync_file_range2(2)
- getpid(2)
- wcsncat(3)
- envz_get(3)
- futimes(3)
- mincore(2)
- herror(3)
- ether_line(3)
- feholdexcept(3)
- fputc(3)
- keyctl(2)
- timer_delete(2)
- posix_spawn(3)
- faccessat2(2)
- setnetgrent(3)
- pwrite(2)
- aio_read(3)
- shmget(2)
- acosh(3)
- sigdelset(3)
- __ppc_get_timebase(3)
- __flbf(3)
- dladdr1(3)
- argz_create_sep(3)
- mblen(3)
- gethostent(3)
- pciconfig_iobase(2)
- recvmmsg(2)
- isprint_l(3)
- csqrtf(3)
- wcstoimax(3)
- hsearch_r(3)
- svcudp_create(3)
- setreuid(2)
- le16toh(3)
- name_to_handle_at(2)
- strftime_l(3)
- pthread_attr_setschedparam(3)
- eventfd(2)
- atanhf(3)
- pthread_setspecific(3)
- pthread_cond_init(3)
- acosl(3)
- llistxattr(2)
- fputwc_unlocked(3)
- scanf(3)
- getmntent_r(3)
- getchar(3)
- res_ninit(3)
- error_one_per_line(3)
- sigsetmask(3)
- putwchar(3)
- llroundf(3)
- rt_sigpending(2)
- send(2)
- wcsstr(3)
- log2l(3)
- fmod(3)
- va_copy(3)
- res_search(3)
- res_nsend(3)
- res_query(3)
- wait3(2)
- encrypt_r(3)
- system(3)
- close_range(2)
- ecvt_r(3)
- read(2)
- auth_destroy(3)
- realloc(3)
- pipe2(2)
- dn_expand(3)
- timerclear(3)
- get_avphys_pages(3)
- mbsnrtowcs(3)
- strtok(3)
- fwide(3)
- __ppc_get_timebase_freq(3)
- gai_suspend(3)
- stpcpy(3)
- lldiv(3)
- iswxdigit(3)
- posix_openpt(3)
- s390_pci_mmio_write(2)
- pthread_spin_destroy(3)
- callrpc(3)
- getifaddrs(3)
- aio_suspend(3)
- fread_unlocked(3)
- get_nprocs_conf(3)
- getuid(2)
- spu_run(2)
- termios(3)
- umask(2)
- csqrtl(3)
- register_printf_modifier(3)
- sem_trywait(3)
- tee(2)
- msync(2)
- mpool(3)
- setdomainname(2)
- fopencookie(3)
- nl_langinfo(3)
- sockatmark(3)
- getspent_r(3)
- casinhl(3)
- fdiml(3)
- ntohs(3)
- fgets(3)
- time(2)
- casinl(3)
- pthread_detach(3)
- seccomp_unotify(2)
apt-get install manpages-dev
Available languages:
en fr ruManual
perf_event_open
NOMBIBLIOTHĂQUE
SYNOPSIS
DESCRIPTION
Argument
Lecture des résultats
Disposition MMAP
Gestion du dépassement
Instruction rdpmc
Appels ioctl perf_event
Utilisation de prctl(2)
Fichiers de configuration relatifs Ă perf_event
VALEUR RENVOYĂE
ERREURS
STANDARDS
HISTORIQUE
NOTES
BOGUES
EXEMPLES
VOIR AUSSI
TRADUCTION
NOM
perf_event_open - Définir la surveillance des performances
BIBLIOTHĂQUE
BibliothĂšque C standard ( libc , -lc )
SYNOPSIS
#include
<linux/perf_event.h>
/* Définition des
constantes
PERF_*
*/
#include <linux/hw_breakpoint.h>
/*
Définition des constantes
HW_*
*/
#include <sys/syscall.h>
/* Définition des
constantes
SYS_*
*/
#include <unistd.h>
int
syscall(SYS_perf_event_open, struct perf_event_attr
*
attr
,
pid_t
pid
, int
cpu
, int
group_fd
, unsigned long
flags
);
Remarque : la glibc ne fournit pas dâenveloppe pour perf_event_open (), imposant lâutilisation de syscall (2).
DESCRIPTION
Ă partir dâune liste de paramĂštres, perf_event_open () renvoie un descripteur de fichier, pour une utilisation dans les appels systĂšme suivants ( read (2), mmap (2), prctl (2), fcntl (2), etc.).
Un appel de perf_event_open () crĂ©e un descripteur de fichier qui permet de mesurer les renseignements de performance. Tous les descripteurs de fichier correspondent chacun Ă un Ă©vĂ©nement mesuré ; ils peuvent ĂȘtre regroupĂ©s pour mesurer plusieurs Ă©vĂ©nements simultanĂ©ment.
Les Ă©vĂ©nements peuvent ĂȘtre activĂ©s et dĂ©sactivĂ©s de deux façons : Ă lâaide de ioctl (2) ou de prctl (2). Quand un Ă©vĂ©nement est dĂ©sactivĂ©, il ne dĂ©compte ni ne gĂ©nĂšre de dĂ©passement, mais continue vraiment dâexister et maintient sa valeur de dĂ©compte.
Les Ă©vĂ©nements sont de deux types : comptage et Ă©chantillonnage. Un Ă©vĂ©nement de comptage sert Ă comptabiliser le nombre total dâĂ©vĂ©nements qui se produisent. En gĂ©nĂ©ral, les rĂ©sultats dâun Ă©vĂ©nement de comptage sont recueillis avec un appel read (2). Un Ă©vĂ©nement dâ Ă©chantillonnage Ă©crit pĂ©riodiquement les mesures dans un tampon qui peut ensuite ĂȘtre accĂ©dĂ© Ă lâaide de mmap (2).
Argument
Les arguments
pid
et
cpu
permettent dâindiquer le
processus et le processeur à surveiller :
pid == 0
et
cpu == -1
Cela mesure le processus ou thread appelant sur tous les processeurs.
pid == 0 et cpu >= 0
Cela ne mesure le processus ou thread appelant que sâil est en cours dâexĂ©cution sur le processeur indiquĂ©.
pid > 0 et cpu == -1
Cela mesure le processus ou thread indiqué sur tous les processeurs.
pid > 0 et cpu >= 0
Cela ne mesure le processus ou thread indiquĂ© que sâil est en cours dâexĂ©cution sur le processeur indiquĂ©.
pid == -1 et cpu >= 0
Cela mesure tous les processus et threads du processeur indiqué. Cela nécessite la capacité CAP_PERFMON (depuis Linux 5.8) ou CAP_SYS_ADMIN ou une valeur /proc/sys/kernel/perf_event_paranoid strictement inférieure à 1 .
pid == -1 et cpu == -1
Ce réglage est incorrect et renverra une erreur.
Quand pid est supĂ©rieur Ă zĂ©ro, le droit dâeffectuer cet appel systĂšme est gĂ©rĂ© par CAP_PERFMON (depuis Linux 5.9) et une vĂ©rification PTRACE_MODE_READ_REALCREDS du mode dâaccĂšs ptrace sur les anciennes versions du noyau ; voir ptrace (2).
Lâargument group_fd permet aux groupes dâĂ©vĂ©nements dâĂȘtre créés. Un groupe dâĂ©vĂ©nements a un Ă©vĂ©nement qui est le leader de groupe. Le leader est dâabord créé avec group_fd = -1 . Les autres membres du groupe sont créés par les appels perf_event_open () suivants, avec group_fd dĂ©fini au descripteur de fichier du leader de groupe (un Ă©vĂ©nement unique créé avec group_fd = -1 est considĂ©rĂ© comme formant un groupe dâun seul membre). Un Ă©vĂ©nement de groupe est programmĂ© dans le processeur comme un bloc : il ne sera mis dans le processeur que si tous les Ă©vĂ©nements du groupe peuvent ĂȘtre mis dans le processeur. Cela veut dire que les valeurs des Ă©vĂ©nements de tous les membres peuvent ĂȘtre comparĂ©es â ajoutĂ©es, divisĂ©es (pour obtenir des rapports), etc. â ensemble de maniĂšre significative, puisquâelles ont comptĂ© les Ă©vĂ©nements pendant les mĂȘmes instructions exĂ©cutĂ©es.
Lâargument
flags
est constituĂ© dâun
OU
binaire entre une ou plusieurs des valeurs suivantes.
PERF_FLAG_FD_CLOEXEC
(depuis Linux 3.14)
Cet attribut active lâattribut « close-on-exec » pour le descripteur de fichier de lâĂ©vĂ©nement créé, de telle sorte que le descripteur de fichier est automatiquement fermĂ© par execve (2). Lâattribution de « close-on-exec » au moment de la crĂ©ation, plutĂŽt quâensuite avec fcntl (2), Ă©vite de potentielles situations de compĂ©tition oĂč le thread appelant invoque perf_event_open () et fcntl () en mĂȘme temps quâun autre thread appelle fork (2) puis execve (2).
PERF_FLAG_FD_NO_GROUP
Cet attribut dit Ă lâĂ©vĂ©nement dâignorer le paramĂštre group_fd , sauf pour initialiser la redirection de la sortie en utilisant lâattribut PERF_FLAG_FD_OUTPUT .
PERF_FLAG_FD_OUTPUT (cassé depuis Linux 2.6.35)
Cet attribut redirige la sortie Ă©chantillonnĂ©e de lâĂ©vĂ©nement vers le tampon mmap de lâĂ©vĂ©nement indiquĂ© par group_fd .
PERF_FLAG_PID_CGROUP (depuis Linux 2.6.39)
Cet attribut active la surveillance par conteneur sur tout le systĂšme. Un conteneur est une abstraction qui isole un ensemble de ressources Ă contrĂŽler plus finement (processeurs, mĂ©moire, etc.). Dans ce mode, lâĂ©vĂ©nement nâest mesurĂ© que si le thread exĂ©cutĂ© sur le processeur surveillĂ© appartient au conteneur dĂ©signĂ© (cgroup). Le cgroup est identifiĂ© en passant un fichier au descripteur de fichier ouvert sur son rĂ©pertoire dans le systĂšme de fichiers cgroupfs. Par exemple, si le cgroup Ă surveiller est appelĂ© test , alors un descripteur de fichier ouvert sur /dev/cgroup/test (en supposant que cgroupfs est montĂ© sur /dev/cgroup ) doit ĂȘtre passĂ© au paramĂštre pid . La surveillance de cgroup nâest disponible que pour les Ă©vĂ©nements sur tout le systĂšme et pourrait donc nĂ©cessiter des droits supplĂ©mentaires.
La structure perf_event_attr fournit des renseignements de configuration détaillés pour les événements en cours de création.
struct
perf_event_attr {
__u32 type; /* Type dâĂ©vĂ©nement */
__u32 size; /* Taille de la structure dâattributs */
__u64 config; /* Configuration spécifique au type */
union {
__u64 sample_period; /* Période
dâĂ©chantillonnage */
__u64 sample_freq; /* Fréquence
dâĂ©chantillonnage */
};
__u64 sample_type; /* Indique les valeurs incluses dans
lâĂ©chantillon */
__u64 read_format; /* Indique les valeurs renvoyées
en
lecture */
__u64 disabled : 1, /* désactivé par
défaut */
inherit : 1, /* les enfants en héritent */
pinned : 1, /* doit toujours ĂȘtre en PMU */
exclusive : 1, /* ne regrouper quâen PMU */
exclude_user : 1, /* ne pas compter lâutilisateur */
exclude_kernel : 1, /* ne pas compter le noyau */
exclude_hv : 1, /* ne pas compter lâhyperviseur */
exclude_idle : 1, /* ne pas compter quand inactif */
mmap : 1, /* inclure les données mmap */
comm : 1, /* inclure les données comm */
freq : 1, /* utiliser la fréquence, pas la
période */
inherit_stat : 1, /* décomptes par tùche */
enable_on_exec : 1, /* prochain exec activé */
task : 1, /* tracer la crĂ©ation dâenfant
et la fin */
watermark : 1, /* wakeup_watermark */
precise_ip : 2, /* contrainte de dérapage */
mmap_data : 1, /* données mmap non
exécutées */
sample_id_all : 1, /* tous les événements
sample_type */
exclude_host : 1, /* ne pas compter dans lâhĂŽte
*/
exclude_guest : 1, /* ne pas compter dans
lâinvitĂ© */
exclude_callchain_kernel : 1,
/* exclure les appels en chaĂźne
du noyau */
exclude_callchain_user : 1,
/* exclure les appels en chaĂźne
dâutilisateur */
mmap2 : 1, /* inclure mmap avec les données
dâinĆud */
comm_exec : 1, /* événements flag comm devant
ĂȘtre
exécutés */
use_clockid : 1, /* utiliser clockid pour les champs de
temps */
context_switch : 1, /* données de changement de
contexte */
write_backward : 1, /* Ăcrire le tampon circulaire de
la fin
vers le début */
namespaces : 1, /* inclure les données des espaces de
noms */
ksymbol : 1, /* inclure les événements ksymbol
*/
bpf_event : 1, /* inclure les événements BPF
*/
aux_output : 1, /* générer les enregistrements
AUX au lieu des
événements */
cgroup : 1, /* inclure les événements cgroup
*/
text_poke : 1, /* inclure les événements de
poke de texte */
build_id : 1, /* utiliser build id dans les
événements mmap2 */
inherit_thread : 1, /* seuls les enfants en héritent
*/
/* si cloné avec CLONE_THREAD */
remove_on_exec : 1, /* lâĂ©vĂ©nement est
supprimé des tùches
Ă lâexĂ©cution */
sigtrap : 1, /* envoyer un SIGTRAP synchrone
lors dâun Ă©vĂ©nement */
__reserved_1 : 26;
union {
__u32 wakeup_events; /* réveil tous les n
événements */
__u32 wakeup_watermark; /* octets avant le réveil */
};
__u32 bp_type; /* type de point dâarrĂȘt */
union {
__u64 bp_addr; /* adresse de point dâarrĂȘt */
__u64 kprobe_func; /* pour perf_kprobe */
__u64 uprobe_path; /* pour perf_uprobe */
__u64 config1; /* extension de config */
};
union {
__u64 bp_len; /* taille de point dâarrĂȘt */
__u64 kprobe_addr; /* avec kprobe_func == NULL */
__u64 probe_offset; /* pour perf_[k,u]probe */
__u64 config2; /* extension de config1 */
};
__u64 branch_sample_type; /* enum perf_branch_sample_type */
__u64 sample_regs_user; /* registres utilisateur Ă
renvoyer
dans les échantillons */
__u32 sample_stack_user; /* taille de pile Ă renvoyer
dans
les échantillons */
__s32 clockid; /* horloge Ă utiliser pour les champs
de temps */
__u64 sample_regs_intr; /* registres Ă renvoyer dans
les
échantillons */
__u32 aux_watermark; /* octets supp. avant le réveil
*/
__u16 sample_max_stack; /* nombre maximal de trames dans la
chaĂźne dâappel */
__u32 __reserved_2; /* aligner sur u64 */
__u32 aux_sample_size; /* taille maximale
dâĂ©chantillon aux */
__u32 __reserved_3; /* aligner sur u64 */
__u64 sig_data; /* données utilisateur pour sigtrap
*/
};
Les champs de la structure perf_event_attr sont décrits en détail ci-dessous.
|
type |
Ce champ indique le type dâĂ©vĂ©nement dans son ensemble. Il a une des valeurs suivantes : |
PERF_TYPE_HARDWARE
Cela indique un des événements matériels « généralisés » fournis par le noyau. Consultez la définition du champ config pour plus de précisions.
PERF_TYPE_SOFTWARE
Cela indique un des Ă©vĂ©nements logiciels fournis par le noyau (mĂȘme si aucune prise en charge matĂ©rielle nâest disponible).
PERF_TYPE_TRACEPOINT
Cela indique un point de trace fourni par lâinfrastructure de point de trace du noyau.
PERF_TYPE_HW_CACHE
Cela indique un événement de cache matériel. Cela a un encodage particulier décrit dans la définition du champ config .
PERF_TYPE_RAW
Cela indique un Ă©vĂ©nement « brut » spĂ©cifique Ă lâimplĂ©mentation dans le champ config .
PERF_TYPE_BREAKPOINT (depuis Linux 2.6.33)
Cela indique un point dâarrĂȘt matĂ©riel tel que fourni par le processeur. Les points dâarrĂȘt peuvent ĂȘtre des accĂšs en lecture ou Ă©criture sur une adresse ainsi que lâexĂ©cution dâune adresse dâinstruction.
PMU dynamique
Depuis Linux 2.6.38, perf_event_open () permet de gĂ©rer plusieurs PMU. Pour activer cela, une valeur exportĂ©e par le noyau peut ĂȘtre utilisĂ©e dans le champ type pour indiquer la PMU Ă utiliser. La valeur Ă utiliser est trouvable dans le systĂšme de fichiers sysfs : un sous-rĂ©pertoire existe par instance PMU sous /sys/bus/event_source/devices . Le fichier type dans chaque sous-rĂ©pertoire contient un entier qui peut ĂȘtre utilisĂ© dans le champ type . Par exemple, /sys/bus/event_source/devices/cpu/type contient la valeur de PMU du processeur principal, câest-Ă -dire 4 en gĂ©nĂ©ral.
kprobe et uprobe (depuis Linux 4.17)
Ces deux PMU dynamiques créent un kprobe/uprobe et le rattachent à un descripteur de fichier généré par perf_event_open. kprobe/uprobe sera détruit lors de la destruction du descripteur de fichier. Voir les champs kprobe_func , uprobe_path , kprobe_addr et probe_offset pour plus de détails.
|
size |
La taille de la structure perf_event_attr pour compatibilités ascendante et descendante. Définissez-la en utilisant sizeof(struct perf_event_attr) pour permettre au noyau de voir la taille de struct au moment de la compilation. |
Le PERF_ATTR_SIZE_VER0 relatif est dĂ©fini Ă 64 ; câĂ©tait la taille de la premiĂšre struct publiĂ©e. PERF_ATTR_SIZE_VER1 est 72, correspondant Ă lâaddition des points dâarrĂȘts dans Linux 2.6.33. PERF_ATTR_SIZE_VER2 est 80, correspondant Ă lâaddition dâĂ©chantillonnage de branchement dans Linux 3.4. PERF_ATR_SIZE_VER3 est 96, correspondant Ă lâaddition de sample_regs_user et sample_stack_user dans Linux 3.7. PERF_ATTR_SIZE_VER4 vaut 104, correspondant Ă lâajout de sample_regs_intr dans Linux 3.19. PERF_ATTR_SIZE_VER5 vaut 112, correspondant Ă lâajout de aux_watermark dans Linux 4.1.
|
config |
Cela indique lâĂ©vĂ©nement voulu, en conjonction avec le champ type . Les champs config1 et config2 sont aussi pris en compte dans les cas oĂč 64 bits ne suffisent pas pour spĂ©cifier complĂštement lâĂ©vĂ©nement. Lâencodage de ces champs dĂ©pend de lâĂ©vĂ©nement. |
Le champ config peut ĂȘtre dĂ©fini de diffĂ©rentes façons, en fonction de la valeur du champ type prĂ©cĂ©demment dĂ©crit. Suivent les divers rĂ©glages possibles pour config , distinguĂ©s par type .
Si type est PERF_TYPE_HARDWARE , un des événements processeur matériel généralisé est mesuré. Ils ne sont pas tous disponibles sur toutes les plateformes. Définissez config à une des valeurs suivantes :
PERF_COUNT_HW_CPU_CYCLES
Nombre total de cycles. Méfiez-vous de ce qui arrive lors de la variation de fréquence du processeur.
PERF_COUNT_HW_INSTRUCTIONS
Instructions retirĂ©es. Prenez garde, elles peuvent ĂȘtre affectĂ©es par plusieurs problĂšmes, en particulier les dĂ©comptes dâinterruptions matĂ©rielles.
PERF_COUNT_HW_CACHE_REFERENCES
AccÚs au cache. En général, cela indique les accÚs au cache de dernier niveau, mais cela peut dépendre du processeur. Cela pourrait inclure des messages de prélecture et de cohérence ; cela dépend toujours de la conception du processeur.
PERF_COUNT_HW_CACHE_MISSES
Absences dans le cache. Cela indique gĂ©nĂ©ralement les absences dans le cache de dernier niveau, câest destinĂ© Ă ĂȘtre utilisĂ© en conjonction avec lâĂ©vĂ©nement PERF_COUNT_HW_CACHE_REFERENCES pour calculer le taux dâabsence du cache.
PERF_COUNT_HW_BRANCH_INSTRUCTIONS
Instructions de branchements retirĂ©s. Avant Linux 2.6.34, cela utilisait lâĂ©vĂ©nement incorrect sur les processeurs AMD.
PERF_COUNT_HW_BRANCH_MISSES
Instructions de branchements mal prédits.
PERF_COUNT_HW_BUS_CYCLES
Cycles de bus, ce qui peut ĂȘtre diffĂ©rent du dĂ©compte total de cycles.
PERF_COUNT_HW_STALLED_CYCLES_FRONTEND (depuis Linux 3.0)
Cycles bloqués pendant un problÚme.
PERF_COUNT_HW_STALLED_CYCLES_BACKEND (depuis Linux 3.0)
Cycles bloqués pendant un retrait.
PERF_COUNT_HW_REF_CPU_CYCLES (depuis Linux 3.3)
Nombre total de cycles ; non affecté par la variation de fréquence du processeur.
Si type est PERF_TYPE_SOFTWARE , les événements logiciels fournis par le noyau sont mesurés. Définissez config à une des valeurs suivantes :
PERF_COUNT_SW_CPU_CLOCK
Cela rend compte de lâhorloge du processeur, un temporisateur par processeur Ă haute rĂ©solution.
PERF_COUNT_SW_TASK_CLOCK
Cela rend compte de lâhorloge spĂ©cifique Ă la tĂąche en cours dâexĂ©cution.
PERF_COUNT_SW_PAGE_FAULTS
Cela rend compte du nombre dâerreurs de pagination.
PERF_COUNT_SW_CONTEXT_SWITCHES
Cela compte les changements de contexte. JusquâĂ Linux 2.6.34, ils Ă©taient tous signalĂ©s comme des Ă©vĂ©nements en espace utilisateur, ils sont maintenant signalĂ©s comme ayant lieu dans le noyau.
PERF_COUNT_SW_CPU_MIGRATIONS
Cela rend compte du nombre de fois oĂč le processus a migrĂ© vers un nouveau processeur.
PERF_COUNT_SW_PAGE_FAULTS_MIN
Cela compte le nombre dâerreurs mineures de pagination. Elles nâont pas nĂ©cessitĂ© dâentrĂ©es ou sorties du disque pour les traiter.
PERF_COUNT_SW_PAGE_FAULTS_MAJ
Cela compte le nombre dâerreurs majeures de pagination. Elles ont nĂ©cessitĂ© des entrĂ©es ou sorties de disque pour les traiter.
PERF_COUNT_SW_ALIGNMENT_FAULTS (depuis Linux 2.6.33)
Cela compte le nombre de dĂ©fauts dâalignement. Ils ont lieu lors dâaccĂšs non alignĂ©s en mĂ©moire ; le noyau peut les traiter mais cela rĂ©duit les performances. Cela nâarrive que sur certaines architectures (jamais sur x86).
PERF_COUNT_SW_EMULATION_FAULTS (depuis Linux 2.6.33)
Cela compte le nombre de dĂ©fauts dâĂ©mulation. Le noyau intercepte parfois des instructions non implĂ©mentĂ©es et les Ă©mule pour lâespace utilisateur. Cela peut avoir des consĂ©quences nĂ©gatives sur les performances.
PERF_COUNT_SW_DUMMY (depuis Linux 3.12)
Câest un Ă©vĂ©nement fictif qui ne compte rien. Les types dâenregistrement dâĂ©chantillonnage informatif comme mmap ou comm doivent ĂȘtre associĂ©s Ă un Ă©vĂ©nement actif. Cet Ă©vĂ©nement factice permet de rĂ©cupĂ©rer ce genre dâenregistrements sans nĂ©cessiter dâĂ©vĂ©nement de comptage.
PERF_COUNT_SW_BPF_OUTPUT (depuis Linux 4.4)
Cela est utilisĂ© pour gĂ©nĂ©rer des donnĂ©es dâĂ©chantillonnage brutes Ă partir de BPF. Les programmes BPF peuvent Ă©crire sur cet Ă©vĂ©nement en utilisant lâassistant bpf_perf_event_output .
PERF_COUNT_SW_CGROUP_SWITCHES (since Linux 5.13)
Cela compte les changements de contexte dâune tĂąche dans un cgroup diffĂ©rent. En dâautres termes, si la tĂąche suivante est dans le mĂȘme cgroup, il ne comptera le changement.
Si type est PERF_TYPE_TRACEPOINT , alors les points de trace du noyau sont mesurĂ©s. La valeur Ă utiliser dans config peut ĂȘtre obtenue depuis tracing/events/*/*/id de debugfs si ftrace est activĂ© dans le noyau.
Si type est PERF_TYPE_HW_CACHE , alors un Ă©vĂ©nement de cache du processeur matĂ©riel est mesurĂ©. Utilisez lâĂ©quation suivante pour calculer la valeur config appropriĂ©e.
config =
(perf_hw_cache_id) |
(perf_hw_cache_op_id << 8) |
(perf_hw_cache_op_result_id << 16);
oĂč perf_hw_cache_id peut ĂȘtre :
PERF_COUNT_HW_CACHE_L1D
pour mesurer le cache de données de niveau 1 ;
PERF_COUNT_HW_CACHE_L1I
pour mesurer le cache dâinstructions de niveau 1 ;
PERF_COUNT_HW_CACHE_LL
pour mesurer le cache de dernier niveau ;
PERF_COUNT_HW_CACHE_DTLB
pour mesurer les données TLB ;
PERF_COUNT_HW_CACHE_ITLB
pour mesurer les instructions TLBÂ ;
PERF_COUNT_HW_CACHE_BPU
pour mesurer lâunitĂ© de prĂ©diction de branchement ;
PERF_COUNT_HW_CACHE_NODE (depuis Linux 3.1)
pour mesurer les accÚs à la mémoire locale.
et perf_hw_cache_op_id est parmi :
PERF_COUNT_HW_CACHE_OP_READ
pour les accÚs en lecture ;
PERF_COUNT_HW_CACHE_OP_WRITE
pour les accÚs en écriture ;
PERF_COUNT_HW_CACHE_OP_PREFETCH
pour les accÚs de prélecture
et perf_hw_cache_op_result_id peut ĂȘtre :
PERF_COUNT_HW_CACHE_RESULT_ACCESS
pour mesurer les accÚs ;
PERF_COUNT_HW_CACHE_RESULT_MISS
pour mesurer les échecs.
Si type est PERF_TYPE_RAW , alors une valeur config « brute » personnalisĂ©e est nĂ©cessaire. La plupart des processeurs gĂšrent les Ă©vĂ©nements qui ne sont pas couverts par les Ă©vĂ©nements « gĂ©nĂ©ralisĂ©s ». Ceux-ci sont dĂ©finis par lâimplĂ©mentation ; consultez le manuel du processeur (par exemple la documentation Intel Volume 3B ou le guide du dĂ©veloppeur de BIOS et noyau AMD). La bibliothĂšque libpfm4 peut ĂȘtre utilisĂ©e pour traduire le nom, dans les manuels architecturaux, en valeur hexadĂ©cimale brute que perf_event_open () attend dans ce champ.
Si type est PERF_TYPE_BREAKPOINT , alors laissez config défini à zéro. Ses paramÚtres sont définis ailleurs.
Si type est kprobe ou uprobe , définir retprobe (bit 0 de config , voir /sys/bus/event_source/devices/[k,u]probe/format/retprobe ) pour kretprobe/uretprobe. Voir les champs kprobe_func , uprobe_path , kprobe_addr et probe_offset pour plus de détails.
kprobe_func
uprobe_path
kprobe_addr
probe_offset
Ces champs décrivent les kprobe/uprobe pour les PMU dynamiques kprobe et uprobe . Pour kprobe utilisez kprobe_func et probe_offset ou alors utilisez kprobe_addr et laissez le champ kprobe_func à NULL. Pour uprobe , utilisez uprobe_path et probe_offset .
sample_period
sample_freq
Un compteur dâ« échantillonnage » gĂ©nĂšre une notification de dĂ©passement tous les N évĂ©nements, oĂč N est donnĂ© par sample_period . Un compteur dâĂ©chantillonnage a sample_period > 0. Quand un dĂ©passement arrive, les donnĂ©es demandĂ©es sont enregistrĂ©es dans le tampon mmap. Le champ sample_type contrĂŽle les donnĂ©es qui sont enregistrĂ©es Ă chaque dĂ©passement.
sample_freq permet dâutiliser la frĂ©quence au lieu de la pĂ©riode. Dans ce cas, lâattribut freq doit ĂȘtre dĂ©fini. Le noyau ajustera la pĂ©riode dâĂ©chantillonnage pour essayer dâatteindre le taux voulu. Le taux dâajustement est un tic dâhorloge.
sample_type
Les divers bits de ce champ
indiquent les valeurs Ă inclure dans
lâĂ©chantillon. Elles seront enregistrĂ©es
dans un tampon circulaire, disponible en espace utilisateur
avec
mmap
(2). Lâordre de sauvegarde des valeurs
dans lâĂ©chantillon est documentĂ© dans la
sous-section
Disposition MMAP
ci-dessous ; ce
nâest pas lâordre
enum
perf_event_sample_format
.
PERF_SAMPLE_IP
Enregistrement de pointeur dâinstruction.
PERF_SAMPLE_TID
Enregistrement des identifiants de processus et de thread.
PERF_SAMPLE_TIME
Enregistrement dâun horodatage.
PERF_SAMPLE_ADDR
Enregistrement dâune adresse, si applicable.
PERF_SAMPLE_READ
Enregistrement des valeurs de dĂ©compte de tous les Ă©vĂ©nements dâun groupe, pas seulement du leader de groupe.
PERF_SAMPLE_CALLCHAIN
Enregistrement de lâappel en chaĂźne (backtrace de pile).
PERF_SAMPLE_ID
Enregistrement dâun identifiant unique pour le leader de groupe dâĂ©vĂ©nements ouvert.
PERF_SAMPLE_CPU
Enregistrement de numéro de processeur.
PERF_SAMPLE_PERIOD
Enregistrement de la pĂ©riode dâĂ©chantillonnage actuelle.
PERF_SAMPLE_STREAM_ID
Enregistrement dâun identifiant unique pour lâĂ©vĂ©nement ouvert. Contrairement Ă PERF_SAMPLE_ID , le vĂ©ritable identifiant est renvoyĂ©, pas celui du leader de groupe. Cet identifiant est le mĂȘme que celui renvoyĂ© par PERF_FORMAT_ID .
PERF_SAMPLE_RAW
Enregistrement de données supplémentaires, si applicable. Normalement renvoyées par les événements de point de trace.
PERF_SAMPLE_BRANCH_STACK (depuis Linux 3.4)
Cela fournit un enregistrement des derniers branchements tels que fournis par le matĂ©riel dâĂ©chantillonnage de branchement processeur (comme le LBR â Last Branch Record â dâIntel). Les matĂ©riels ne prennent pas tous en charge cette fonctionnalitĂ©.
Consultez le champ branch_sample_type pour la façon de filtrer les branchements signalés.
PERF_SAMPLE_REGS_USER (depuis Linux 3.7)
Enregistrement de lâĂ©tat actuel du registre processeur au niveau utilisateur (les valeurs dans le processus avant dâappeler le noyau).
PERF_SAMPLE_STACK_USER (depuis Linux 3.7)
Enregistrement de la pile au niveau utilisateur, permettant le défilement de la pile.
PERF_SAMPLE_WEIGHT (depuis Linux 3.10)
Enregistrement dâune valeur de poids fournie par le matĂ©riel qui exprime le coĂ»t de lâĂ©vĂ©nement dâĂ©chantillonnage. Cela permet au matĂ©riel de mettre en valeur les Ă©vĂ©nements coĂ»teux dans un profil.
PERF_SAMPLE_DATA_SRC (depuis Linux 3.10)
Enregistrement des sources de donnĂ©es : dâoĂč viennent, dans la hiĂ©rarchie de mĂ©moire, les donnĂ©es associĂ©es Ă lâinstruction dâĂ©chantillonnage. Ce nâest disponible que si le matĂ©riel sous-jacent prend en charge cette fonctionnalitĂ©.
PERF_SAMPLE_IDENTIFIER (depuis Linux 3.12)
Placement de la valeur SAMPLE_ID Ă un endroit fixe de lâenregistrement, soit au dĂ©but (pour les Ă©vĂ©nements dâĂ©chantillonnage), soit Ă la fin (si ce nâest pas un Ă©vĂ©nement dâĂ©chantillonnage).
CâĂ©tait nĂ©cessaire parce quâun flux dâĂ©chantillonnage pourrait avoir des enregistrements provenant de diffĂ©rentes sources dâĂ©vĂ©nements avec des rĂ©glages de sample_type diffĂ©rents. Lâanalyse correcte du flux dâĂ©vĂ©nements nâĂ©tait pas possible parce que le format de lâenregistrement Ă©tait nĂ©cessaire pour trouver SAMPLE_ID , mais le format ne pouvait pas ĂȘtre trouvĂ© sans savoir Ă quel Ă©vĂ©nement lâĂ©chantillonnage appartenait (provoquant une dĂ©pendance circulaire).
Ce nouveau rĂ©glage PERF_SAMPLE_IDENTIFIER rend le flux dâĂ©vĂ©nements toujours analysable en plaçant SAMPLE_ID Ă une position fixe, mĂȘme si cela a pour consĂ©quence de dupliquer les valeurs SAMPLE_ID dans les enregistrements.
PERF_SAMPLE_TRANSACTION (depuis Linux 3.13)
Enregistrement des raisons pour les Ă©vĂ©nements dâabandon de mĂ©moire transactionnelle (venant par exemple de la prise en charge de mĂ©moire transactionnelle TSX Intel).
Le rĂ©glage precise_ip doit ĂȘtre positif et un Ă©vĂ©nement dâabandon de mĂ©moire transactionnelle doit ĂȘtre mesurĂ© sinon aucune valeur ne sera enregistrĂ©e. Remarquez Ă©galement que certaines mesures perf_event, comme le comptage de cycles dâĂ©chantillonnage, peuvent provoquer des abandons supplĂ©mentaires (en provoquant une interruption lors dâune transaction).
PERF_SAMPLE_REGS_INTR (depuis Linux 3.19)
Enregistrement dâun sous-ensemble de lâĂ©tat actuel du registre du processeur comme indiquĂ© par sample_regs_intr . Contrairement Ă PERF_SAMPLE_REGS_USER , les valeurs du registre renverront lâĂ©tat du registre du noyau si le dĂ©passement sâest produit alors que le code du noyau est en cours dâexĂ©cution. Si le processeur gĂšre lâĂ©chantillonnage matĂ©riel de lâĂ©tat du registre (Ă savoir PEBS sur Intel x86) et si precise_ip est supĂ©rieur Ă zĂ©ro, les valeurs du registre renvoyĂ©es sont celles rĂ©cupĂ©rĂ©es par le matĂ©riel au moment du retrait de lâinstruction Ă©chantillonnĂ©e.
PERF_SAMPLE_PHYS_ADDR (depuis Linux 4.13)
Enregistrement de lâadresse physique des donnĂ©es comme avec PERF_SAMPLE_ADDR .
PERF_SAMPLE_CGROUP (depuis Linux 5.7)
Enregistrement de lâidentifiant cgroup (perf_event) du processus. Cela correspond au champ id de lâĂ©vĂ©nement PERF_RECORD_CGROUP .
PERF_SAMPLE_DATA_PAGE_SIZE (depuis Linux 5.11)
Enregistrement de la taille de la page de données comme avec PERF_SAMPLE_ADDR .
PERF_SAMPLE_CODE_PAGE_SIZE (depuis Linux 5.11)
Enregistrement de la taille de la page de lâip comme avec PERF_SAMPLE_ADDR .
PERF_SAMPLE_WEIGHT_STRUCT (depuis Linux 5.12)
Enregistrement dâune valeur de poids fournie par le matĂ©riel comme PERF_SAMPLE_WEIGHT , mais il peut reprĂ©senter plusieurs valeur dans un struct. Il partage le mĂȘme espace que PERF_SAMPLE_WEIGHT , aussi les utilisateurs peuvent appliquer lâun ou lâautre, mais pas les deux Ă la fois. Il a le format suivant et la signification de chaque champ dĂ©pend de lâimplĂ©mentation matĂ©rielle.
union
perf_sample_weight {
u64 full; /* PERF_SAMPLE_WEIGHT */
struct { /* PERF_SAMPLE_WEIGHT_STRUCT */
u32 var1_dw;
u16 var2_w;
u16 var3_w;
};
};
read_format
Ce champ indique le format des
données renvoyées par
read
(2) sur un
descripteur de fichier
perf_event_open
().
PERF_FORMAT_TOTAL_TIME_ENABLED
Ajout du champ time_enabled de 64 bits. Cela peut servir Ă calculer les totaux estimĂ©s si la PMU est surutilisĂ©e et quâil y a multiplexage.
PERF_FORMAT_TOTAL_TIME_RUNNING
Ajout du champ time_running de 64 bits. Cela peut servir pour calculer les totaux estimĂ©s si la PMU est surutilisĂ©e et quâil y a multiplexage.
PERF_FORMAT_ID
Ajout dâune valeur unique de 64 bits qui correspond au groupe dâĂ©vĂ©nements.
PERF_FORMAT_GROUP
Permettre Ă toutes les valeurs de dĂ©compte dâun groupe dâĂ©vĂ©nements dâĂȘtre lues en une seule lecture.
PERF_FORMAT_LOST (depuis Linux 6.0)
Ajout dâune valeur 64 bits qui est le nombre dâĂ©chantillons perdus pour cet Ă©vĂ©nement. Ce ne devrait significatif uniquement quand sample_period ou sample_freq est dĂ©fini.
disabled
Le bit disabled indique si le compteur commence dĂ©sactivĂ© ou activĂ©. Si dĂ©sactivĂ©, lâĂ©vĂ©nement peut ĂȘtre activĂ© plus tard par ioctl (2), prctl (2) ou enable_on_exec .
Lors de la crĂ©ation dâun groupe dâĂ©vĂ©nements, le leader de groupe est gĂ©nĂ©ralement initialisĂ© avec disabled dĂ©fini Ă 1 et tous les Ă©vĂ©nements enfants sont initialisĂ©s avec disabled dĂ©fini Ă 0 . Bien que disabled soit 0 , les Ă©vĂ©nements enfants ne dĂ©marrent pas avant que le leader de groupe ne soit activĂ©.
inherit
Le bit inherit indique que le compteur devrait compter les Ă©vĂ©nements des tĂąches enfant comme les tĂąches indiquĂ©es. Cela ne sâapplique quâaux nouveaux enfants, pas Ă ceux existants au moment oĂč le compteur est créé (ni aux nouveaux enfants des enfants existants).
LâhĂ©ritage ne fonctionne pas pour certaines combinaisons de read_format , comme PERF_FORMAT_GROUP .
|
pinned |
Le bit pinned indique que le compteur devrait toujours ĂȘtre sur le processeur si câest possible. Cela ne sâapplique quâaux compteurs matĂ©riels et seulement aux leaders de groupe. Si un compteur Ă©pinglĂ© ne peut pas ĂȘtre mis dans le processeur (par exemple sâil nây a pas assez de compteurs matĂ©riels ou en cas de confit avec nâimporte quel autre Ă©vĂ©nement), alors le compteur arrive en Ă©tat dâ« erreur », oĂč les lectures renvoient une fin de fichier (câest-Ă -dire que read (2) renvoie 0 ) jusquâĂ ce que le compteur soit ensuite activĂ© ou dĂ©sactivĂ©. |
exclusive
Le bit exclusive indique que si ce groupe du compteur est sur le processeur, il devrait ĂȘtre le seul groupe utilisant les compteurs du processeur. Cela pourrait permettre Ă lâavenir de surveiller des programmes pour gĂ©rer les fonctionnalitĂ©s PMU qui doivent fonctionner seules, sans perturber dâautres compteurs matĂ©riels.
Remarquez que de nombreuses situations non attendues pourraient empĂȘcher de dĂ©marrer les Ă©vĂ©nements avec le bit exclusive dĂ©fini. Cela concerne tous les utilisateurs exĂ©cutant des mesures au niveau du systĂšme ainsi que toutes les utilisations par le noyau des compteurs de performance (y compris lâinterface NMI Watchdog Timer habituellemen activĂ©e).
exclude_user
Si ce bit est dĂ©fini, le dĂ©compte exclut les Ă©vĂ©nements qui arrivent dans lâespace utilisateur.
exclude_kernel
Si ce bit est dĂ©fini, le dĂ©compte exclut les Ă©vĂ©nements qui arrivent dans lâespace du noyau.
exclude_hv
Si ce bit est dĂ©fini, le dĂ©compte exclut les Ă©vĂ©nements qui arrivent dans lâhyperviseur. Câest surtout pour les PMU avec prise en charge intĂ©grĂ©e de leur traitement (comme POWER). Une prise en charge supplĂ©mentaire est nĂ©cessaire pour traiter les mesures dâhyperviseur sur la plupart des machines.
exclude_idle
Sâil est dĂ©fini, ne pas dĂ©compter quand le processeur exĂ©cute la tĂąche inactive. Si vous pouvez actuellement activer cela pour nâimporte quel type dâĂ©vĂ©nement, il est ignorĂ© pour tous, sauf ceux de type logiciel.
|
mmap |
Le bit mmap active la gĂ©nĂ©ration des Ă©chantillons PERF_RECORD_MMAP pour tous les appels mmap (2) qui ont PROT_EXEC dĂ©fini. Cela permet aux outils de remarquer le nouveau code exĂ©cutable en train dâĂȘtre associĂ© dans un programme (les bibliothĂšques partagĂ©es dynamiques par exemple) de telle sorte que les adresses peuvent ĂȘtre rĂ©associĂ©es au code dâorigine. |
||
|
comm |
Le bit comm active le suivi du nom de commande de processus tel que modifiĂ© par les appels systĂšme execve (2) et prctl (PR_SET_NAME) ainsi que lâĂ©criture dans /proc/self/comm . Si lâattribut comm_exec est positionnĂ© avec succĂšs (ce qui est possible depuis Linux 3.16), lâattribut gĂ©nĂ©ral PERF_RECORD_MISC_COMM_EXEC peut ĂȘtre utilisĂ© pour diffĂ©rencier le cas execve (2) des autres. |
||
|
freq |
Si ce bit est activĂ©, alors sample_frequency est utilisĂ© au lieu de sample_period lors du rĂ©glage de lâintervalle dâĂ©chantillonnage. |
inherit_stat
Ce bit active la sauvegarde des dĂ©comptes dâĂ©vĂ©nements lors du changement de contexte pour les tĂąches hĂ©ritĂ©es. Cela nâa de sens que si le champ inherit est dĂ©fini.
enable_on_exec
Si ce bit est dĂ©fini, un compteur est automatiquement activĂ© aprĂšs un appel dâ execve (2).
|
task |
Si ce bit est dĂ©fini, alors les notifications de crĂ©ation dâenfant et de fin sont inclues au tampon circulaire. |
watermark
Si défini, une notification de débordement arrive lors du passage de la frontiÚre wakeup_watermark . Sinon, les notifications arrivent aprÚs les échantillons wakeup_events .
precise_ip (depuis Linux 2.6.35)
Cela contrĂŽle la quantitĂ© de dĂ©rapage. Le dĂ©rapage est le nombre dâinstructions qui sâexĂ©cutent entre lâarrivĂ©e dâun Ă©vĂ©nement dâintĂ©rĂȘt et la possibilitĂ© du noyau de sâarrĂȘter pour enregistrer lâĂ©vĂ©nement. Les plus petits dĂ©rapages sont meilleurs et permettent dâassocier plus prĂ©cisĂ©ment les Ă©vĂ©nements correspondant aux instructions, mais le matĂ©riel est souvent limitĂ© par leur taille.
Les valeurs possibles du champ sont les suivantes :
|
0 |
SAMPLE_IP peut avoir un dérapage arbitraire ; |
||
|
1 |
SAMPLE_IP doit avoir un dérapage constant ; |
||
|
2 |
SAMPLE_IP a demandé un dérapage nul ; |
||
|
3 |
SAMPLE_IP doit avoir un dérapage nul. Consultez aussi la description de PERF_RECORD_MISC_EXACT_IP . |
mmap_data (depuis Linux 2.6.36)
LâopposĂ© du champ mmap . Cela active la gĂ©nĂ©ration des Ă©chantillons PERF_RECORD_MMAP pour les appels mmap (2) qui nâont pas PROT_EXEC dĂ©fini (par exemple les donnĂ©es et la mĂ©moire partagĂ©e SysV).
sample_id_all (depuis Linux 2.6.38)
Si dĂ©fini, alors TID, TIME, ID, STREAM_ID et CPU peuvent de plus ĂȘtre inclus dans les non PERF_RECORD_SAMPLE si le sample_type correspondant est sĂ©lectionnĂ©.
Si PERF_SAMPLE_IDENTIFIER est indiquĂ©, alors une valeur dâidentifiant supplĂ©mentaire est incluse en derniĂšre valeur pour faciliter lâanalyse du flux dâenregistrement. Cela peut avoir pour consĂ©quence de voir apparaĂźtre la valeur id deux fois.
La disposition est décrite par cette pseudostructure :
struct
sample_id {
{ u32 pid, tid; } /* si PERF_SAMPLE_TID est défini */
{ u64 time; } /* si PERF_SAMPLE_TIME est défini */
{ u64 id; } /* si PERF_SAMPLE_ID est défini */
{ u64 stream_id;} /* si PERF_SAMPLE_STREAM_ID est
défini */
{ u32 cpu, res; } /* si PERF_SAMPLE_CPU est défini */
{ u64 id; } /* si PERF_SAMPLE_IDENTIFIER est défini
*/
};
exclude_host (depuis Linux 3.2)
Quand on prend des mesures comprenant les processus exĂ©cutant des instances de VM (Ă savoir si on exĂ©cute ioctl (2) KVM_RUN ), ne mesurer que les Ă©vĂ©nements dans lâinstance de lâinvitĂ©. Cela nâa de sens quâĂ lâextĂ©rieur de lâinvité ; ce paramĂštre ne modifie pas les compteurs Ă lâintĂ©rieur dâun invitĂ©. Actuellement, cette fonctionnalitĂ© nâexiste que sur x86.
exclude_guest (depuis Linux 3.2)
Quand on prend des mesures comprenant les processus exĂ©cutant des instances de VM (Ă savoir si on exĂ©cute ioctl (2) KVM_RUN ), ne pas mesurer les Ă©vĂ©nements dans lâinstance de lâinvitĂ©. Cela nâa de sens quâĂ lâextĂ©rieur de lâinvité ; ce paramĂštre ne modifie pas les compteurs Ă lâintĂ©rieur dâun invitĂ©. Actuellement, cette fonctionnalitĂ© nâexiste que sur x86.
exclude_callchain_kernel (depuis Linux 3.7)
Ne pas inclure les appels en chaĂźne du noyau.
exclude_callchain_user (depuis Linux 3.7)
Ne pas inclure les appels en chaĂźne dâutilisateur.
mmap2 (depuis Linux 3.16)
GĂ©nĂ©rer un enregistrement mmap exĂ©cutable Ă©tendu contenant assez dâinformations supplĂ©mentaires pour nâidentifier que les projections partagĂ©es. Lâattribut mmap doit aussi ĂȘtre dĂ©fini pour que cela fonctionne.
comm_exec (depuis Linux 3.16)
Il sâagit dâun attribut de pure dĂ©tection de fonctionnalitĂ©, il ne modifie pas le comportement du noyau. Si cet attribut peut ĂȘtre positionnĂ© avec succĂšs, quand comm est activĂ©, lâattribut PERF_RECORD_MISC_COMM_EXEC sera positionnĂ© dans le champ misc de lâentĂȘte de lâenregistrement comm si lâĂ©vĂ©nement de renommage signalĂ© a Ă©tĂ© causĂ© par un appel Ă execve (2). Cela permet aux outils de distinguer les types de renommage du processus.
use_clockid (depuis Linux 4.1)
Cela permet de sĂ©lectionner lâhorloge interne du noyau Linux Ă utiliser lors de la gĂ©nĂ©ration des horodatages Ă lâaide du champ clockid . Cela peut faciliter la corrĂ©lation des durĂ©es dâĂ©chantillonnage des perf avec les horodatages gĂ©nĂ©rĂ©s par dâautres outils.
context_switch (depuis Linux 4.3)
Cela active la gĂ©nĂ©ration dâenregistrements PERF_RECORD_SWITCH lors dâun changement de contexte. Cela active aussi la gĂ©nĂ©ration dâenregistrements PERF_RECORD_SWITCH_CPU_WIDE lors dâun Ă©chantillonnage en mode processeur complet. Cette fonctionnalitĂ© sâajoute aux points de trace existants et aux Ă©vĂ©nements logiciels de mesure des changements de contexte. Lâavantage de cette mĂ©thode est quâelle fournira toutes les informations mĂȘme avec des rĂ©glages perf_event_paranoid stricts.
write_backward (depuis Linux 4.6)
Cela fait Ă©crire le tampon circulaire de la fin vers le dĂ©but. Cela permet de gĂ©rer la lecture Ă partir dâun tampon circulaire rĂ©inscriptible.
namespaces (depuis Linux 4.11)
Cela active la gĂ©nĂ©ration dâenregistrements PERF_RECORD_NAMESPACES lorsquâune tĂąche entre dans un nouvel espace de noms. Chaque espace de noms a une combinaison de numĂ©ros de pĂ©riphĂ©rique et dâinĆud.
ksymbol (depuis Linux 5.0)
Cela active la gĂ©nĂ©ration dâenregistrements PERF_RECORD_KSYMBOL quand de nouveaux symboles du noyau sont enregistrĂ©s ou dĂ©senregistrĂ©s. Cela concerne les fonctions dynamiques dâanalyse du noyau comme eBPF.
bpf_event (depuis Linux 5.0)
Cela active la gĂ©nĂ©ration dâenregistrements PERF_RECORD_BPF_EVENT lorsquâun programme eBPF est chargĂ© ou dĂ©chargĂ©.
aux_output (depuis Linux 5.4)
Cela permet aux événements normaux (non-AUX) de générer des données pour des événements AUX si le matériel le prend en charge.
cgroup (depuis Linux 5.7)
Cela active la gĂ©nĂ©ration dâenregistrements PERF_RECORD_CGROUP quand un nouveau cgroup est créé (et activĂ©).
text_poke (depuis Linux 5.8)
Cela active la gĂ©nĂ©ration dâenregistrements PERF_RECORD_TEXT_POKE quand un changement se produit dans le texte du noyau (câest-Ă -dire quand du code se modifie lui-mĂȘme).
build_id (depuis Linux 5.12)
Cela modifie le contenu de PERF_RECORD_MMAP2 pour avoir un build-id Ă la place des numĂ©ros de pĂ©riphĂ©rique et dâinĆud.
inherit_thread (depuis Linux 5.13)
Cela dĂ©sactive lâhĂ©ritage de lâĂ©vĂ©nement vers un processus enfant. Seuls les nouveaux threads dans le mĂȘme processus (qui est clonĂ© avec CLONE_THREAD ) hĂ©riteront de lâĂ©vĂ©nement.
remove_on_exec (depuis Linux 5.13)
Cela clĂŽt lâĂ©vĂ©nement quand il dĂ©marre une nouvelle image de processus avec execve (2).
sigtrap (depuis Linux 5.13)
Cela permet lâenvoi dâun signal synchrone de SIGTRAP quand un Ă©vĂ©nement dĂ©borde.
wakeup_events
wakeup_watermark
Cette union indique le nombre dâĂ©chantillons ( wakeup_events ) ou dâoctets ( wakeup_watermark ) qui arrivent avant un signal de dĂ©passement. Celui utilisĂ© est sĂ©lectionnĂ© par lâattribut watermark .
wakeup_events ne compte que les types dâenregistrement PERF_RECORD_SAMPLE . Pour recevoir un signal pour tous les types PERF_RECORD arrivant, choisissez watermark et dĂ©finissez wakeup_watermark Ă 1 .
Avant Linux 3.0, positionner wakeup_events à 0 ne signalait aucun dépassement ; les noyaux plus récents traitent 0 comme 1 .
bp_type (depuis Linux 2.6.33)
Cela choisit le type de point
dâarrĂȘt. Il sâagit dâun des
suivants :
HW_BREAKPOINT_EMPTY
pas de point dâarrĂȘt ;
HW_BREAKPOINT_R
compte lors de la lecture de lâemplacement mĂ©moire ;
HW_BREAKPOINT_W
compte lors de lâĂ©criture Ă lâemplacement mĂ©moire ;
HW_BREAKPOINT_RW
compte lors de la lecture ou lâĂ©criture Ă lâemplacement mĂ©moire ;
HW_BREAKPOINT_X
compte lors de lâexĂ©cution de code Ă lâemplacement mĂ©moire.
Les valeurs peuvent ĂȘtre combinĂ©es Ă lâaide dâun OU binaire, mais les combinaisons de HW_BREAKPOINT_R ou HW_BREAKPOINT_W avec HW_BREAKPOINT_X ne sont pas permises.
bp_addr (depuis Linux 2.6.33)
Il sâagit de lâadresse du point dâarrĂȘt. Pour les points dâarrĂȘt dâexĂ©cution, câest lâadresse mĂ©moire de lâinstruction dâintĂ©rĂȘt ; pour les points dâarrĂȘt de lecture et Ă©criture, câest lâadresse mĂ©moire de lâemplacement mĂ©moire dâintĂ©rĂȘt.
config1 (depuis Linux 2.6.39)
config1 est utilisĂ© pour dĂ©finir des Ă©vĂ©nements qui ont besoin dâun registre supplĂ©mentaire ou qui sinon ne rentrent pas dans le champ config normal. OFFCORE_EVENTS brut sur Nehalem/Westmere/SandyBridge utilise ce champ sur Linux 3.3 et les noyaux suivants.
bp_len (depuis Linux 2.6.33)
bp_len est la taille du point dâarrĂȘt mesurĂ© si type est PERF_TYPE_BREAKPOINT . Les options sont HW_BREAKPOINT_LEN_1 , HW_BREAKPOINT_LEN_2 , HW_BREAKPOINT_LEN_4 et HW_BREAKPOINT_LEN_8 . Pour un point dâarrĂȘt, dĂ©finissez-la Ă sizeof(long) .
config2 (depuis Linux 2.6.39)
config2 est une extension supplémentaire du champ config1 .
branch_sample_type (depuis Linux 3.4)
Si PERF_SAMPLE_BRANCH_STACK est activĂ©, alors cela indique les branchements Ă inclure dans lâenregistrement de branchements.
La
premiĂšre partie de la valeur est le niveau de droits
qui est une combinaison dâune des valeurs suivantes.
Si lâutilisateur ne dĂ©finit pas explicitement
le niveau de droits, le noyau utilisera celui de
lâĂ©vĂ©nement. Les niveaux de droits de
lâĂ©vĂ©nement et du branchement ne doivent
pas nécessairement correspondre.
PERF_SAMPLE_BRANCH_USER
La cible de branchement est dans lâespace utilisateur.
PERF_SAMPLE_BRANCH_KERNEL
La cible de branchement est dans lâespace du noyau.
PERF_SAMPLE_BRANCH_HV
La cible de branchement est dans lâhyperviseur.
PERF_SAMPLE_BRANCH_PLM_ALL
Une valeur pratique qui correspond aux trois valeurs précédentes combinées avec un OU.
En plus de la
valeur de droits, au moins un des bits suivants doit
ĂȘtre dĂ©fini.
PERF_SAMPLE_BRANCH_ANY
Nâimporte quel type de branchement.
PERF_SAMPLE_BRANCH_ANY_CALL
Nâimporte quelle branche dâappel (y compris les appels directs, indirects et les grands sauts).
PERF_SAMPLE_BRANCH_IND_CALL
Appels indirects.
PERF_SAMPLE_BRANCH_CALL (depuis Linux 4.4)
Appels directs.
PERF_SAMPLE_BRANCH_ANY_RETURN
Nâimporte quel branchement de retour.
PERF_SAMPLE_BRANCH_IND_JUMP (depuis Linux 4.2)
Sauts indirects.
PERF_SAMPLE_BRANCH_COND (depuis Linux 3.16)
Branches conditionnelles.
PERF_SAMPLE_BRANCH_ABORT_TX (depuis Linux 3.11)
Abandons de mémoire transactionnelle.
PERF_SAMPLE_BRANCH_IN_TX (depuis Linux 3.11)
Branchement dans une transaction de mémoire transactionnelle.
PERF_SAMPLE_BRANCH_NO_TX (depuis Linux 3.11)
Branchement non dans la transaction de la mĂ©moire transactionnelle. PERF_SAMPLE_BRANCH_CALL_STACK (depuis Linux 4.1). Le branchement faitpartie dâune pile dâappel gĂ©nĂ©rĂ©e par le matĂ©riel. Cela implique la prise en charge par le matĂ©riel, qui nâexiste actuellement que sur le x86 Haswell dâIntel ou plus rĂ©cent.
sample_regs_user (depuis Linux 3.7)
Ce masque binaire dĂ©finit lâensemble des registres processeur utilisateur Ă renvoyer dans les Ă©chantillons. La disposition du masque de registre est spĂ©cifique Ă lâarchitecture et dĂ©finie dans lâen-tĂȘte du noyau arch/ARCH/include/uapi/asm/perf_regs.h .
sample_stack_user (depuis Linux 3.7)
Cela définit la taille de la pile utilisateur à renvoyer si PERF_SAMPLE_STACK_USER est indiqué.
clockid (depuis Linux 4.1)
Si use_clockid est positionnĂ©, ce champ sĂ©lectionne lâhorloge interne de Linux Ă utiliser pour les horodatages. Les horloges disponibles sont dĂ©finies dans linux/time.h , oĂč sont actuellement prises en charge CLOCK_MONOTONIC , CLOCK_MONOTONIC_RAW , CLOCK_REALTIME , CLOCK_BOOTTIME et CLOCK_TAI .
aux_watermark (depuis Linux 4.1)
Cela indique la quantité de données nécessaires pour récupérer un échantillonnage PERF_RECORD_AUX .
sample_max_stack (depuis Linux 4.8)
Quand sample_type comprend PERF_SAMPLE_CALLCHAIN , ce champ indique le nombre de trames de pile Ă rendre compte lors de la gĂ©nĂ©ration de la chaĂźne dâappels.
aux_sample_size (depuis Linux 5.5)
Quand lâattribut PERF_SAMPLE_AUX est dĂ©fini, spĂ©cification de la taille souhaitĂ©e aux donnĂ©es AUX. Notez quâil peut recevoir des donnĂ©es plus petites que la taille indiquĂ©e.
sig_data (depuis Linux 5.13)
Cette donnĂ©e sera copiĂ©e vers le gestionnaire de signal de lâutilisateur (au moyen de si_perf dans siginfo_t ) pour disambiguĂŻser lâĂ©vĂ©nement qui a dĂ©clenchĂ© le signal.
Lecture des résultats
Une fois quâun descripteur de fichier perf_event_open () a Ă©tĂ© ouvert, les valeurs des Ă©vĂ©nements peuvent ĂȘtre lues depuis le descripteur de fichier. Les valeurs prĂ©sentes sont indiquĂ©es par le champ read_format de la structure attr au moment de lâouverture.
Si vous essayez de lire un tampon utilisĂ© pour la lecture qui nâest pas assez grand pour contenir les donnĂ©es, ENOSPC est renvoyĂ©.
Voici la disposition des données renvoyées par une lecture :
|
- |
Si PERF_FORMAT_GROUP a Ă©tĂ© indiquĂ© pour permettre de lire tous les Ă©vĂ©nements dâun groupe en une fois : |
struct
read_format {
u64 nr; /* Le nombre dâĂ©vĂ©nements */
u64 time_enabled; /* si PERF_FORMAT_TOTAL_TIME_ENABLED */
u64 time_running; /* si PERF_FORMAT_TOTAL_TIME_RUNNING */
struct
u64 value; /* La valeur de lâĂ©vĂ©nement
*/
u64 id; /* si PERF_FORMAT_ID */
u64 lost; /* si PERF_FORMAT_LOST */
} values[nr];
};
|
- |
Si PERF_FORMAT_GROUP nâa pas Ă©tĂ© indiqué : |
struct
read_format {
u64 value; /* La valeur de lâĂ©vĂ©nement
*/
u64 time_enabled; /* si PERF_FORMAT_TOTAL_TIME_ENABLED */
u64 time_running; /* si PERF_FORMAT_TOTAL_TIME_RUNNING */
u64 id; /* si PERF_FORMAT_ID */
u64 lost; /* si PERF_FORMAT_LOST */
};
Les valeurs lues sont les suivantes.
|
nr |
Le nombre dâĂ©vĂ©nements dans le descripteur de fichier. Seulement disponible si PERF_FORMAT_GROUP a Ă©tĂ© indiquĂ©. |
time_enabled
time_running
Temps total pendant lequel lâĂ©vĂ©nement a Ă©tĂ© activĂ© et exĂ©cutĂ©. Normalement ce sont les mĂȘmes. Si plus dâĂ©vĂ©nements sont dĂ©marrĂ©s que dâemplacements de compteur disponibles sur la PMU, alors il y a multiplexage et les Ă©vĂ©nements ne sont pas exĂ©cutĂ©s tout le temps. Dans ce cas, les valeurs time_enabled et time running peuvent ĂȘtre utilisĂ©es pour estimer une valeur dâordre de grandeur du dĂ©compte.
|
value |
Une valeur positive sur 64 bits contenant le résultat du compteur. |
||
|
id |
Une valeur unique globale pour cet événement en particulier, seulement si PERF_FORMAT_ID a été indiqué dans read_format . |
||
|
lost |
Le nombre des échantillons perdus de cet événement ; seulement si PERF_FORMAT_LOST a été indiqué dans read_format . |
Disposition MMAP
En utilisant perf_event_open () en mode dâĂ©chantillonnage, les Ă©vĂ©nements asynchrones (comme un dĂ©passement de compteur ou un suivi mmap PROT_EXEC ) sont journalisĂ©s dans un tampon circulaire. Ce tampon circulaire est créé et accĂ©dĂ© Ă lâaide de mmap (2).
La taille de mmap devrait ĂȘtre 1+2^n pages, oĂč la premiĂšre page est une page de mĂ©tadonnĂ©es ( struct perf_event_mmap_page ) qui contient plusieurs informations comme lâemplacement de la tĂȘte du tampon circulaire.
Avant Linux 2.6.39, un bogue oblige Ă allouer un tampon circulaire mmap lors de lâĂ©chantillonnage mĂȘme sâil nâest pas prĂ©vu de lâutiliser.
La structure de la premiÚre page mmap de métadonnées est la suivante :
struct
perf_event_mmap_page {
__u32 version; /* numéro de version de la structure
*/
__u32 compat_version; /* plus petite version compatible */
__u32 lock; /* seqlock pour synchronisation */
__u32 index; /* identifiant de compteur matériel */
__s64 offset; /* ajouter au compteur matériel */
__u64 time_enabled; /* temps dâĂ©vĂ©nement
actif */
__u64 time_running; /* temps dâĂ©vĂ©nement
sur processeur */
union {
__u64 capabilities;
struct {
__u64 cap_usr_time / cap_usr_rdpmc / cap_bit0 : 1,
cap_bit0_is_deprecated : 1,
cap_user_rdpmc : 1,
cap_user_time : 1,
cap_user_time_zero : 1,
};
};
__u16 pmc_width;
__u16 time_shift;
__u32 time_mult;
__u64 time_offset;
__u64 __reserved[120]; /* remplissage Ă 1 k */
__u64 data_head; /* tĂȘte de la section de
données */
__u64 data_tail; /* queue écrite en espace
utilisateur */
__u64 data_offset; /* oĂč commence le tampon */
__u64 data_size; /* taille du tampon de données */
__u64 aux_head;
__u64 aux_tail;
__u64 aux_offset;
__u64 aux_size;
}
La liste
suivante décrit les champs de la structure
perf_event_mmap_page
plus précisément.
version
Numéro de version de cette structure.
compat_version
La plus petite version avec laquelle elle est compatible.
|
lock |
Un seqlock (sequence lock) pour la synchronisation. |
|||
|
index |
Un identifiant unique de compteur matériel. |
décalage
Quand lâinstruction rdpmc est utilisĂ©e pour lire, cette valeur de position doit ĂȘtre ajoutĂ©e Ă celle renvoyĂ©e par rdpmc pour obtenir le dĂ©compte total actuel dâĂ©vĂ©nements.
time_enabled
Temps dâactivitĂ© de lâĂ©vĂ©nement.
time_running
Temps dâexĂ©cution de lâĂ©vĂ©nement.
cap_usr_time / cap_usr_rdpmc / cap_bit0 (depuis Linux 3.4)
Un bogue existait dans la dĂ©finition de cap_usr_time et cap_usr_rdpmc de Linux 3.4 Ă Linux 3.11. Les deux bits Ă©taient dĂ©finis pour pointer vers le mĂȘme endroit, il Ă©tait donc impossible de savoir si cap_usr_time ou cap_usr_rdpmc Ă©taient vraiment dĂ©finis.
Depuis Linux 3.12, ils ont été renommés en cap_bit0 et vous devriez plutÎt utiliser les nouveaux champs cap_user_time et cap_user_rdpmc à la place.
cap_bit0_is_deprecated (depuis Linux 3.12)
Si défini, ce bit indique que le noyau est capable de gérer les bits cap_user_time et cap_user_rdpmc différenciés correctement.
Si non, cela indique quâil sâagit dâun ancien noyau oĂč cap_usr_time et cap_usr_rdpmc pointent vers le mĂȘme bit et donc que ces deux fonctionnalitĂ©s devraient ĂȘtre utilisĂ©es avec prudence.
cap_usr_rdpmc (depuis Linux 3.12)
Si le matĂ©riel permet la lecture en espace utilisateur des compteurs de performance sans appel systĂšme (câest lâinstruction « rdpmc » sur x86), alors le code suivant peut ĂȘtre utilisĂ© pour faire une lecture :
u32 seq,
time_mult, time_shift, idx, width;
u64 count, enabled, running;
u64 cyc, time_offset;
do {
seq = pc->lock;
barrier();
enabled = pc->time_enabled;
running = pc->time_running;
if (pc->cap_usr_time && enabled != running) {
cyc = rdtsc();
time_offset = pc->time_offset;
time_mult = pc->time_mult;
time_shift = pc->time_shift;
}
idx = pc->index;
count = pc->offset;
if (pc->cap_usr_rdpmc && idx) {
width = pc->pmc_width;
count += rdpmc(idx - 1);
}
barrier();
} while (pc->lock != seq);
cap_user_time (depuis Linux 3.12)
Ce bit indique que le matĂ©riel a un compteur temporel sans arrĂȘt, constant (TSC sur x86).
cap_usr_time_zero (depuis Linux 3.12)
Indique la prĂ©sence de time_zero qui permet dâassocier les valeurs dâhorodatage Ă lâhorloge matĂ©rielle.
pmc_width
Si cap_usr_rdpmc , ce champ fournit la taille en bit de la valeur lue en utilisant lâinstruction rdpmc ou Ă©quivalente. Cela permet dâĂ©tendre avec signe le rĂ©sultat comme ceci :
pmc <<=
64 - pmc_width;
pmc >>= 64 - pmc_width; // déplacement du signe
Ă droite
count += pmc;
time_shift
time_mult
time_offset
Si cap_usr_time , ces champs peuvent ĂȘtre utilisĂ©s pour calculer la diffĂ©rence de temps depuis time_enabled (en nanoseconde) en utilisant rdtsc ou similaire.
u64 quot, rem;
u64 delta;
quot = cyc >> time_shift;
rem = cyc & (((u64)1 << time_shift) - 1);
delta = time_offset + quot * time_mult +
((rem * time_mult) >> time_shift);
OĂč time_offset , time_mult , time_shift et cyc sont lus dans la boucle seqcount dĂ©crite ci-dessus. Cette diffĂ©rence peut ĂȘtre ajoutĂ©e Ă enabled et Ă©ventuellement running (si idx), pour amĂ©liorer lâĂ©chelle :
enabled +=
delta;
if (idx)
running += delta;
quot = count / running;
rem = count % running;
count = quot * enabled + (rem * enabled) / running;
time_zero (depuis Linux 3.12)
Si cap_usr_time_zero est dĂ©fini, alors lâhorloge matĂ©rielle (le compteur temporel TSC sur x86) peut ĂȘtre calculĂ©e Ă partir des valeurs time_zero , time_mult et time_shift :
time =
timestamp - time_zero;
quot = time / time_mult;
rem = time % time_mult;
cyc = (quot << time_shift) + (rem << time_shift)
/ time_mult;
et vice versa :
quot = cyc
>> time_shift;
rem = cyc & (((u64)1 << time_shift) - 1);
timestamp = time_zero + quot * time_mult +
((rem * time_mult) >> time_shift);
data_head
Cela pointe vers la tĂȘte de la section de donnĂ©es. La valeur augmente continuellement, elle nâest pas coupĂ©e. Vous devrez couper vous-mĂȘme la valeur Ă la taille du tampon mmap avant dâaccĂ©der aux Ă©chantillons.
Sur les plateformes compatibles SMP, aprĂšs la lecture de la valeur data_head , lâespace utilisateur devrait renvoyer un rmb().
data_tail
Quand lâassociation est PROT_WRITE , la valeur data_tail devrait ĂȘtre Ă©crite par lâespace utilisateur pour reflĂ©ter les derniĂšres donnĂ©es lues. Dans ce cas, le noyau nâĂ©crasera pas les donnĂ©es non lues.
data_offset (depuis Linux 4.1)
Contient la position de lâemplacement du tampon mmap oĂč les donnĂ©es de lâĂ©chantillon de perf commencent.
data_size (depuis Linux 4.1)
Contient la taille de la zone de lâĂ©chantillon de perf dans le tampon mmap.
aux_head
aux_tail
aux_offset
aux_size (depuis Linux 4.1)
La zone AUX permet dâappliquer Ă un mmap (2) un tampon dâĂ©chantillonnage distinct pour les flux de donnĂ©es Ă forte bande passante (sĂ©parĂ©ment du tampon dâĂ©chantillonnage de perf principal). Un exemple de flux Ă forte bande passante est la prise en charge du traçage dâune instruction telle quâelle se fait dans les nouveaux processeurs Intel.
Pour dĂ©finir une zone AUX, il faut dâabord positionner aux_offset Ă une position supĂ©rieure Ă data_offset + data_size puis positionner aux_size Ă la taille de tampon dĂ©sirĂ©e. La position et la taille dĂ©sirĂ©e doivent ĂȘtre alignĂ©es sur la page et la taille doit ĂȘtre une puissance de deux. Ces valeurs sont alors passĂ©es Ă mmap pour projeter le tampon AUX. Les pages du tampon AUX sont comprises dans la limite de ressource RLIMIT_MEMLOCK (voir setrlimit (2)) et dans la gestion des droits perf_event_mlock_kb .
Par dĂ©faut, le tampon AUX sera tronquĂ© sâil ne rentre pas dans lâespace disponible du tampon circulaire. Si le tampon AUX est projetĂ© en tant que tampon en lecture seule, il agira dans le mode du tampon circulaire lĂ oĂč les donnĂ©es seront remplacĂ©es par de nouvelles. En mode remplacement, il se pourrait quâil ne soit pas possible de prĂ©sumer lâendroit oĂč commencent les donnĂ©es et il appartient au consommateur de dĂ©sactiver la mesure pendant la lecture pour Ă©viter les possibles collisions de donnĂ©es.
Les pointeurs de tampon circulaire aux_head et aux_tail ont le mĂȘme comportement et les mĂȘmes rĂšgles dâorganisation que celles dĂ©crites prĂ©cĂ©demment pour data_head et data_tail .
Les 2Ën pages suivantes du tampon circulaire ont la disposition dĂ©crite ci-dessous.
Si perf_event_attr.sample_id_all est dĂ©fini, alors tous les types dâĂ©vĂ©nements auront les champs sample_type sĂ©lectionnĂ©s relatifs Ă lâemplacement et Ă la date (identitĂ©) oĂč un Ă©vĂ©nement a eu lieu (TID, TIME, ID, CPU, STREAM_ID) conformĂ©ment Ă la description de PERF_RECORD_SAMPLE ci-dessous, il sera stockĂ© juste aprĂšs le perf_event_header et les champs dĂ©jĂ prĂ©sents pour les champs existants, câest-Ă -dire Ă la fin de la charge utile. De cette façon, un nouveau perf.data sera pris en charge par les outils de performances plus anciens, avec ces nouveaux champs facultatifs ignorĂ©s.
Les valeurs mmap commencent par un en-tĂȘte :
struct
perf_event_header {
__u32 type;
__u16 misc;
__u16 size;
};
Les champs perf_event_header sont dĂ©crits plus prĂ©cisĂ©ment ci-dessous. Par commoditĂ© de lecture, les champs avec les descriptions les plus courtes sont dâabord prĂ©sentĂ©s.
|
size |
Cela indique la taille de lâenregistrement. |
||
|
misc |
Le champ misc contient des renseignements supplĂ©mentaires sur lâĂ©chantillon. |
Le mode de
processeur peut ĂȘtre dĂ©terminĂ© Ă
partir de cette valeur en la masquant avec
PERF_RECORD_MISC_CPUMODE_MASK
et en recherchant un
des suivants (remarquez que ce ne sont pas des masques de
bits, un seul peut ĂȘtre dĂ©fini Ă la
fois).
PERF_RECORD_MISC_CPUMODE_UNKNOWN
Mode de processeur inconnu.
PERF_RECORD_MISC_KERNEL
LâĂ©chantillon a eu lieu dans le noyau.
PERF_RECORD_MISC_USER
LâĂ©chantillon a eu lieu dans le code utilisateur.
PERF_RECORD_MISC_HYPERVISOR
LâĂ©chantillon a eu lieu dans lâhyperviseur.
PERF_RECORD_MISC_GUEST_KERNEL (depuis Linux 2.6.35)
LâĂ©chantillon a eu lieu dans le noyau client.
PERF_RECORD_MISC_GUEST_USER (depuis Linux 2.6.35)
LâĂ©chantillon a eu lieu dans le code utilisateur client.
Comme les trois
états suivants sont générés par
diffĂ©rents types dâenregistrement, ils
constituent des alias du mĂȘme bit :
PERF_RECORD_MISC_MMAP_DATA
(depuis Linux 3.10)
Câest dĂ©fini quand lâassociation nâest pas exĂ©cutable ; sinon lâassociation est exĂ©cutable.
PERF_RECORD_MISC_COMM_EXEC (depuis Linux 3.16)
Il est positionnĂ© pour un enregistrement PERF_RECORD_COMM sur les noyaux plus rĂ©cents que Linux 3.16 si le changement de nom dâun processus est causĂ© par un appel systĂšme execve (2).
PERF_RECORD_MISC_SWITCH_OUT (depuis Linux 4.3)
Quand un enregistrement PERF_RECORD_SWITCH ou PERF_RECORD_SWITCH_CPU_WIDE est gĂ©nĂ©rĂ©, ce bit indique que le changement de contexte est distinct du processus actuel (et nâen fait pas partie).
De plus, les
bits suivants peuvent ĂȘtre dĂ©finis :
PERF_RECORD_MISC_EXACT_IP
Cela indique que le contenu de PERF_SAMPLE_IP pointe vers la vĂ©ritable instruction qui a dĂ©clenchĂ© lâĂ©vĂ©nement. Consultez aussi perf_event_attr.precise_ip .
PERF_RECORD_MISC_SWITCH_OUT_PREEMPT (depuis Linux 4.17)
Quand un enregistrement PERF_RECORD_SWITCH ou PERF_RECORD_SWITCH_CPU_WIDE est généré, cela indique que le changement de contexte était une préemption.
PERF_RECORD_MISC_MMAP_BUILD_ID (depuis Linux 5.12)
Cela indique que le contenu de PERF_SAMPLE_MMAP2 renferme les donnĂ©es de build-ID plutĂŽt que les numĂ©ros majeur et mineur du pĂ©riphĂ©rique ainsi que le numĂ©ro dâinĆud.
PERF_RECORD_MISC_EXT_RESERVED (depuis Linux 2.6.35)
Cela indique que des données étendues sont disponibles (actuellement pas utilisées).
PERF_RECORD_MISC_PROC_MAP_PARSE_TIMEOUT
Ce bit nâest pas dĂ©fini par le noyau. Il est rĂ©servĂ© Ă lâoutil perf dans lâespace utilisateur pour indiquer que lâanalyse de /proc/ pid /maps a trop durĂ© et a Ă©tĂ© arrĂȘtĂ©e, ainsi les enregistrements mmap peuvent ĂȘtre tronquĂ©s.
|
type |
La valeur type est une des suivantes. Les valeurs dans lâenregistrement correspondant (qui suit lâen-tĂȘte) dĂ©pendent du type sĂ©lectionnĂ© comme câest montrĂ©. |
PERF_RECORD_MMAP
Les Ă©vĂ©nements MMAP enregistrent les associations PROT_EXEC pour pouvoir mettre en corrĂ©lation les pointeurs dâinstruction en espace utilisateur et le code. Ils ont la structure suivante :
struct {
struct perf_event_header header;
u32 pid, tid;
u64 addr;
u64 len;
u64 pgoff;
char filename[];
};
|
pid |
est lâidentifiant de processus. |
||
|
tid |
est lâidentifiant de thread. |
||
|
addr |
est lâadresse de la mĂ©moire allouĂ©e. len est la taille de la mĂ©moire allouĂ©e. pgoff est la position de la page de la mĂ©moire allouĂ©e. filename est une chaĂźne dĂ©crivant la base de la mĂ©moire allouĂ©e. |
PERF_RECORD_LOST
Cet enregistrement indique quand des événements sont perdus.
struct {
struct perf_event_header header;
u64 id;
u64 lost;
struct sample_id sample_id;
};
|
id |
est lâidentifiant unique dâĂ©vĂ©nement pour les Ă©chantillons perdus. |
||
|
lost |
est le nombre dâĂ©vĂ©nements perdus. |
PERF_RECORD_COMM
Cet enregistrement indique une modification du nom de processus.
struct {
struct perf_event_header header;
u32 pid;
u32 tid;
char comm[];
struct sample_id sample_id;
};
|
pid |
est lâidentifiant de processus. |
||
|
tid |
est lâidentifiant de thread. |
||
|
comm |
est une chaĂźne contenant le nouveau nom du processus. |
PERF_RECORD_EXIT
Cet enregistrement indique un événement de fin de processus.
struct {
struct perf_event_header header;
u32 pid, ppid;
u32 tid, ptid;
u64 time;
struct sample_id sample_id;
};
PERF_RECORD_THROTTLE
PERF_RECORD_UNTHROTTLE
Cet enregistrement indique un événement de variation de fréquence du processeur.
struct {
struct perf_event_header header;
u64 time;
u64 id;
u64 stream_id;
struct sample_id sample_id;
};
PERF_RECORD_FORK
Cet enregistrement indique un Ă©vĂ©nement de crĂ©ation dâenfant.
struct {
struct perf_event_header header;
u32 pid, ppid;
u32 tid, ptid;
u64 time;
struct sample_id sample_id;
};
PERF_RECORD_READ
Cet enregistrement indique un événement de lecture.
struct {
struct perf_event_header header;
u32 pid, tid;
struct read_format values;
struct sample_id sample_id;
};
PERF_RECORD_SAMPLE
Cet enregistrement indique un échantillon.
struct {
struct perf_event_header header;
u64 sample_id; /* if PERF_SAMPLE_IDENTIFIER */
u64 ip; /* if PERF_SAMPLE_IP */
u32 pid, tid; /* if PERF_SAMPLE_TID */
u64 time; /* if PERF_SAMPLE_TIME */
u64 addr; /* if PERF_SAMPLE_ADDR */
u64 id; /* if PERF_SAMPLE_ID */
u64 stream_id; /* if PERF_SAMPLE_STREAM_ID */
u32 cpu, res; /* if PERF_SAMPLE_CPU */
u64 period; /* if PERF_SAMPLE_PERIOD */
struct read_format v;
/* if PERF_SAMPLE_READ */
u64 nr; /* if PERF_SAMPLE_CALLCHAIN */
u64 ips[nr]; /* if PERF_SAMPLE_CALLCHAIN */
u32 size; /* if PERF_SAMPLE_RAW */
char data[size]; /* if PERF_SAMPLE_RAW */
u64 bnr; /* if PERF_SAMPLE_BRANCH_STACK */
struct perf_branch_entry lbr[bnr];
/* if PERF_SAMPLE_BRANCH_STACK */
u64 abi; /* if PERF_SAMPLE_REGS_USER */
u64 regs[weight(mask)];
/* if PERF_SAMPLE_REGS_USER */
u64 size; /* if PERF_SAMPLE_STACK_USER */
char data[size]; /* if PERF_SAMPLE_STACK_USER */
u64 dyn_size; /* if PERF_SAMPLE_STACK_USER &&
size != 0 */
union perf_sample_weight weight;
/* if PERF_SAMPLE_WEIGHT */
/* || PERF_SAMPLE_WEIGHT_STRUCT */
u64 data_src; /* if PERF_SAMPLE_DATA_SRC */
u64 transaction; /* if PERF_SAMPLE_TRANSACTION */
u64 abi; /* if PERF_SAMPLE_REGS_INTR */
u64 regs[weight(mask)];
/* if PERF_SAMPLE_REGS_INTR */
u64 phys_addr; /* if PERF_SAMPLE_PHYS_ADDR */
u64 cgroup; /* if PERF_SAMPLE_CGROUP */
u64 data_page_size;
/* if PERF_SAMPLE_DATA_PAGE_SIZE */
u64 code_page_size;
/* if PERF_SAMPLE_CODE_PAGE_SIZE */
u64 size; /* if PERF_SAMPLE_AUX */
char data[size]; /* if PERF_SAMPLE_AUX */
};
sample_id
Si PERF_SAMPLE_IDENTIFIER est activĂ©, un identifiant unique sur 64 bits est inclus. Câest une copie de la valeur id de PERF_SAMPLE_ID , mais incluse au dĂ©but de lâĂ©chantillon pour permettre aux analyseurs dâobtenir facilement la valeur.
|
ip |
Si PERF_SAMPLE_IP est activĂ©, alors une valeur de pointeur dâinstruction sur 64 bits est incluse. |
||
|
pid |
|||
|
tid |
Si PERF_SAMPLE_TID est activé, alors un identifiant de processus sur 32 bits et un identifiant de thread sur 32 bits sont inclus. |
time
Si PERF_SAMPLE_TIME est activĂ©, alors un horodatage sur 64 bits est inclus. Câest obtenu Ă lâaide de local_clock() qui est un horodatage matĂ©riel si disponible et la valeur jiffy sinon.
addr
Si PERF_SAMPLE_ADDR est activĂ©, alors une adresse sur 64 bits est incluse. Câest gĂ©nĂ©ralement lâadresse dâun point de trace, point dâarrĂȘt ou Ă©vĂ©nement logiciel ; sinon la valeur est 0 .
|
id |
Si PERF_SAMPLE_ID est activĂ©, un identifiant unique sur 64 bits est inclus. Si lâĂ©vĂ©nement est membre dâun groupe dâĂ©vĂ©nements, lâidentifiant du leader de groupe est renvoyĂ©. Cet identifiant est le mĂȘme que celui renvoyĂ© par PERF_FORMAT_ID . |
stream_id
Si PERF_SAMPLE_STREAM_ID est activĂ©, un identifiant unique sur 64 bits est inclus. Contrairement Ă PERF_SAMPLE_ID , le vĂ©ritable identifiant est renvoyĂ©, pas celui du leader de groupe. Cet identifiant est le mĂȘme que celui renvoyĂ© par PERF_FORMAT_ID .
|
cpu |
|||
|
res |
Si PERF_SAMPLE_CPU est activĂ©, câest une valeur sur 32 bits indiquant le processeur qui a Ă©tĂ© utilisĂ©, en supplĂ©ment dâune valeur rĂ©servĂ©e (non utilisĂ©e) sur 32 bits. |
period
Si PERF_SAMPLE_PERIOD est activĂ©, une valeur sur 64 bits indiquant la pĂ©riode dâĂ©chantillonnage actuelle est Ă©crite.
|
v |
Si PERF_SAMPLE_READ est activĂ©, une structure de type read_format est incluse avec des valeurs pour tous les Ă©vĂ©nements du groupe dâĂ©vĂ©nements. Les valeurs incluses dĂ©pendent de la valeur read_format utilisĂ©e au moment de perf_event_open (). |
||
|
nr |
ips[nr]
Si PERF_SAMPLE_CALLCHAIN est activĂ©, alors un nombre sur 64 bits est inclus, indiquant le nombre de pointeurs dâinstruction sur 64 bits qui suivent. Câest lâappel en chaĂźne actuel.
size
data[size
]
Si PERF_SAMPLE_RAW est activé, alors une valeur sur 32 bits indiquant la taille est incluse, suivie par un tableau de valeurs sur 8 bits de taille size . Les valeurs sont remplies avec des 0 pour avoir un alignement à 64 bits.
Ces donnĂ©es brutes dâenregistrement sont opaques du point de vue de lâABI. LâABI ne fait pas de promesses sur la stabilitĂ© de son contenu qui pourrait varier en fonction de lâĂ©vĂ©nement, du matĂ©riel ou de la version du noyau.
|
bnr |
lbr[bnr]
Si PERF_SAMPLE_BRANCH_STACK est activĂ©, alors une valeur de 64 bits indiquant le nombre dâenregistrements est incluse, suivie des structures bnr perf_branch_entry qui chacune contient les champs suivants.
|
from |
Cela indique lâinstruction source (qui pourrait ne pas ĂȘtre un branchement). |
||
|
to |
La cible de branchement. |
mispred
La cible de branchement a été mal prédite.
predicted
La cible de branchement a été prédite.
in_tx (depuis Linux 3.11)
Le branchement était dans une transaction de mémoire transactionnelle.
abort (depuis Linux 3.11)
Le branchement était dans une transaction abandonnée de mémoire transactionnelle.
cycles (depuis Linux 4.3)
Cela rend compte du nombre de cycles qui se sont déroulés depuis la derniÚre mise à jour de la pile de branchement.
Les entrĂ©es sont prĂ©sentĂ©es dans lâordre chronologique, de telle sorte que la premiĂšre entrĂ©e a le branchement le plus rĂ©cent.
La prise en charge de mispred , predicted et cycles est facultative. En absence de prise en charge, les deux valeurs seront 0 .
Le type de branchements enregistrés est indiqué par le champ branch_sample_type .
|
abi |
regs[weight(mask)]
Si PERF_SAMPLE_REGS_USER est activé, alors les registres processeur utilisateur sont enregistrés.
Le champ abi est parmi PERF_SAMPLE_REGS_ABI_NONE , PERF_SAMPLE_REGS_ABI_32 ou PERF_SAMPLE_REGS_ABI_64 .
Le champ regs est un tableau de registres processeur qui ont été indiqués par le champ attr sample_regs_user . Le nombre de valeurs est le nombre de bits définis dans le masque binaire sample_regs_user .
size
data[size
]
dyn_size
Si PERF_SAMPLE_STACK_USER est activĂ©, la pile utilisateur est enregistrĂ©e. Cela peut ĂȘtre utilisĂ© pour gĂ©nĂ©rer les backtraces de la pile. size est la taille demandĂ©e par lâutilisateur dans sample_stack_user ou autrement la taille maximale dâenregistrement. data contient les donnĂ©es de pile (un contenu brut de la mĂ©moire indiquĂ©e par le pointeur de pile au moment de lâĂ©chantillonnage). dyn_size est la quantitĂ© de donnĂ©es vraiment renvoyĂ©e (peut ĂȘtre infĂ©rieure Ă size ). Remarquez que dyn_size est omis si size vaut 0 .
weight
Si PERF_SAMPLE_WEIGHT ou PERF_SAMPLE_WEIGHT_STRUCT sont activĂ©s, une valeur de 64 bits fournie par le matĂ©riel est enregistrĂ©e pour indiquer le coĂ»t de lâĂ©vĂ©nement. Cela permet aux Ă©vĂ©nements coĂ»teux de ressortir plus clairement dans les profils.
data_src
Si
PERF_SAMPLE_DATA_SRC
est activé, alors une valeur de 64 bits est
enregistrée, constituée des champs suivants.
mem_op
Type de code opération (opcode), une combinaison bit à bit de :
|
PERF_MEM_OP_NA |
Non disponible |
|||
|
PERF_MEM_OP_LOAD |
Instruction de chargement |
|||
|
PERF_MEM_OP_STORE |
Instruction de stockage |
|||
|
PERF_MEM_OP_PFETCH |
Prélecture |
|||
|
PERF_MEM_OP_EXEC |
Code exécutable |
mem_lvl
Niveau de hiérarchie de mémoire atteint ou raté, une combinaison bit à bit de ce qui suit, envoyés à gauche par PERF_MEM_LVL_SHIFT :
|
PERF_MEM_LVL_NA |
Non disponible |
|||
|
PERF_MEM_LVL_HIT |
Atteint |
|||
|
PERF_MEM_LVL_MISS |
Raté |
|||
|
PERF_MEM_LVL_L1 |
Cache de niveau 1 |
|||
|
PERF_MEM_LVL_LFB |
Tampon de capacité |
|||
|
PERF_MEM_LVL_L2 |
Cache de niveau 2 |
|||
|
PERF_MEM_LVL_L3 |
Cache de niveau 3 |
|||
|
PERF_MEM_LVL_LOC_RAM |
DRAM local |
|||
|
PERF_MEM_LVL_REM_RAM1 |
DRAM distant 1 saut |
|||
|
PERF_MEM_LVL_REM_RAM2 |
DRAM distant 2 sauts |
|||
|
PERF_MEM_LVL_REM_CCE1 |
Cache distant 1 saut |
|||
|
PERF_MEM_LVL_REM_CCE2 |
Cache distant 2 sauts |
|||
|
PERF_MEM_LVL_IO |
MĂ©moire dâentrĂ©e et sortie. |
|||
|
PERF_MEM_LVL_UNC |
Mémoire sans cache |
mem_snoop
Mode espionnage, une combinaison bit-à -bit de ce qui suit, décalé vers la gauche par PERF_MEM_SNOOP_SHIFT :
|
PERF_MEM_SNOOP_NA |
Non disponible |
|||
|
PERF_MEM_SNOOP_NONE |
Pas dâespionnage |
|||
|
PERF_MEM_SNOOP_HIT |
Espionnage atteint |
|||
|
PERF_MEM_SNOOP_MISS |
Espionnage raté |
|||
|
PERF_MEM_SNOOP_HITM |
Espionnage atteint modifié |
mem_lock
Instruction de verrouillage, une combinaison bit à bit de ce qui suit, renvoyée vers la gauche par PERF_MEM_LOCK_SHIFT :
|
PERF_MEM_LOCK_NA |
Non disponible |
|||
|
PERF_MEM_LOCK_LOCKED |
Transaction verrouillée |
mem_dtlb
AccÚs TLB atteint ou raté, une combinaison bit à bit de ce qui suit, renvoyée vers la gauche par PERF_MEM_TLB_SHIFT :
|
PERF_MEM_TLB_NA |
Non disponible |
|||
|
PERF_MEM_TLB_HIT |
Atteint |
|||
|
PERF_MEM_TLB_MISS |
Raté |
|||
|
PERF_MEM_TLB_L1 |
TLB de niveau 1 |
|||
|
PERF_MEM_TLB_L2 |
TLB de niveau 2 |
|||
|
PERF_MEM_TLB_WK |
Parcours matériel |
|||
|
PERF_MEM_TLB_OS |
Gestionnaire dâerreur du SE |
transaction
Si lâattribut PERF_SAMPLE_TRANSACTION est dĂ©fini, alors un champ de 64 bits est enregistrĂ© pour dĂ©crire les sources de tous les abandons de mĂ©moire transactionnelle.
Le champ est
une combinaison bit Ă bit des valeurs
suivantes :
PERF_TXN_ELISION
Abandon dâune transaction de type Ă©lision (spĂ©cifique aux processeurs Intel).
PERF_TXN_TRANSACTION
Abandon dâune transaction gĂ©nĂ©rique.
PERF_TXN_SYNC
Abandon synchrone (relatif Ă lâinstruction signalĂ©e).
PERF_TXN_ASYNC
Abandon asynchrone (non relatif Ă lâinstruction signalĂ©e).
PERF_TXN_RETRY
Abandon réessayable (réessayer la transaction pourrait réussir).
PERF_TXN_CONFLICT
Abandon Ă cause de conflits de mĂ©moire avec dâautres threads.
PERF_TXN_CAPACITY_WRITE
Abandon Ă cause de dĂ©passement de la capacitĂ© dâĂ©criture.
PERF_TXN_CAPACITY_READ
Abandon à cause de dépassement de la capacité de lecture.
De plus, un code dâabandon spĂ©cifique Ă lâutilisateur peut ĂȘtre obtenu Ă partir des premiers 32 bits du champ en dĂ©plaçant vers la droite avec PERF_TXN_ABORT_SHIFT et en masquant avec PERF_TXN_ABORT_MASK .
|
abi |
regs[weight(mask)]
Si PERF_SAMPLE_REGS_INTR est activé, alors les registres processeur utilisateur sont enregistrés.
Le champ abi est parmi PERF_SAMPLE_REGS_ABI_NONE , PERF_SAMPLE_REGS_ABI_32 ou PERF_SAMPLE_REGS_ABI_64 .
Le champ regs est un tableau des registres processeur qui ont été indiqués par le champ attr sample_regs_intr . Le nombre de valeurs est le nombre de bits définis dans le masque binaire sample_regs_intr .
phys_addr
Si lâattribut PERF_SAMPLE_PHYS_ADDR est positionnĂ©, lâadresse physique en 64 bits est enregistrĂ©e.
cgroup
Si lâattribut PERF_SAMPLE_CGROUP est positionnĂ©, lâidentifiant de cgroup 64 bits (pour le sous-systĂšme perf_event) est enregistrĂ©. Pour rĂ©cupĂ©rer le chemin du cgroup, lâidentifiant doit correspondre Ă un de ceux se trouvant dans PERF_RECORD_CGROUP .
data_page_size
Si lâattribut PERF_SAMPLE_DATA_PAGE_SIZE est positionnĂ©, la valeur en 64 bits de la taille de la page de lâadresse de data est enregistrĂ©e.
code_page_size
Si lâattribut PERF_SAMPLE_CODE_PAGE_SIZE est positionnĂ©, la valeur en 64 bits de la taille de la page de lâadresse ip est enregistrĂ©e.
size
data
[
size
]
Si PERF_SAMPLE_AUX est activé, alors un instantané du tampon aux est enregistré.
PERF_RECORD_MMAP2
Cet enregistrement inclut des informations Ă©tendues sur les appels mmap (2) renvoyant des projections exĂ©cutables. Le format est identique Ă celui de lâenregistrement PERF_RECORD_MMAP mais il comprend des valeurs supplĂ©mentaires qui permettent uniquement dâidentifier des projections partagĂ©es. Selon le bit PERF_RECORD_MISC_MMAP_BUILD_ID dans lâen-tĂȘte, les valeurs supplĂ©mentaires ont des prĂ©sentations et des significations diffĂ©rentes.
struct {
struct perf_event_header header;
u32 pid;
u32 tid;
u64 addr;
u64 len;
u64 pgoff;
union {
struct {
u32 maj;
u32 min;
u64 ino;
u64 ino_generation;
};
struct { /* if PERF_RECORD_MISC_MMAP_BUILD_ID */
u8 build_id_size;
u8 __reserved_1;
u16 __reserved_2;
u8 build_id[20];
};
};
u32 prot;
u32 flags;
char filename[];
struct sample_id sample_id;
};
|
pid |
est lâidentifiant de processus. |
||
|
tid |
est lâidentifiant de thread. |
||
|
addr |
est lâadresse de la mĂ©moire allouĂ©e. |
||
|
len |
est la taille de la mémoire allouée. |
||
|
pgoff |
est la position de la page de la mémoire allouée. |
||
|
maj |
est lâidentifiant majeur du pĂ©riphĂ©rique sous-jacent. |
||
|
min |
est lâidentifiant mineur du pĂ©riphĂ©rique sous-jacent. |
||
|
ino |
est le numĂ©ro dâinĆud. |
ino_generation
est la gĂ©nĂ©ration dâinĆud.
build_id_size
est la taille rĂ©elle du champ build_id (jusquâĂ 20).
build_id
ce sont des données brutes pour identifier un binaire.
|
prot |
sont les informations de protection. |
|||
|
flags |
sont les informations dâattributs. |
filename
est une chaßne décrivant la base de la mémoire allouée.
PERF_RECORD_AUX (depuis Linux 4.1)
Cet enregistrement rend compte des nouvelles données disponibles dans la zone séparée du tampon AUX.
struct {
struct perf_event_header header;
u64 aux_offset;
u64 aux_size;
u64 flags;
struct sample_id sample_id;
};
aux_offset
position dans la zone mmap AUX oĂč commencent les nouvelles donnĂ©es.
aux_size
taille des données disponibles.
|
flags |
décrit la mise à jour AUX. |
PERF_AUX_FLAG_TRUNCATED
sâil est positionnĂ©, les donnĂ©es renvoyĂ©es ont Ă©tĂ© tronquĂ©es pour rentrer dans la taille du tampon disponible.
PERF_AUX_FLAG_OVERWRITE
sâil est positionnĂ©, les donnĂ©es renvoyĂ©es ont Ă©crasĂ© des donnĂ©es prĂ©cĂ©dentes.
PERF_RECORD_ITRACE_START (depuis Linux 4.1)
Cet enregistrement indique le processus qui a initiĂ© un Ă©vĂ©nement de traçage dâinstruction, permettant aux outils de corrĂ©ler correctement les adresses dâinstruction du tampon AUX avec le bon exĂ©cutable.
struct {
struct perf_event_header header;
u32 pid;
u32 tid;
};
|
pid |
identifiant de processus du thread ayant commencĂ© un traçage dâinstruction. |
||
|
tid |
identifiant du thread ayant commencĂ© le traçage dâinstruction. |
PERF_RECORD_LOST_SAMPLES (depuis Linux 4.2)
Lors de lâutilisation de lâĂ©chantillonnage matĂ©riel (comme les PEBS dâIntel), cet enregistrement indique le nombre dâĂ©chantillons qui peuvent avoir Ă©tĂ© perdus.
struct {
struct perf_event_header header;
u64 lost;
struct sample_id sample_id;
};
|
lost |
est le nombre dâĂ©chantillons potentiellement perdus. |
PERF_RECORD_SWITCH (depuis Linux 4.3)
Cet enregistrement indique quâun changement de contexte a eu lieu. Le bit PERF_RECORD_MISC_SWITCH_OUT du champ misc indique si ce changement sâest fait dans ou hors du processus.
struct {
struct perf_event_header header;
struct sample_id sample_id;
};
PERF_RECORD_SWITCH_CPU_WIDE (depuis Linux 4.3)
Comme avec PERF_RECORD_SWITCH , cet enregistrement indique quâun changement de contexte a eu lieu mais il nâarrive que lors de lâĂ©chantillonnage en mode processeur complet et il fournit des informations supplĂ©mentaires sur le processus faisant lâobjet du changement. Le bit PERF_RECORD_MISC_SWITCH_OUT du champ misc indique si le changement a eu lieu dans ou hors du processus actuel.
struct {
struct perf_event_header header;
u32 next_prev_pid;
u32 next_prev_tid;
struct sample_id sample_id;
};
next_prev_pid
Lâidentifiant du processus prĂ©cĂ©dent ou suivant (selon le sens du changement) sur le processeur.
next_prev_tid
Lâidentifiant du thread prĂ©cĂ©dent ou suivant (selon le sens du changement) sur le processeur.
PERF_RECORD_NAMESPACES (depuis Linux 4.11)
Cet enregistrement comprend diverses informations sur lâespace de noms dâun processus.
struct {
struct perf_event_header header;
u32 pid;
u32 tid;
u64 nr_namespaces;
struct { u64 dev, inode } [nr_namespaces];
struct sample_id sample_id;
};
|
pid |
est lâidentifiant de processus. |
|||
|
tid |
est lâidentifiant de thread. |
nr_namespace
est le nombre dâespaces de noms de cet enregistrement.
Chaque espace
de noms a des champs
dev
et
inode
et il est
enregistré dans une position fixe comme celle
ci-dessous :
NET_NS_INDEX
=
0
espace de noms réseau
UTS_NS_INDEX = 1
espace de noms UTS
IPC_NS_INDEX = 2
espace de noms IPC
PID_NS_INDEX = 3
espace de noms PID
USER_NS_INDEX = 4
espace de noms utilisateur
MNT_NS_INDEX = 5
Espace de noms de montage
CGROUP_NS_INDEX = 6
espace de noms de groupe de contrĂŽle
PERF_RECORD_KSYMBOL (depuis Linux 5.0)
Cet enregistrement indique un Ă©vĂ©nement dâenregistrement/dĂ©senregistrement des symboles du noyau.
struct {
struct perf_event_header header;
u64 addr;
u32 len;
u16 ksym_type;
u16 flags;
char name[];
struct sample_id sample_id;
};
|
addr |
est lâadresse du symbole du noyau. |
|||
|
len |
est la taille du symbole du noyau. |
ksym_type
est le type de symbole du
noyau. Actuellement, les types suivants sont
disponibles :
PERF_RECORD_KSYMBOL_TYPE_BPF
Le symbole du noyau est une fonction BPF.
|
flags |
Si PERF_RECORD_KSYMBOL_FLAGS_UNREGISTER est positionnĂ©, cet Ă©vĂ©nement se produit lors du dĂ©senregistrement dâun symbole du noyau. |
PERF_RECORD_BPF_EVENT (depuis Linux 5.0)
Cet enregistrement indique si un programme BPF est chargé ou déchargé.
struct {
struct perf_event_header header;
u16 type;
u16 flags;
u32 id;
u8 tag[BPF_TAG_SIZE];
struct sample_id sample_id;
};
|
type |
est une des valeurs suivantes : |
PERF_BPF_EVENT_PROG_LOAD
Un programme BPF est chargé.
PERF_BPF_EVENT_PROG_UNLOAD
Un programme BPF est déchargé
|
id |
est lâidentifiant du programme BPF. |
||
|
tag |
est lâĂ©tiquette du programme BPF. Actuellement, BPF_TAG_SIZE est dĂ©fini Ă 8 . |
PERF_RECORD_CGROUP (depuis Linux 5.7)
Cet enregistrement indique si un cgroup est créé et activé.
struct {
struct perf_event_header header;
u64 id;
char path[];
struct sample_id sample_id;
};
|
id |
est lâidentifiant du cgroup. Il peut aussi ĂȘtre rĂ©cupĂ©rĂ© Ă lâaide de name_to_handle_at (2) sur le chemin du cgroup (en tant que gestion de fichier). |
||
|
path |
est le chemin du cgroup depuis la racine. |
PERF_RECORD_TEXT_POKE (depuis Linux 5.8)
Cet enregistrement indique une modification dans le texte du noyau. Cela comprend les ajouts et les suppressions de texte et la taille correspondante est de zéro dans ce cas.
struct {
struct perf_event_header header;
u64 addr;
u16 old_len;
u16 new_len;
u8 bytes[];
struct sample_id sample_id;
};
|
addr |
est lâadresse de la modification. |
old_len
est lâancienne taille.
new_len
est la nouvelle taille.
|
bytes |
contient les anciens octets immédiatement suivis des nouveaux. |
Gestion du dépassement
Des Ă©vĂ©nements peuvent ĂȘtre positionnĂ©s pour signaler quand on dĂ©passe une limite, indiquant un dĂ©passement. Les conditions dâun dĂ©passement peuvent ĂȘtre rĂ©cupĂ©rĂ©es avec poll (2), select (2) ou epoll (7). Alternativement, les Ă©vĂšnements de dĂ©passement peuvent ĂȘtre capturĂ©s Ă lâaide dâun gestionnaire de signal en activant les signaux dâE/S sur le descripteur de fichier ; voir le point sur les opĂ©rations F_SETOWN et F_SETSIG dans fcntl (2).
Les dĂ©bordements ne sont gĂ©nĂ©rĂ©s que par les Ă©vĂ©nements dâĂ©chantillonnage ( sample_period doit avoir une valeur non nulle).
Deux façons permettent de générer des notifications de débordement.
La premiĂšre est de paramĂ©trer une valeur wakeup_events ou wakeup_watermark qui gĂ©nĂ©rera un signal si un certain nombre dâĂ©chantillons ou dâoctets ont Ă©tĂ© Ă©crits dans le tampon circulaire mmap. Dans ce cas, un signal de type POLL_IN est envoyĂ©.
Lâautre façon est dâutiliser lâioctl PERF_EVENT_IOC_REFRESH . Cet ioctl ajoute Ă un compteur qui dĂ©crĂ©mente Ă chaque fois que lâĂ©vĂ©nement dĂ©passe. Quand il est non nul, un signal POLL_IN est envoyĂ© en cas de dĂ©passement, mais une fois que la valeur a atteint 0 , un signal de type POLL_HUP est envoyĂ© et lâĂ©vĂ©nement sous-jacent est dĂ©sactivĂ©.
Le rafraĂźchissement dâun leader de groupe dâĂ©vĂ©nements rafraĂźchit toute la fratrie, et un rafraĂźchissement avec un paramĂštre de 0 active un rafraĂźchissement infini. Ces comportements ne sont pas gĂ©rĂ©s et ne devraient pas ĂȘtre utilisĂ©s.
Ă partir de Linux 3.18, POLL_HUP est initiĂ© si lâĂ©vĂ©nement Ă surveiller est rattachĂ© Ă un processus diffĂ©rent et que celui-ci se termine.
Instruction rdpmc
Ă partir de Linux 3.4 sur x86, lâinstruction rdpmc permet dâobtenir des lectures Ă faible latence sans avoir Ă entrer dans le noyau. Remarquez que lâutilisation de rdpmc nâest pas nĂ©cessairement plus rapide que dâautres mĂ©thodes pour lire des valeurs dâĂ©vĂ©nement.
Cette prise en charge peut ĂȘtre dĂ©tectĂ©e avec le champ cap_usr_rdpmc dans la page mmap ; de la documentation pour calculer les valeurs dâĂ©vĂ©nement est disponible dans cette section.
Ă lâorigine, quand la prise en charge de rdpmc a Ă©tĂ© activĂ©e, tout processus (pas seulement ceux ayant un Ă©vĂ©nement perf actif) pouvait utiliser lâinstruction rdpmc pour accĂ©der aux compteurs. Ă partir de Linux 4.0, la prise en charge de rdpmc nâest autorisĂ©e que si un Ă©vĂ©nement est actuellement activĂ© dans le contexte dâun processus. Pour restaurer lâancien comportement, inscrivez la valeur 2 dans /sys/devices/cpu/rdpmc .
Appels ioctl perf_event
Plusieurs ioctls
agissent sur les descripteurs de fichier de
perf_event_open
().
PERF_EVENT_IOC_ENABLE
Cela active lâĂ©vĂ©nement individuel ou le groupe dâĂ©vĂ©nements indiquĂ© par lâargument de descripteur de fichier.
Si le bit PERF_IOC_FLAG_GROUP est dĂ©fini dans lâargument ioctl, alors tous les Ă©vĂ©nements dâun groupe sont activĂ©s, mĂȘme si lâĂ©vĂ©nement indiquĂ© nâest pas le leader de groupe (mais consultez la section BOGUES).
PERF_EVENT_IOC_DISABLE
Cela dĂ©sactive le compteur individuel ou le groupe dâĂ©vĂ©nements indiquĂ© par lâargument de descripteur de fichier.
Lâactivation ou la dĂ©sactivation du leader dâun groupe active ou dĂ©sactive la totalitĂ© du groupe. Autrement dit pendant que le leader de groupe est dĂ©sactivĂ©, aucun des compteurs du groupe ne compte. Lâactivation ou la dĂ©sactivation dâun membre du groupe qui nâest pas le leader arrĂȘte ce son compteur, mais nâaffecte aucun des autres compteurs.
Si le bit PERF_IOC_FLAG_GROUP est dĂ©fini dans lâargument ioctl, alors tous les Ă©vĂ©nements dâun groupe sont dĂ©sactivĂ©s, mĂȘme si lâĂ©vĂ©nement indiquĂ© nâest pas le leader de groupe (mais consultez la section BOGUES).
PERF_EVENT_IOC_REFRESH
Les compteurs de dĂ©passements non hĂ©ritĂ©s peuvent utiliser cela pour activer un compteur pour un nombre de dĂ©passements indiquĂ© par lâargument, aprĂšs lequel il est dĂ©sactivĂ©. Les appels suivants de cet ioctl ajoutent la valeur de lâargument au dĂ©compte actuel. Un signal avec POLL_IN dĂ©fini est envoyĂ© Ă chaque dĂ©passement jusquâĂ ce que ce compte atteigne 0 ; quand cela arrive, un signal avec POLL_HUP dĂ©fini est envoyĂ© et lâĂ©vĂ©nement est dĂ©sactivĂ©. Lâutilisation de 0 comme argument est considĂ©rĂ© comme un comportement indĂ©fini.
PERF_EVENT_IOC_RESET
RedĂ©finir le compte dâĂ©vĂ©nements indiquĂ© par lâargument Ă zĂ©ro. Cela ne rĂ©initialise que les dĂ©comptes ; rĂ©initialiser les valeurs de multiplexage time_enabled et time_running est impossible.
Si le bit PERF_IOC_FLAG_GROUP est dĂ©fini dans lâargument ioctl, alors tous les Ă©vĂ©nements dâun groupe sont rĂ©initialisĂ©s, mĂȘme si lâĂ©vĂ©nement indiquĂ© nâest pas le leader de groupe (mais consultez la section BOGUES).
PERF_EVENT_IOC_PERIOD
Cela met Ă jour la pĂ©riode de dĂ©passement pour lâĂ©vĂ©nement.
Depuis Linux 3.7 (sur ARM) et Linux 3.14 (toutes les autres architectures), la nouvelle pĂ©riode est effective immĂ©diatement. Sur les noyaux prĂ©cĂ©dents, la nouvelle pĂ©riode nâĂ©tait effective quâaprĂšs le dĂ©passement suivant.
Lâargument est un pointeur vers une valeur sur 64 bits contenant la nouvelle pĂ©riode voulue.
Avant Linux 2.6.36, cet ioctl Ă©chouait toujours Ă cause dâun bogue dans le noyau.
PERF_EVENT_IOC_SET_OUTPUT
Cela indique au noyau de signaler les notifications dâĂ©vĂ©nement dans le descripteur de fichier indiquĂ© plutĂŽt que dans celui par dĂ©faut. Les descripteurs de fichier doivent tous ĂȘtre sur le mĂȘme processeur.
Lâargument indique le descripteur de fichier dĂ©sirĂ© ou -1 si la sortie devrait ĂȘtre ignorĂ©e.
PERF_EVENT_IOC_SET_FILTER (depuis Linux 2.6.33)
Cela ajoute un filtre ftrace à cet événement.
Lâargument est un pointeur vers le filtre ftrace voulu.
PERF_EVENT_IOC_ID (depuis Linux 3.12)
Cela renvoie la valeur dâidentifiant de lâĂ©vĂ©nement pour le descripteur de fichier dâĂ©vĂ©nement donnĂ©.
Lâargument est un pointeur vers un entier non signĂ© de 64 bits pour garder le rĂ©sultat.
PERF_EVENT_IOC_SET_BPF (depuis Linux 4.1)
Cela permet de rattacher un programme Berkeley Packet Filter (BPF) Ă un Ă©vĂ©nement de traçage dâun kprobe existant. Vous avez besoin des privilĂšges CAP_PERFMON (depuis Linux 5.8) ou CAP_SYS_ADMIN pour utiliser cet ioctl.
Le paramÚtre est un descripteur de fichier de programme BPF créé par un appel systÚme bpf (2) précédent.
PERF_EVENT_IOC_PAUSE_OUTPUT (depuis Linux 4.7)
Cela permet de mettre en pause et de relancer le tampon circulaire dâun Ă©vĂ©nement. Un tampon mis en pause nâempĂȘche pas la gĂ©nĂ©ration dâĂ©chantillons mais il les dĂ©sactive. Les Ă©chantillons dĂ©sactivĂ©s sont considĂ©rĂ©s comme perdus et provoquent la gĂ©nĂ©ration dâun PERF_RECORD_LOST si possible. Un signal de dĂ©passement peut toujours ĂȘtre rĂ©cupĂ©rĂ© par lâĂ©chantillon dĂ©sactivĂ© bien que le tampon circulaire reste vide.
Le paramĂštre est un entier 32 bits non signĂ©. Une valeur autre que zĂ©ro met en pause le tampon circulaire alors quâune valeur de zĂ©ro rĂ©active le tampon circulaire.
PERF_EVENT_MODIFY_ATTRIBUTES (depuis Linux 4.17)
Cela permet de modifier un Ă©vĂ©nement existant sans le gaspillage de fermeture et rĂ©ouverture dâun nouvel Ă©vĂ©nement. Actuellement, cela nâest pris en charge que pour les Ă©vĂ©nements de points dâarrĂȘt.
Lâargument est un pointeur vers une structure perf_event_attr contenant les paramĂštres de lâĂ©vĂ©nement mis Ă jour.
PERF_EVENT_IOC_QUERY_BPF (depuis Linux 4.16)
Cela permet de chercher les programmes Berkeley Packet Filter (BPF) rattachĂ©s Ă un point de traçage kprobe existant. Vous ne pouvez rattacher quâun programme BPF par Ă©vĂ©nement mais vous pouvez avoir plusieurs Ă©vĂ©nements rattachĂ©s Ă un point de traçage. Rechercher cette valeur sur un Ă©vĂ©nement de point de traçage renvoie lâidentifiant de tous les programmes BPF dans tous les Ă©vĂ©nements rattachĂ©s au point de traçage. Il vous faut les privilĂšges CAP_PERFMON (depuis Linux 5.8) ou CAP_SYS_ADMIN pour utiliser cet ioctl.
Lâargument est un pointeur vers une structure
struct perf_event_query_bpf {
__u32 ids_len;
__u32 prog_cnt;
__u32 ids[0];
};
Le champ ids_len indique le nombre dâidentifiants pouvant entrer dans le tableau ids fourni. La valeur prog_cnt est remplie par le noyau avec le nombre de programmes BPF rattachĂ©s. Le tableau ids est rempli par lâidentifiant de chaque programme BPF rattachĂ©. Sâil y a plus de programmes que de place dans le tableau, le noyau renverra ENOSPC et ids_len indiquera le nombre dâidentifiants de programme copiĂ©s avec succĂšs.
Utilisation de prctl(2)
Un processus peut activer ou dĂ©sactiver tous les groupes dâĂ©vĂ©nements actuellement ouverts en utilisant les opĂ©rations PR_TASK_PERF_EVENTS_ENABLE et PR_TASK_PERF_EVENTS_DISABLE de prctl (2). Cela ne sâapplique quâaux Ă©vĂ©nements créés localement par le processus appelant. Cela ne sâapplique pas aux Ă©vĂ©nements créés par dâautres processus rattachĂ©s au processus appelant ou aux Ă©vĂ©nements dâun processus parent. Cela nâactive et dĂ©sactive que les leaders de groupe, aucun autre des membres des groupes.
Fichiers de configuration relatifs Ă perf_event
Fichiers de /proc/sys/kernel/
/proc/sys/kernel/perf_event_paranoid
Le fichier perf_event_paranoid peut ĂȘtre dĂ©fini pour restreindre lâaccĂšs aux compteurs de performance :
|
2 |
ne permettre que les mesures en espace utilisateur (par défaut depuis Linux 4.6). |
||
|
1 |
permettre à la fois les mesures noyau et utilisateur (par défaut avant Linux 4.6). |
||
|
0 |
permettre lâaccĂšs aux donnĂ©es spĂ©cifiques au processeur sauf les Ă©chantillons de point de trace bruts ; |
||
|
-1 |
pas de restriction. |
Lâexistence du fichier perf_event_paranoid est la mĂ©thode officielle pour dĂ©terminer si un noyau gĂšre perf_event_open ().
/proc/sys/kernel/perf_event_max_sample_rate
Cela dĂ©finit le taux dâĂ©chantillonnage maximal. Un rĂ©glage trop haut peut permettre aux utilisateurs dâĂ©chantillonner Ă un taux ayant un impact sur les performances de la machine et Ă©ventuellement planter la machine. La valeur par dĂ©faut est 100 000 (Ă©chantillons par seconde).
/proc/sys/kernel/perf_event_max_stack
Ce fichier dĂ©finit la profondeur maximale des entrĂ©es de trame de pile signalĂ©es lors de la gĂ©nĂ©ration dâune trace.
/proc/sys/kernel/perf_event_mlock_kb
Le nombre maximal de pages quâun utilisateur sans droit peut verrouiller avec mlock (2). La valeur par dĂ©faut est 516 (ko).
Fichiers de /sys/bus/event_source/devices/
Depuis
Linux 2.6.34, le noyau permet dâavoir plusieurs
PMU disponibles pour la surveillance. Les informations sur
la façon de programmer ces PMU sont disponibles dans
/sys/bus/event_source/devices/
. Tous les
sous-répertoires correspondent à une PMU
différente.
/sys/bus/event_source/devices/*/type
(depuis Linux
2.6.38)
Cela contient un entier qui peut ĂȘtre utilisĂ© dans le champ type de perf_event_attr pour indiquer la volontĂ© dâutiliser cette PMU.
/sys/bus/event_source/devices/cpu/rdpmc (depuis Linux 3.4)
Si ce fichier est 1 , alors lâaccĂšs direct de lâespace utilisateur aux registres de compteurs de performance est permis Ă lâaide de lâinstruction rdpmc. Cela peut ĂȘtre dĂ©sactivĂ© en Ă©crivant 0 dans le fichier.
Ă partir de Linux 4.0, le comportement a changĂ© pour que 1 nâautorise dĂ©sormais que lâaccĂšs aux processus ayant des Ă©vĂ©nements perf actifs et que 2 indique lâancien comportement autorisant lâaccĂšs Ă nâimporte quoi.
/sys/bus/event_source/devices/*/format/ (depuis Linux 3.4)
Ce sous-rĂ©pertoire contient des renseignements sur les sous-champs spĂ©cifiques Ă lâarchitecture disponibles pour la programmation des divers champs config de la structure perf_event_attr .
Le contenu de chaque fichier est le nom du champ de configuration, suivi dâun deux-points, suivi dâune suite dâintervalles dâentiers sĂ©parĂ©s par des virgules. Par exemple, le fichier event pourrait contenir la valeur config1:1,6-10,44 qui indique que lâĂ©vĂ©nement est un attribut qui occupe les bits 1, 6 à  10 et 44 de perf_event_attr::config1 .
/sys/bus/event_source/devices/*/events/ (depuis Linux 3.4)
Ce sous-rĂ©pertoire contient des fichiers avec des Ă©vĂ©nements prĂ©dĂ©finis. Les contenus sont des chaĂźnes dĂ©crivant les rĂ©glages dâĂ©vĂ©nements exprimĂ©s en termes des champs trouvĂ©s dans le rĂ©pertoire ./format/ mentionnĂ© prĂ©cĂ©demment. Ce ne sont pas nĂ©cessairement des listes complĂštes de tous les Ă©vĂšnements pris en charge par une PMU, mais gĂ©nĂ©ralement un sous-ensemble dâĂ©vĂ©nements jugĂ©s utiles ou intĂ©ressants.
Le contenu de chaque fichier est une liste de noms dâattribut sĂ©parĂ©s par des virgules. Chaque entrĂ©e a une valeur facultative (soit hexadĂ©cimale, soit dĂ©cimale). Si aucune valeur nâest indiquĂ©e, alors un champ dâun seul bit de valeur 1 est supposĂ©. Un exemple dâentrĂ©e pourrait ressembler Ă event=0x2,inv,ldlat=3 .
/sys/bus/event_source/devices/*/uevent
Ce fichier est lâinterface standard de pĂ©riphĂ©rique du noyau pour lâinjection dâĂ©vĂ©nements de branchement Ă chaud.
/sys/bus/event_source/devices/*/cpumask (depuis Linux 3.7)
Le fichier cpumask contient une liste dâentiers sĂ©parĂ©s par des virgules indiquant un numĂ©ro reprĂ©sentatif de processeur pour chaque socket (boĂźtier) de la carte mĂšre. Câest nĂ©cessaire lors de la dĂ©finition dâĂ©vĂ©nements uncore ou northbridge, puisque ces PMU prĂ©sentent des Ă©vĂ©nements Ă travers tous les sockets.
VALEUR RENVOYĂE
En cas de succĂšs, perf_event_open () renvoie le nouveau descripteur de fichier. En cas dâĂ©chec, -1 est renvoyĂ© et errno est dĂ©fini pour indiquer lâerreur.
ERREURS
Les erreurs renvoyĂ©es par perf_event_open () peuvent ĂȘtre incohĂ©rentes et peuvent varier suivant les architectures de processeur et les unitĂ©s de surveillance des performances.
|
E2BIG |
Renvoyé si la valeur size de perf_event_attr est trop petite (plus petite que PERF_ATTR_SIZE_VER0 ), trop grande (plus grande que la taille de page) ou plus grande que ce que le noyau peut gérer et que les octets supplémentaires ne sont pas zéro. Lorsque E2BIG est renvoyé, le champ size de perf_event_attr est remplacé, par le noyau, par la taille attendue de la structure. |
||
|
EACCES |
RenvoyĂ© quand lâĂ©vĂ©nement demandĂ© nĂ©cessite les droits CAP_PERFMON (depuis Linux 5.8) ou CAP_SYS_ADMIN (ou un rĂ©glage paranoĂŻaque de perf_event plus permissif). Quelques cas habituels oĂč un processus non privilĂ©giĂ© pourrait tomber sur cette erreur : lâattachement Ă un processus appartenant Ă un autre utilisateur, la surveillance de tous les processus sur un processeur donnĂ© (câest-Ă -dire en indiquant -1 pour lâargument pid ) et lâabsence de rĂ©glage exclude_kernel quand le rĂ©glage paranoĂŻaque le nĂ©cessite. |
||
|
EBADF |
RenvoyĂ© si le descripteur de fichier group_fd nâest pas valable, ou, si PERF_FLAG_PID_CGROUP est dĂ©fini, si le descripteur de fichier cgroup dans pid nâest pas valable. |
EBUSY (depuis Linux 4.1)
Renvoyé si un événement a déjà un accÚs exclusif à la PMU.
|
EFAULT |
Renvoyé si le pointeur attr pointe vers un adresse de mémoire non valable. |
||
|
EINTR |
Renvoyé si on essaie de mélanger la gestion de perf et de ftrace pour un uprobe. |
||
|
EINVAL |
RenvoyĂ© si lâĂ©vĂ©nement indiquĂ© nâest pas valable. De nombreuse raisons sont possibles pour cela. Une liste non exhaustive : sample_freq est plus grand que le rĂ©glage maximal ; le cpu Ă surveiller nâexiste pas ; read_format est hors intervalle ; sample_type est hors intervalle ; la valeur flags est hors intervalle ; exclusive ou pinned sont dĂ©finis et lâĂ©vĂ©nement nâest pas un leader de groupe ; les valeurs config de lâĂ©vĂ©nement sont hors de lâintervalle ou des bits rĂ©servĂ©s dĂ©finis ; lâĂ©vĂ©nement gĂ©nĂ©rique sĂ©lectionnĂ© nâest pas pris en charge ; la place est insuffisante pour ajouter lâĂ©vĂ©nement sĂ©lectionnĂ©. |
||
|
EMFILE |
Chaque Ă©vĂ©nement ouvert utilise un descripteur de fichier. Si un grand nombre dâĂ©vĂ©nements est ouvert, la limite de descripteurs de fichier par processus sera atteinte et aucun Ă©vĂ©nement supplĂ©mentaire ne pourra ĂȘtre créé. |
||
|
ENODEV |
RenvoyĂ© quand lâĂ©vĂ©nement implique une fonctionnalitĂ© non prise en charge par le processeur actuel. |
||
|
ENOENT |
RenvoyĂ© si le rĂ©glage type nâest pas valable. Cette erreur est Ă©galement renvoyĂ©e pour certains Ă©vĂ©nements gĂ©nĂ©riques non pris en charge. |
||
|
ENOSPC |
Avant Linux 3.3, sâil manquait de la place pour lâĂ©vĂ©nement, ENOSPC Ă©tait renvoyĂ©. Dans Linux 3.3, cela a Ă©tĂ© modifiĂ© en EINVAL . ENOSPC est toujours renvoyĂ© en cas de tentative dâajout de plus dâĂ©vĂ©nements de point dâarrĂȘt que permis par le matĂ©riel. |
||
|
ENOSYS |
RenvoyĂ© si PERF_SAMPLE_STACK_USER est dĂ©fini dans sample_type et que ce nâest pas pris en charge par le matĂ©riel. |
EOPNOTSUPP
RenvoyĂ© si un Ă©vĂ©nement nĂ©cessitant une fonctionnalitĂ© spĂ©cifique du matĂ©riel est demandĂ© alors quâil nây a pas de prise en charge matĂ©rielle. Cela comprend la demande dâĂ©vĂ©nement Ă faible dĂ©rapage si ce nâest pas pris en charge, le suivi de branchement sâil nâest pas pris en charge, lâĂ©chantillonnage si aucune interruption PMU nâest disponible et les piles de branchement pour les Ă©vĂ©nements logiciels.
EOVERFLOW (depuis Linux 4.8)
Renvoyé si PERF_SAMPLE_CALLCHAIN est demandé et si sample_max_stack est plus grand que le maximum indiqué dans /proc/sys/kernel/perf_event_max_stack .
|
EPERM |
RenvoyĂ© sur beaucoup dâarchitectures (mais pas toutes) quand un des rĂ©glages exclude_hv , exclude_idle , exclude_user ou exclude_kernel non pris en charge est indiquĂ©. |
Cela peut aussi arriver, comme avec EACCES , quand lâĂ©vĂ©nement demandĂ© nĂ©cessite les droits CAP_PERFMON (depuis Linux 5.8) ou CAP_SYS_ADMIN (ou un rĂ©glage paranoĂŻaque de perf_event plus permissif). Cela comprend le rĂ©glage dâun point dâarrĂȘt sur une adresse du noyau et (depuis Linux 3.13) le rĂ©glage dâun point de trace de fonction du noyau.
|
ESRCH |
RenvoyĂ© en cas de tentative dâattachement Ă un processus qui nâexiste pas. |
STANDARDS
Linux.
HISTORIQUE
perf_event_open () a été introduite dans Linux 2.6.31 mais était appelée perf_counter_open (). Elle a été renommée dans Linux 2.6.32.
NOTES
Le moyen officiel pour savoir si la prise en charge de perf_event_open () est activée est de vérifier si le fichier /proc/sys/kernel/perf_event_paranoid existe.
La capacitĂ© CAP_PERFMON (depuis Linux 5.58) fournit une approche sĂ©curisĂ©e de la surveillance des performances et des opĂ©rations de visibilitĂ© dâun systĂšme suivant un principe du moindre privilĂšge (POSIX IEEE 1003.1e). Ces modalitĂ©s dâaccĂšs qui utilisent CAP_PERFMON au lieu du beaucoup plus puissant CAP_SYS_ADMIN enlĂšve des chances dâune mauvaise utilisation des droits et rend les opĂ©rations plus sĂ©curisĂ©es. Lâutilisation de CAP_SYS_ADMIN pour la surveillance sĂ©curisĂ©e des performances du systĂšme et une meilleure visibilitĂ© est dĂ©conseillĂ©e et vous devriez prĂ©fĂ©rer la capacitĂ© CAP_PERFMON .
BOGUES
Lâoption F_SETOWN_EX de fcntl (2) est nĂ©cessaire pour obtenir correctement les signaux de dĂ©passement dans les threads. Cela a Ă©tĂ© introduit dans Linux 2.6.32.
Avant Linux 3.3 (en tout cas pour x86), le noyau ne vĂ©rifiait pas si les Ă©vĂ©nements pouvaient ĂȘtre programmĂ©s ensemble avant le moment de la lecture. La mĂȘme chose arrive sur tous les noyaux connus si le watchdog NMI est activĂ©. Cela signifie que pour voir si un ensemble donnĂ© dâĂ©vĂ©nements fonctionne, il faut appeler perf_event_open (), dĂ©marrer, puis lire avant dâĂȘtre sĂ»r de pouvoir obtenir des mesures valables.
Avant Linux 2.6.34, les contraintes dâĂ©vĂ©nements nâĂ©taient pas renforcĂ©es par le noyau. Dans ce cas, certains Ă©vĂ©nements renverraient « 0 » silencieusement si le noyau les avait programmĂ©s dans un emplacement de compteur incorrect.
Avant Linux 2.6.34, Ă cause dâun bogue lors du multiplexage, de mauvais rĂ©sultats pouvaient ĂȘtre renvoyĂ©s.
Les noyaux de Linux 2.6.35 à Linux 2.6.39 peuvent planter rapidement si inherit est activé et que de nombreux threads sont démarrés.
Avant Linux 2.6.35, PERF_FORMAT_GROUP ne fonctionnait pas avec les processus attachés.
Ă cause dâun bogue dans le code du noyau entre Linux 2.6.36 et Linux 3.0, le champ watermark Ă©tait ignorĂ© et agissait comme si wakeup_event avait Ă©tĂ© choisi si lâunion contenait une valeur non nulle.
De Linux 2.6.31 Ă Linux 3.4, lâargument ioctl PERF_IOC_FLAG_GROUP Ă©tait cassĂ© et opĂ©rait Ă rĂ©pĂ©tition sur lâĂ©vĂ©nement indiquĂ© au lieu dâitĂ©rer parmi tous les Ă©vĂ©nements dâune fratrie dâun groupe.
De Linux 3.4 Ă Linux 3.11, les bits mmap cap_usr_rdpmc et cap_usr_time Ă©taient associĂ©s au mĂȘme emplacement. Le code devrait plutĂŽt ĂȘtre modifiĂ© pour utiliser les nouveaux champs cap_user_rdpmc et cap_user_time Ă la place.
VĂ©rifiez toujours deux fois les rĂ©sultats. Plusieurs Ă©vĂ©nements gĂ©nĂ©ralisĂ©s ont eu de fausses valeurs. Par exemple, les branchements retirĂ©s ne mesuraient pas la bonne chose sur les machines AMD jusquâau noyau 2.6.35.
EXEMPLES
Ce qui suit est un court exemple qui mesure le dĂ©compte total dâinstructions dâun appel Ă printf (3).
#include
<linux/perf_event.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ioctl.h>
#include <sys/syscall.h>
#include <sys/types.h>
#include <unistd.h>
static long
perf_event_open(struct perf_event_attr *hw_event, pid_t pid,
int cpu, int group_fd, unsigned long flags)
{
int ret;
ret = syscall(SYS_perf_event_open, hw_event, pid, cpu,
group_fd, flags);
return ret;
}
int
main(void)
{
int fd;
long long count;
struct perf_event_attr pe;
memset(&pe, 0, sizeof(pe));
pe.type = PERF_TYPE_HARDWARE;
pe.size = sizeof(pe);
pe.config = PERF_COUNT_HW_INSTRUCTIONS;
pe.disabled = 1;
pe.exclude_kernel = 1;
pe.exclude_hv = 1;
fd = perf_event_open(&pe, 0, -1, -1, 0);
if (fd == -1) {
fprintf(stderr, "Erreur dâouverture du leader
%llx\n", pe.config);
exit(EXIT_FAILURE);
}
ioctl(fd, PERF_EVENT_IOC_RESET, 0);
ioctl(fd, PERF_EVENT_IOC_ENABLE, 0);
printf("Mesure du dĂ©compte dâinstructions
pour ce printf\n");
ioctl(fd, PERF_EVENT_IOC_DISABLE, 0);
read(fd, &count, sizeof(count));
printf("%lld instructions utilisées\n",
count);
close(fd);
}
VOIR AUSSI
perf (1), fcntl (2), mmap (2), open (2), prctl (2), read (2)
Documentation/admin-guide/perf-security.rst dans lâarborescence des sources du noyau
TRADUCTION
La traduction française de cette page de manuel a été créée par Christophe Blaess <https://www.blaess.fr/christophe/>, Stéphan Rafin <stephan.rafin@laposte.net>, Thierry Vignaud <tvignaud@mandriva.com>, François Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Guérard <fevrier@tigreraye.org>, Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>, Julien Cristau <jcristau@debian.org>, Thomas Huriaux <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>, Denis Barbier <barbier@debian.org>, David Prévot <david@tilapin.org> et Jean-Philippe MENGUAL <jpmengual@debian.org>
Cette traduction est une documentation libre ; veuillez vous reporter Ă la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il nây a aucune RESPONSABILITĂ LĂGALE.
Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à debian-l10n-french@lists.debian.org .