[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