diff options
author | Jaroslav Skarvada <jskarvad@redhat.com> | 2013-10-09 12:44:36 +0300 |
---|---|---|
committer | Sergey Senozhatsky <sergey.senozhatsky@gmail.com> | 2013-10-09 12:46:01 +0300 |
commit | e6d483c8f570f7490fd93b1f920f0450c051f9d4 (patch) | |
tree | 5e96af3f9d1aff3695d43fb558631115de572642 | |
parent | 8d6e7163b9ed44e4a4d5a8a40ccca8612e42d409 (diff) |
tell user if the system is running out of FDs
From: Jaroslav Skarvada <jskarvad@redhat.com>
complex servers can run out of FDs easily (due to perf).
In such case tell user that more FDs are needed instead
of the generic message (that kernel doesn't support
the perf).
-rw-r--r-- | src/perf/perf.cpp | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/src/perf/perf.cpp b/src/perf/perf.cpp index e919741..b176256 100644 --- a/src/perf/perf.cpp +++ b/src/perf/perf.cpp @@ -26,6 +26,7 @@ #include <iostream> #include <fstream> +#include <errno.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> @@ -72,6 +73,7 @@ void perf_event::create_perf_event(char *eventname, int _cpu) { struct perf_event_attr attr; int ret; + int err; struct { __u64 count; @@ -107,10 +109,15 @@ void perf_event::create_perf_event(char *eventname, int _cpu) perf_fd = sys_perf_event_open(&attr, -1, _cpu, -1, 0); if (perf_fd < 0) { + err = errno; reset_display(); - fprintf(stderr, _("PowerTOP %s needs the kernel to support the 'perf' subsystem\n"), POWERTOP_VERSION); - fprintf(stderr, _("as well as support for trace points in the kernel:\n")); - fprintf(stderr, "CONFIG_PERF_EVENTS=y\nCONFIG_PERF_COUNTERS=y\nCONFIG_TRACEPOINTS=y\nCONFIG_TRACING=y\n"); + if (err == EMFILE) + fprintf(stderr, _("Too many open files, please increase the limit of open file descriptors.\n")); + else { + fprintf(stderr, _("PowerTOP %s needs the kernel to support the 'perf' subsystem\n"), POWERTOP_VERSION); + fprintf(stderr, _("as well as support for trace points in the kernel:\n")); + fprintf(stderr, "CONFIG_PERF_EVENTS=y\nCONFIG_PERF_COUNTERS=y\nCONFIG_TRACEPOINTS=y\nCONFIG_TRACING=y\n"); + } exit(EXIT_FAILURE); } if (read(perf_fd, &read_data, sizeof(read_data)) == -1) { |