[sheepdog] [PATCH v1] try to set RLIMIT_NOFILE ro recommended value
Vasiliy Tolstov
v.tolstov at selfip.ru
Mon Mar 16 17:23:59 CET 2015
prlimit sets rlimits to currently running process and it children, but
its linux specific. Does this ok for sheepdog?
I don't want setrlimit because it sets values to global space.
2015-03-16 19:30 GMT+03:00 Vasiliy Tolstov <v.tolstov at selfip.ru>:
> Signed-off-by: Vasiliy Tolstov <v.tolstov at selfip.ru>
> ---
> sheep/sheep.c | 63 +++++++++++++++++++++++++++++++++++++++--------------------
> 1 file changed, 42 insertions(+), 21 deletions(-)
>
> diff --git a/sheep/sheep.c b/sheep/sheep.c
> index a1028a2..13cc927 100644
> --- a/sheep/sheep.c
> +++ b/sheep/sheep.c
> @@ -561,26 +561,47 @@ static int create_work_queues(void)
>
> static void check_host_env(void)
> {
> - struct rlimit r;
> + struct rlimit new;
> + struct rlimit old;
> + int ret;
> + int fd;
> + int len;
> + char *buf = NULL;
> + pid_t pid;
> +
> + pid = getpid();
> +
> + new.rlim_cur = SD_RLIM_NOFILE;
> + new.rlim_max = SD_RLIM_NOFILE;
> +
> + ret = prlimit(pid, RLIMIT_NOFILE, NULL, &old);
> + if (old.rlim_cur < new.rlim_cur) {
> + sd_info("Allowed open files %lu, suggested %lu", old.rlim_cur, new.rlim_cur);
> +
> + len = asprintf(&buf, "%lu", new.rlim_max);
> + if (len > 0) {
> + fd = open("/proc/sys/fs/nr_open", O_WRONLY);
> + if (fd > 0) {
> + ret = xwrite(fd, buf, len);
> + if (ret > 0) {
> + if (prlimit(pid, RLIMIT_NOFILE, &new, NULL) != 0) {
> + sd_warn("Failed to set open files limit to suggested %lu",
> + new.rlim_cur);
> + } else {
> + sd_info("Allowed open files set to suggested %lu", new.rlim_cur);
> + }
> + }
> + close(fd);
> + }
> + free(buf);
> + }
> + }
>
> - if (getrlimit(RLIMIT_NOFILE, &r) < 0)
> - sd_err("failed to get nofile %m");
> - /*
> - * 1024 is default for NOFILE on most distributions, which is very
> - * dangerous to run Sheepdog cluster.
> - */
> - else if (r.rlim_cur == 1024)
> - sd_warn("Allowed open files 1024 too small, suggested %u",
> - SD_RLIM_NOFILE);
> - else if (r.rlim_cur < SD_RLIM_NOFILE)
> - sd_info("Allowed open files %lu, suggested %u", r.rlim_cur,
> - SD_RLIM_NOFILE);
> -
> - if (getrlimit(RLIMIT_CORE, &r) < 0)
> + if (getrlimit(RLIMIT_CORE, &old) < 0)
> sd_debug("failed to get core %m");
> - else if (r.rlim_cur < RLIM_INFINITY)
> + else if (old.rlim_cur < RLIM_INFINITY)
> sd_debug("Allowed core file size %lu, suggested unlimited",
> - r.rlim_cur);
> + old.rlim_cur);
>
> /*
> * Disable glibc's dynamic mmap threshold and set it as 512k.
> --
> 2.2.2
>
--
Vasiliy Tolstov,
e-mail: v.tolstov at selfip.ru
jabber: vase at selfip.ru
More information about the sheepdog
mailing list