gpt4 book ai didi

c - perf_event_open 不能打开超过 7 个 fd

转载 作者:太空宇宙 更新时间:2023-11-04 07:59:18 37 4
gpt4 key购买 nike

这是我的代码,perf_event_open 不能打开超过 7 个 fds

#include <errno.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/ioctl.h>
#include <linux/perf_event.h>
#include <asm/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(__NR_perf_event_open, hw_event, pid, cpu,
group_fd, flags);
return ret;
}

int
main(int argc, char **argv)
{
struct perf_event_attr pe;
long long count;
int fd,fd1,fd2,fd3,fd4,fd5,fd6,fd7,fd8;

memset(&pe, 0, sizeof(struct perf_event_attr));
pe.type = PERF_TYPE_HARDWARE;
pe.size = sizeof(struct perf_event_attr);
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, "Error opening leader %llx, errno:%d, reason:%s\n", pe.config, errno, strerror(errno));
exit(EXIT_FAILURE);
}

ioctl(fd, PERF_EVENT_IOC_RESET, 0);
ioctl(fd, PERF_EVENT_IOC_ENABLE, 0);

printf("Measuring instruction count for this printf\n");

ioctl(fd, PERF_EVENT_IOC_DISABLE, 0);
read(fd, &count, sizeof(long long));

printf("Used %lld instructions\n", count);

// ----------------------------------------------------------------------
memset(&pe, 0, sizeof(struct perf_event_attr));
pe.type = PERF_TYPE_HARDWARE;
pe.size = sizeof(struct perf_event_attr);
pe.config = PERF_COUNT_HW_CPU_CYCLES;
pe.disabled = 1;
pe.exclude_kernel = 1;
pe.exclude_hv = 1;

fd1 = perf_event_open(&pe, 0, -1, -1, 0);
if (fd1 == -1) {
fprintf(stderr, "Error opening leader %llx, errno:%d, reason:%s\n", pe.config, errno, strerror(errno));
exit(EXIT_FAILURE);
}

ioctl(fd1, PERF_EVENT_IOC_RESET, 0);
ioctl(fd1, PERF_EVENT_IOC_ENABLE, 0);

printf("Measuring cpu cycles count for this printf\n");

ioctl(fd1, PERF_EVENT_IOC_DISABLE, 0);
read(fd1, &count, sizeof(long long));

printf("Used %lld instructions\n", count);
// ----------------------------------------------------------------------

// ----------------------------------------------------------------------
memset(&pe, 0, sizeof(struct perf_event_attr));
pe.type = PERF_TYPE_HARDWARE;
pe.size = sizeof(struct perf_event_attr);
pe.config = PERF_COUNT_HW_CACHE_REFERENCES;
pe.disabled = 1;
pe.exclude_kernel = 1;
pe.exclude_hv = 1;

fd2 = perf_event_open(&pe, 0, -1, -1, 0);
if (fd2 == -1) {
fprintf(stderr, "Error opening leader %llx, errno:%d, reason:%s\n", pe.config, errno, strerror(errno));
exit(EXIT_FAILURE);
}

ioctl(fd2, PERF_EVENT_IOC_RESET, 0);
ioctl(fd2, PERF_EVENT_IOC_ENABLE, 0);

printf("Measuring cache references count for this printf\n");

ioctl(fd2, PERF_EVENT_IOC_DISABLE, 0);
read(fd2, &count, sizeof(long long));

printf("Used %lld instructions\n", count);
// ----------------------------------------------------------------------

// ----------------------------------------------------------------------
memset(&pe, 0, sizeof(struct perf_event_attr));
pe.type = PERF_TYPE_HARDWARE;
pe.size = sizeof(struct perf_event_attr);
pe.config = PERF_COUNT_HW_CACHE_MISSES;
pe.disabled = 1;
pe.exclude_kernel = 1;
pe.exclude_hv = 1;

fd3 = perf_event_open(&pe, 0, -1, -1, 0);
if (fd3 == -1) {
fprintf(stderr, "Error opening leader %llx, errno:%d, reason:%s\n", pe.config, errno, strerror(errno));
exit(EXIT_FAILURE);
}

ioctl(fd3, PERF_EVENT_IOC_RESET, 0);
ioctl(fd3, PERF_EVENT_IOC_ENABLE, 0);

printf("Measuring cache misses count for this printf\n");

ioctl(fd3, PERF_EVENT_IOC_DISABLE, 0);
read(fd3, &count, sizeof(long long));

printf("Used %lld instructions\n", count);
// ----------------------------------------------------------------------

// ----------------------------------------------------------------------
memset(&pe, 0, sizeof(struct perf_event_attr));
pe.type = PERF_TYPE_HARDWARE;
pe.size = sizeof(struct perf_event_attr);
pe.config = PERF_COUNT_HW_BRANCH_INSTRUCTIONS;
pe.disabled = 1;
pe.exclude_kernel = 1;
pe.exclude_hv = 1;

fd4 = perf_event_open(&pe, 0, -1, -1, 0);
if (fd4 == -1) {
fprintf(stderr, "Error opening leader %llx, errno:%d, reason:%s\n", pe.config, errno, strerror(errno));
exit(EXIT_FAILURE);
}

ioctl(fd4, PERF_EVENT_IOC_RESET, 0);
ioctl(fd4, PERF_EVENT_IOC_ENABLE, 0);

printf("Measuring branch instructions count for this printf\n");

ioctl(fd4, PERF_EVENT_IOC_DISABLE, 0);
read(fd4, &count, sizeof(long long));

printf("Used %lld instructions\n", count);
// ----------------------------------------------------------------------

// ----------------------------------------------------------------------
memset(&pe, 0, sizeof(struct perf_event_attr));
pe.type = PERF_TYPE_HARDWARE;
pe.size = sizeof(struct perf_event_attr);
pe.config = PERF_COUNT_HW_BRANCH_MISSES;
pe.disabled = 1;
pe.exclude_kernel = 1;
pe.exclude_hv = 1;

fd5 = perf_event_open(&pe, 0, -1, -1, 0);
if (fd5 == -1) {
fprintf(stderr, "Error opening leader %llx, errno:%d, reason:%s\n", pe.config, errno, strerror(errno));
exit(EXIT_FAILURE);
}

ioctl(fd5, PERF_EVENT_IOC_RESET, 0);
ioctl(fd5, PERF_EVENT_IOC_ENABLE, 0);

printf("Measuring branch misses count for this printf\n");

ioctl(fd5, PERF_EVENT_IOC_DISABLE, 0);
read(fd5, &count, sizeof(long long));

printf("Used %lld instructions\n", count);
// ----------------------------------------------------------------------

// ----------------------------------------------------------------------
memset(&pe, 0, sizeof(struct perf_event_attr));
pe.type = PERF_TYPE_HARDWARE;
pe.size = sizeof(struct perf_event_attr);
pe.config = PERF_COUNT_HW_BUS_CYCLES;
pe.disabled = 1;
pe.exclude_kernel = 1;
pe.exclude_hv = 1;

fd6 = perf_event_open(&pe, 0, -1, -1, 0);
if (fd6 == -1) {
fprintf(stderr, "Error opening leader %llx, errno:%d, reason:%s\n", pe.config, errno, strerror(errno));
exit(EXIT_FAILURE);
}

ioctl(fd6, PERF_EVENT_IOC_RESET, 0);
ioctl(fd6, PERF_EVENT_IOC_ENABLE, 0);

printf("Measuring bus cycles count for this printf\n");

ioctl(fd6, PERF_EVENT_IOC_DISABLE, 0);
read(fd6, &count, sizeof(long long));

printf("Used %lld instructions\n", count);
// ----------------------------------------------------------------------

// ----------------------------------------------------------------------
memset(&pe, 0, sizeof(struct perf_event_attr));
pe.type = PERF_TYPE_HARDWARE;
pe.size = sizeof(struct perf_event_attr);
pe.config = PERF_COUNT_HW_STALLED_CYCLES_FRONTEND;
pe.disabled = 1;
pe.exclude_kernel = 1;
pe.exclude_hv = 1;

fd7 = perf_event_open(&pe, 0, -1, -1, 0);
if (fd7 == -1) {
fprintf(stderr, "Error opening leader %llx, errno:%d, reason:%s\n", pe.config, errno, strerror(errno));
exit(EXIT_FAILURE);
}

ioctl(fd7, PERF_EVENT_IOC_RESET, 0);
ioctl(fd7, PERF_EVENT_IOC_ENABLE, 0);

printf("Measuring stalled cycles frontend count for this printf\n");

ioctl(fd7, PERF_EVENT_IOC_DISABLE, 0);
read(fd7, &count, sizeof(long long));

printf("Used %lld instructions\n", count);
// ----------------------------------------------------------------------

// ----------------------------------------------------------------------
memset(&pe, 0, sizeof(struct perf_event_attr));
pe.type = PERF_TYPE_HARDWARE;
pe.size = sizeof(struct perf_event_attr);
pe.config = PERF_COUNT_HW_STALLED_CYCLES_BACKEND;
pe.disabled = 1;
pe.exclude_kernel = 1;
pe.exclude_hv = 1;

fd8 = perf_event_open(&pe, 0, -1, -1, 0);
if (fd8 == -1) {
fprintf(stderr, "Error opening leader %llx, errno:%d, reason:%s\n", pe.config, errno, strerror(errno));
exit(EXIT_FAILURE);
}

ioctl(fd8, PERF_EVENT_IOC_RESET, 0);
ioctl(fd8, PERF_EVENT_IOC_ENABLE, 0);

printf("Measuring stalled cycles backend count for this printf\n");

ioctl(fd8, PERF_EVENT_IOC_DISABLE, 0);
read(fd8, &count, sizeof(long long));

printf("Used %lld instructions\n", count);
// ----------------------------------------------------------------------

close(fd);
close(fd1);
close(fd2);
close(fd3);
close(fd4);
close(fd5);
close(fd6);
close(fd7);
close(fd8);
}

这里是输出,只有前 7 个 perf 事件被打开,其余的将失败并返回 errno 2。

Measuring instruction count for this printf 
Used 3857 instructions
Measuring cpu cycles count for this printf
Used 1546 instructions
Measuring cache references count for this printf
Used 17 instructions
Measuring cache misses count for this printf
Used 0 instructions
Measuring branch instructions count for this printf
Used 194 instructions
Measuring branch misses count for this printf
Used 12 instructions
Measuring bus cycles count for this printf
Used 34 instructions
Error opening leader 7, errno:2, reason:No such file or directory

我在 linux 手册页中找不到关于此限制的任何说明,请告诉我发生了什么,非常感谢。我的操作系统版本是 centos 6.5 。

最佳答案

这与打开的 perf 事件的数量无关,因为您只需删除前 7 个 perf_event_open 调用即可轻松找到。

没有这样的文件或目录 (ENOENT) 与太多打开的文件 (EMFILE ). perf_event_open 的联机帮助页解释了返回码:

ENOENT Returned if the type setting is not valid. This error is also returned for some unsupported generic events.

该事件在您的系统(使用给定的内核)上根本不可用。 This answer讨论了 PERF_COUNT_HW_STALLED_CYCLES_*END 事件在现代 CPU 上的可用性。

关于c - perf_event_open 不能打开超过 7 个 fd,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47829826/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com