aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJaroslav Skarvada <jskarvad@redhat.com>2013-10-09 12:44:36 +0300
committerSergey Senozhatsky <sergey.senozhatsky@gmail.com>2013-10-09 12:46:01 +0300
commite6d483c8f570f7490fd93b1f920f0450c051f9d4 (patch)
tree5e96af3f9d1aff3695d43fb558631115de572642
parent8d6e7163b9ed44e4a4d5a8a40ccca8612e42d409 (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.cpp13
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) {