* [PATCH] multipath-tools: Improvement to max_fds
@ 2009-05-14 4:03 Benjamin Marzinski
2009-05-14 4:35 ` Benjamin Marzinski
0 siblings, 1 reply; 2+ messages in thread
From: Benjamin Marzinski @ 2009-05-14 4:03 UTC (permalink / raw)
To: device-mapper development
Setting max_fds to unlimited doesn't actually work. In the kernel, there is a
fixed limit to the maximum number of open fds a process can have. If you try
to set max_fds to greater than this, it fails. This patch replaces the special
value "unlimited" with a new special value, "max". If you set max_fds to "max",
multipath will use the actual system limit, which it looks up from
/proc/sys/fs/nr_open.
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
---
libmultipath/dict.c | 39 +++++++++++++++++++++++++++++++++------
libmultipath/structs.h | 1 -
multipath.conf.annotated | 2 +-
multipath/main.c | 11 +++--------
multipath/multipath.conf.5 | 8 ++++++++
multipathd/main.c | 11 +++--------
6 files changed, 48 insertions(+), 24 deletions(-)
Index: multipath-tools-090513/libmultipath/dict.c
===================================================================
--- multipath-tools-090513.orig/libmultipath/dict.c
+++ multipath-tools-090513/libmultipath/dict.c
@@ -156,23 +156,52 @@ def_minio_handler(vector strvec)
}
static int
+get_sys_max_fds(int *max_fds)
+{
+ FILE *file;
+ int nr_open;
+ int ret = 1;
+
+ file = fdopen("/proc/sys/fs/nr_open", "r");
+ if (!file) {
+ fprintf(stderr, "Cannot open /proc/sys/fs/nr_open : %s\n",
+ strerror(errno));
+ return 1;
+ }
+ if (fscanf(file, "%d", &nr_open) != 1) {
+ fprintf(stderr, "Cannot read max open fds from /proc/sys/fs/nr_open");
+ if (ferror(file))
+ fprintf(" : %s\n", strerror(errno));
+ else
+ fprintf("\n");
+ } else {
+ *max_fds = nr_open;
+ ret = 0;
+ }
+ fclose(file);
+ return ret;
+}
+
+
+static int
max_fds_handler(vector strvec)
{
char * buff;
+ int r = 0;
buff = set_value(strvec);
if (!buff)
return 1;
- if (strlen(buff) == 9 &&
- !strcmp(buff, "unlimited"))
- conf->max_fds = MAX_FDS_UNLIMITED;
+ if (strlen(buff) == 3 &&
+ !strcmp(buff, "max"))
+ r = get_sys_max_fds(&conf->max_fds);
else
conf->max_fds = atoi(buff);
FREE(buff);
- return 0;
+ return r;
}
static int
@@ -1777,8 +1806,6 @@ snprint_max_fds (char * buff, int len, v
if (!conf->max_fds)
return 0;
- if (conf->max_fds < 0)
- return snprintf(buff, len, "unlimited");
return snprintf(buff, len, "%d", conf->max_fds);
}
Index: multipath-tools-090513/libmultipath/structs.h
===================================================================
--- multipath-tools-090513.orig/libmultipath/structs.h
+++ multipath-tools-090513/libmultipath/structs.h
@@ -24,7 +24,6 @@
#define NO_PATH_RETRY_FAIL -1
#define NO_PATH_RETRY_QUEUE -2
-#define MAX_FDS_UNLIMITED -1
enum free_path_switch {
KEEP_PATHS,
Index: multipath-tools-090513/multipath/main.c
===================================================================
--- multipath-tools-090513.orig/multipath/main.c
+++ multipath-tools-090513/multipath/main.c
@@ -428,14 +428,9 @@ main (int argc, char *argv[])
if (conf->max_fds) {
struct rlimit fd_limit;
- if (conf->max_fds > 0) {
- fd_limit.rlim_cur = conf->max_fds;
- fd_limit.rlim_max = conf->max_fds;
- }
- else {
- fd_limit.rlim_cur = RLIM_INFINITY;
- fd_limit.rlim_max = RLIM_INFINITY;
- }
+
+ fd_limit.rlim_cur = conf->max_fds;
+ fd_limit.rlim_max = conf->max_fds;
if (setrlimit(RLIMIT_NOFILE, &fd_limit) < 0)
condlog(0, "can't set open fds limit to %d : %s\n",
conf->max_fds, strerror(errno));
Index: multipath-tools-090513/multipath.conf.annotated
===================================================================
--- multipath-tools-090513.orig/multipath.conf.annotated
+++ multipath-tools-090513/multipath.conf.annotated
@@ -113,7 +113,7 @@
# # scope : multipathd
# # desc : Sets the maximum number of open file descriptors for the
# # multipathd process.
-# # values : unlimited|n > 0
+# # values : max|n > 0
# # default : None
# #
# max_fds 8192
Index: multipath-tools-090513/multipath/multipath.conf.5
===================================================================
--- multipath-tools-090513.orig/multipath/multipath.conf.5
+++ multipath-tools-090513/multipath/multipath.conf.5
@@ -230,6 +230,14 @@ use the WWID as the alias. In either cas
be overriden by any specific aliases in the \fImultipaths\fR section.
Default is
.I no
+.TP
+.B max_fds
+Specify the maximum number of file descriptors that can be opened by multipath
+and multipathd. This is equivalent to ulimit -n. A value of \fImax\fR will set
+this to the system limit from /proc/sys/fs/nr_open. If this is not set, the
+maximum number of open fds is taken from the calling process. It is usually
+1024. To be safe, this should be set to the maximum number of paths plus 32,
+if that number is greated than 1024.
.
.SH "blacklist section"
The
Index: multipath-tools-090513/multipathd/main.c
===================================================================
--- multipath-tools-090513.orig/multipathd/main.c
+++ multipath-tools-090513/multipathd/main.c
@@ -1375,14 +1375,9 @@ child (void * param)
if (conf->max_fds) {
struct rlimit fd_limit;
- if (conf->max_fds > 0) {
- fd_limit.rlim_cur = conf->max_fds;
- fd_limit.rlim_max = conf->max_fds;
- }
- else {
- fd_limit.rlim_cur = RLIM_INFINITY;
- fd_limit.rlim_max = RLIM_INFINITY;
- }
+
+ fd_limit.rlim_cur = conf->max_fds;
+ fd_limit.rlim_max = conf->max_fds;
if (setrlimit(RLIMIT_NOFILE, &fd_limit) < 0)
condlog(0, "can't set open fds limit to %d : %s\n",
conf->max_fds, strerror(errno));
^ permalink raw reply [flat|nested] 2+ messages in thread* Re: [PATCH] multipath-tools: Improvement to max_fds
2009-05-14 4:03 [PATCH] multipath-tools: Improvement to max_fds Benjamin Marzinski
@ 2009-05-14 4:35 ` Benjamin Marzinski
0 siblings, 0 replies; 2+ messages in thread
From: Benjamin Marzinski @ 2009-05-14 4:35 UTC (permalink / raw)
To: device-mapper development
On Wed, May 13, 2009 at 11:03:06PM -0500, Benjamin Marzinski wrote:
Due to my brain apparently turning off at 11:30, I forgot to actually
refresh my patch before sending it. So this patch is not the final
version. In fact, it doesn't even compile. I'll send a working version
in a sec.
-Ben
> Setting max_fds to unlimited doesn't actually work. In the kernel, there is a
> fixed limit to the maximum number of open fds a process can have. If you try
> to set max_fds to greater than this, it fails. This patch replaces the special
> value "unlimited" with a new special value, "max". If you set max_fds to "max",
> multipath will use the actual system limit, which it looks up from
> /proc/sys/fs/nr_open.
>
> Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
> ---
> libmultipath/dict.c | 39 +++++++++++++++++++++++++++++++++------
> libmultipath/structs.h | 1 -
> multipath.conf.annotated | 2 +-
> multipath/main.c | 11 +++--------
> multipath/multipath.conf.5 | 8 ++++++++
> multipathd/main.c | 11 +++--------
> 6 files changed, 48 insertions(+), 24 deletions(-)
>
> Index: multipath-tools-090513/libmultipath/dict.c
> ===================================================================
> --- multipath-tools-090513.orig/libmultipath/dict.c
> +++ multipath-tools-090513/libmultipath/dict.c
> @@ -156,23 +156,52 @@ def_minio_handler(vector strvec)
> }
>
> static int
> +get_sys_max_fds(int *max_fds)
> +{
> + FILE *file;
> + int nr_open;
> + int ret = 1;
> +
> + file = fdopen("/proc/sys/fs/nr_open", "r");
> + if (!file) {
> + fprintf(stderr, "Cannot open /proc/sys/fs/nr_open : %s\n",
> + strerror(errno));
> + return 1;
> + }
> + if (fscanf(file, "%d", &nr_open) != 1) {
> + fprintf(stderr, "Cannot read max open fds from /proc/sys/fs/nr_open");
> + if (ferror(file))
> + fprintf(" : %s\n", strerror(errno));
> + else
> + fprintf("\n");
> + } else {
> + *max_fds = nr_open;
> + ret = 0;
> + }
> + fclose(file);
> + return ret;
> +}
> +
> +
> +static int
> max_fds_handler(vector strvec)
> {
> char * buff;
> + int r = 0;
>
> buff = set_value(strvec);
>
> if (!buff)
> return 1;
>
> - if (strlen(buff) == 9 &&
> - !strcmp(buff, "unlimited"))
> - conf->max_fds = MAX_FDS_UNLIMITED;
> + if (strlen(buff) == 3 &&
> + !strcmp(buff, "max"))
> + r = get_sys_max_fds(&conf->max_fds);
> else
> conf->max_fds = atoi(buff);
> FREE(buff);
>
> - return 0;
> + return r;
> }
>
> static int
> @@ -1777,8 +1806,6 @@ snprint_max_fds (char * buff, int len, v
> if (!conf->max_fds)
> return 0;
>
> - if (conf->max_fds < 0)
> - return snprintf(buff, len, "unlimited");
> return snprintf(buff, len, "%d", conf->max_fds);
> }
>
> Index: multipath-tools-090513/libmultipath/structs.h
> ===================================================================
> --- multipath-tools-090513.orig/libmultipath/structs.h
> +++ multipath-tools-090513/libmultipath/structs.h
> @@ -24,7 +24,6 @@
> #define NO_PATH_RETRY_FAIL -1
> #define NO_PATH_RETRY_QUEUE -2
>
> -#define MAX_FDS_UNLIMITED -1
>
> enum free_path_switch {
> KEEP_PATHS,
> Index: multipath-tools-090513/multipath/main.c
> ===================================================================
> --- multipath-tools-090513.orig/multipath/main.c
> +++ multipath-tools-090513/multipath/main.c
> @@ -428,14 +428,9 @@ main (int argc, char *argv[])
>
> if (conf->max_fds) {
> struct rlimit fd_limit;
> - if (conf->max_fds > 0) {
> - fd_limit.rlim_cur = conf->max_fds;
> - fd_limit.rlim_max = conf->max_fds;
> - }
> - else {
> - fd_limit.rlim_cur = RLIM_INFINITY;
> - fd_limit.rlim_max = RLIM_INFINITY;
> - }
> +
> + fd_limit.rlim_cur = conf->max_fds;
> + fd_limit.rlim_max = conf->max_fds;
> if (setrlimit(RLIMIT_NOFILE, &fd_limit) < 0)
> condlog(0, "can't set open fds limit to %d : %s\n",
> conf->max_fds, strerror(errno));
> Index: multipath-tools-090513/multipath.conf.annotated
> ===================================================================
> --- multipath-tools-090513.orig/multipath.conf.annotated
> +++ multipath-tools-090513/multipath.conf.annotated
> @@ -113,7 +113,7 @@
> # # scope : multipathd
> # # desc : Sets the maximum number of open file descriptors for the
> # # multipathd process.
> -# # values : unlimited|n > 0
> +# # values : max|n > 0
> # # default : None
> # #
> # max_fds 8192
> Index: multipath-tools-090513/multipath/multipath.conf.5
> ===================================================================
> --- multipath-tools-090513.orig/multipath/multipath.conf.5
> +++ multipath-tools-090513/multipath/multipath.conf.5
> @@ -230,6 +230,14 @@ use the WWID as the alias. In either cas
> be overriden by any specific aliases in the \fImultipaths\fR section.
> Default is
> .I no
> +.TP
> +.B max_fds
> +Specify the maximum number of file descriptors that can be opened by multipath
> +and multipathd. This is equivalent to ulimit -n. A value of \fImax\fR will set
> +this to the system limit from /proc/sys/fs/nr_open. If this is not set, the
> +maximum number of open fds is taken from the calling process. It is usually
> +1024. To be safe, this should be set to the maximum number of paths plus 32,
> +if that number is greated than 1024.
> .
> .SH "blacklist section"
> The
> Index: multipath-tools-090513/multipathd/main.c
> ===================================================================
> --- multipath-tools-090513.orig/multipathd/main.c
> +++ multipath-tools-090513/multipathd/main.c
> @@ -1375,14 +1375,9 @@ child (void * param)
>
> if (conf->max_fds) {
> struct rlimit fd_limit;
> - if (conf->max_fds > 0) {
> - fd_limit.rlim_cur = conf->max_fds;
> - fd_limit.rlim_max = conf->max_fds;
> - }
> - else {
> - fd_limit.rlim_cur = RLIM_INFINITY;
> - fd_limit.rlim_max = RLIM_INFINITY;
> - }
> +
> + fd_limit.rlim_cur = conf->max_fds;
> + fd_limit.rlim_max = conf->max_fds;
> if (setrlimit(RLIMIT_NOFILE, &fd_limit) < 0)
> condlog(0, "can't set open fds limit to %d : %s\n",
> conf->max_fds, strerror(errno));
>
> --
> dm-devel mailing list
> dm-devel@redhat.com
> https://www.redhat.com/mailman/listinfo/dm-devel
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2009-05-14 4:35 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-05-14 4:03 [PATCH] multipath-tools: Improvement to max_fds Benjamin Marzinski
2009-05-14 4:35 ` Benjamin Marzinski
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.