All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] tools/xenconsoled: Increase file descriptor limit
@ 2015-02-16 18:17 Andrew Cooper
  2015-02-16 20:44 ` Don Slutz
  0 siblings, 1 reply; 3+ messages in thread
From: Andrew Cooper @ 2015-02-16 18:17 UTC (permalink / raw)
  To: Xen-devel; +Cc: Andrew Cooper, Ian Jackson, Ian Campbell, Wei Liu

XenServer's VM density testing uncovered a regression when moving from
sysvinit to systemd where the file descriptor limit dropped from 4096 to
1024. (XenServer had previously inserted a ulimit statement into its
initscripts.)

One solution is to use LimitNOFILE=4096 in xenconsoled.service to match the
lost ulimit, but that is only a stopgap solution.

As Xenconsoled genuinely needs a large number of file descriptors if a large
number of domains are running, and is well behaved with its descriptors,
attempt to up the limit to the system maximum.

Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
CC: Ian Campbell <Ian.Campbell@citrix.com>
CC: Ian Jackson <Ian.Jackson@eu.citrix.com>
CC: Wei Liu <wei.liu2@citrix.com>
---
 tools/console/daemon/main.c |   31 +++++++++++++++++++++++++++++++
 1 file changed, 31 insertions(+)

diff --git a/tools/console/daemon/main.c b/tools/console/daemon/main.c
index 92d2fc4..759c061 100644
--- a/tools/console/daemon/main.c
+++ b/tools/console/daemon/main.c
@@ -26,6 +26,7 @@
 #include <string.h>
 #include <signal.h>
 #include <sys/types.h>
+#include <sys/resource.h>
 
 #include "xenctrl.h"
 
@@ -55,6 +56,34 @@ static void version(char *name)
 	printf("Xen Console Daemon 3.0\n");
 }
 
+/*
+ * Xenconsoled requires one file descriptor for each PV console, which can
+ * easily exceed the default of 1024 if many guests are running.  Try to set
+ * the fd limit to the system maximum, falling back to a default of 4096.
+ */
+static void increase_fd_limit(void)
+{
+	FILE *fs_nr_open;
+	struct rlimit lim;
+	long nr_open = 4096;
+	int rc;
+
+	rc = getrlimit(RLIMIT_NOFILE, &lim);
+	if (rc)
+		return;
+
+	fs_nr_open = fopen("/proc/sys/fs/nr_open", "r");
+	if (fs_nr_open) {
+		fscanf(fs_nr_open, "%ld", &nr_open);
+		fclose(fs_nr_open);
+	}
+
+	if ((nr_open > lim.rlim_cur) || (nr_open > lim.rlim_max)) {
+		lim.rlim_cur = lim.rlim_max = nr_open;
+		setrlimit(RLIMIT_NOFILE, &lim);
+	}
+}
+
 int main(int argc, char **argv)
 {
 	const char *sopts = "hVvit:o:";
@@ -154,6 +183,8 @@ int main(int argc, char **argv)
 	openlog("xenconsoled", syslog_option, LOG_DAEMON);
 	setlogmask(syslog_mask);
 
+	increase_fd_limit();
+
 	if (!is_interactive) {
 		daemonize(pidfile ? pidfile : "/var/run/xenconsoled.pid");
 	}
-- 
1.7.10.4

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH] tools/xenconsoled: Increase file descriptor limit
  2015-02-16 18:17 [PATCH] tools/xenconsoled: Increase file descriptor limit Andrew Cooper
@ 2015-02-16 20:44 ` Don Slutz
  2015-02-17  9:07   ` Andrew Cooper
  0 siblings, 1 reply; 3+ messages in thread
From: Don Slutz @ 2015-02-16 20:44 UTC (permalink / raw)
  To: Andrew Cooper, Xen-devel; +Cc: Wei Liu, Ian Jackson, Ian Campbell

On 02/16/15 13:17, Andrew Cooper wrote:
> XenServer's VM density testing uncovered a regression when moving from
> sysvinit to systemd where the file descriptor limit dropped from 4096 to
> 1024. (XenServer had previously inserted a ulimit statement into its
> initscripts.)
> 
> One solution is to use LimitNOFILE=4096 in xenconsoled.service to match the
> lost ulimit, but that is only a stopgap solution.
> 
> As Xenconsoled genuinely needs a large number of file descriptors if a large
> number of domains are running, and is well behaved with its descriptors,
> attempt to up the limit to the system maximum.
> 
> Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
> CC: Ian Campbell <Ian.Campbell@citrix.com>
> CC: Ian Jackson <Ian.Jackson@eu.citrix.com>
> CC: Wei Liu <wei.liu2@citrix.com>
> ---
>  tools/console/daemon/main.c |   31 +++++++++++++++++++++++++++++++
>  1 file changed, 31 insertions(+)
> 
> diff --git a/tools/console/daemon/main.c b/tools/console/daemon/main.c
> index 92d2fc4..759c061 100644
> --- a/tools/console/daemon/main.c
> +++ b/tools/console/daemon/main.c
> @@ -26,6 +26,7 @@
>  #include <string.h>
>  #include <signal.h>
>  #include <sys/types.h>
> +#include <sys/resource.h>
>  
>  #include "xenctrl.h"
>  
> @@ -55,6 +56,34 @@ static void version(char *name)
>  	printf("Xen Console Daemon 3.0\n");
>  }
>  
> +/*
> + * Xenconsoled requires one file descriptor for each PV console, which can
> + * easily exceed the default of 1024 if many guests are running.  Try to set
> + * the fd limit to the system maximum, falling back to a default of 4096.
> + */
> +static void increase_fd_limit(void)
> +{
> +	FILE *fs_nr_open;
> +	struct rlimit lim;
> +	long nr_open = 4096;
> +	int rc;
> +
> +	rc = getrlimit(RLIMIT_NOFILE, &lim);
> +	if (rc)
> +		return;
> +
> +	fs_nr_open = fopen("/proc/sys/fs/nr_open", "r");
> +	if (fs_nr_open) {
> +		fscanf(fs_nr_open, "%ld", &nr_open);
> +		fclose(fs_nr_open);
> +	}
> +
> +	if ((nr_open > lim.rlim_cur) || (nr_open > lim.rlim_max)) {
> +		lim.rlim_cur = lim.rlim_max = nr_open;
> +		setrlimit(RLIMIT_NOFILE, &lim);
> +	}
> +}
> +

I am not sure that Xenconsoled is required to have the CAP_SYS_RESOURCE
capability.  With out this, the "soft" (rlim_cur) will most like not be
changed.  Does it make sense to include:

    lim.rlim_cur = lim.rlim_max;
    rc = setrlimit(RLIMIT_NOFILE, &lim);
    if (rc)
        return;

before "fs_nr_open = fopen(..."?

   -Don Slutz


>  int main(int argc, char **argv)
>  {
>  	const char *sopts = "hVvit:o:";
> @@ -154,6 +183,8 @@ int main(int argc, char **argv)
>  	openlog("xenconsoled", syslog_option, LOG_DAEMON);
>  	setlogmask(syslog_mask);
>  
> +	increase_fd_limit();
> +
>  	if (!is_interactive) {
>  		daemonize(pidfile ? pidfile : "/var/run/xenconsoled.pid");
>  	}
> 

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] tools/xenconsoled: Increase file descriptor limit
  2015-02-16 20:44 ` Don Slutz
@ 2015-02-17  9:07   ` Andrew Cooper
  0 siblings, 0 replies; 3+ messages in thread
From: Andrew Cooper @ 2015-02-17  9:07 UTC (permalink / raw)
  To: Don Slutz, Xen-devel; +Cc: Wei Liu, Ian Jackson, Ian Campbell

On 16/02/2015 20:44, Don Slutz wrote:
> On 02/16/15 13:17, Andrew Cooper wrote:
>> XenServer's VM density testing uncovered a regression when moving from
>> sysvinit to systemd where the file descriptor limit dropped from 4096 to
>> 1024. (XenServer had previously inserted a ulimit statement into its
>> initscripts.)
>>
>> One solution is to use LimitNOFILE=4096 in xenconsoled.service to match the
>> lost ulimit, but that is only a stopgap solution.
>>
>> As Xenconsoled genuinely needs a large number of file descriptors if a large
>> number of domains are running, and is well behaved with its descriptors,
>> attempt to up the limit to the system maximum.
>>
>> Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
>> CC: Ian Campbell <Ian.Campbell@citrix.com>
>> CC: Ian Jackson <Ian.Jackson@eu.citrix.com>
>> CC: Wei Liu <wei.liu2@citrix.com>
>> ---
>>  tools/console/daemon/main.c |   31 +++++++++++++++++++++++++++++++
>>  1 file changed, 31 insertions(+)
>>
>> diff --git a/tools/console/daemon/main.c b/tools/console/daemon/main.c
>> index 92d2fc4..759c061 100644
>> --- a/tools/console/daemon/main.c
>> +++ b/tools/console/daemon/main.c
>> @@ -26,6 +26,7 @@
>>  #include <string.h>
>>  #include <signal.h>
>>  #include <sys/types.h>
>> +#include <sys/resource.h>
>>  
>>  #include "xenctrl.h"
>>  
>> @@ -55,6 +56,34 @@ static void version(char *name)
>>  	printf("Xen Console Daemon 3.0\n");
>>  }
>>  
>> +/*
>> + * Xenconsoled requires one file descriptor for each PV console, which can
>> + * easily exceed the default of 1024 if many guests are running.  Try to set
>> + * the fd limit to the system maximum, falling back to a default of 4096.
>> + */
>> +static void increase_fd_limit(void)
>> +{
>> +	FILE *fs_nr_open;
>> +	struct rlimit lim;
>> +	long nr_open = 4096;
>> +	int rc;
>> +
>> +	rc = getrlimit(RLIMIT_NOFILE, &lim);
>> +	if (rc)
>> +		return;
>> +
>> +	fs_nr_open = fopen("/proc/sys/fs/nr_open", "r");
>> +	if (fs_nr_open) {
>> +		fscanf(fs_nr_open, "%ld", &nr_open);
>> +		fclose(fs_nr_open);
>> +	}
>> +
>> +	if ((nr_open > lim.rlim_cur) || (nr_open > lim.rlim_max)) {
>> +		lim.rlim_cur = lim.rlim_max = nr_open;
>> +		setrlimit(RLIMIT_NOFILE, &lim);
>> +	}
>> +}
>> +
> I am not sure that Xenconsoled is required to have the CAP_SYS_RESOURCE
> capability.  With out this, the "soft" (rlim_cur) will most like not be
> changed.  Does it make sense to include:
>
>     lim.rlim_cur = lim.rlim_max;
>     rc = setrlimit(RLIMIT_NOFILE, &lim);
>     if (rc)
>         return;
>
> before "fs_nr_open = fopen(..."?

It probably does make sense, although xenconsoled cannot realistically
run without privilege because of privcmd and /dev/ptmx.

I shall respin.

~Andrew

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2015-02-17  9:07 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-02-16 18:17 [PATCH] tools/xenconsoled: Increase file descriptor limit Andrew Cooper
2015-02-16 20:44 ` Don Slutz
2015-02-17  9:07   ` Andrew Cooper

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.