So I decided to eat my own dog food, and tested this out myself. First of all, running ulimit through srun "naked" like that doesn't work, since ulimit is a bash shell builtin, so I had to write a simple shell script:

$ cat ulimit.sh

#!/bin/bash

ulimit -a

By default, core is set to zero in our environment as a good security practice and to keep user's core dumps from filling up the filesystem. My default ulimit settings:

$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 128054
max locked memory       (kbytes, -l) unlimited
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) unlimited
cpu time               (seconds, -t) unlimited
max user processes              (-u) 4096
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

Now I run my ulimit.sh script through srun

$ srun -N1 -n1 -t 00:01:00 --mem=1G ./ulimit.sh
srun: job 1249977 queued and waiting for resources
srun: job 1249977 has been allocated resources
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 257092
max locked memory       (kbytes, -l) unlimited
max memory size         (kbytes, -m) 1048576
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) unlimited
cpu time               (seconds, -t) unlimited
max user processes              (-u) 4096
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

Now I set core size:

$ ulimit -c 1024
(base) [pbisbal@sunfire01 ulimit]$ ulimit -c
1024

And run ulimit.sh through srun again:

$ srun -N1 -n1 -t 00:01:00 --mem=1G ./ulimit.sh
srun: job 1249978 queued and waiting for resources
srun: job 1249978 has been allocated resources
core file size          (blocks, -c) 1024
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 257092
max locked memory       (kbytes, -l) unlimited
max memory size         (kbytes, -m) 1048576
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) unlimited
cpu time               (seconds, -t) unlimited
max user processes              (-u) 4096
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

This confirms that PropagateResourceLimits comes from the user's environment, not PAM. If you have UsePAM enabled as Ryan suggested in a previous e-mail, that puts *upper limits* on the values propagated by PropagateResourceLimits. According to the slurm.conf man age, it doesn't necessarily override the limits set in the environment when the job is submitted:

 UsePAM If set to 1, PAM (Pluggable Authentication  Modules  for  Linux)
              will  be enabled.  PAM is used to establish the upper bounds for               resource limits. With PAM support enabled, local system adminis‐               trators can dynamically configure system resource limits. Chang‐               ing the upper bound of a resource limit will not alter the  lim‐               its  of  running jobs, only jobs started after a change has been               made will pick up the new limits.  The default value is  0  (not
              to enable PAM support)....

So if I set core file size to 0 and /etc/security/limits.conf sets it to 1024, if UsePAM=1 and PropagateResourceLimits=ALL (the default for that setting), core file size will stay 0. If I set it to 2048 and UsePAM=1, then Slurm will reduce that limit to 1024.

Note that setting UsePAM=1 alone isn't enough. You need to configure a PAM module named slurm, too, as Ryan pointed out.

Prentice

On 4/29/21 12:35 PM, Prentice Bisbal wrote:

On 4/28/21 2:26 AM, Diego Zuccato wrote:

Il 27/04/2021 17:31, Prentice Bisbal ha scritto:

I don't think PAM comes into play here. Since Slurm is starting the processes on the compute nodes as the user, etc., PAM is being bypassed.
Then maybe slurmd somehow goes throught the PAM stack another way, since limits on the frontend got propagated (as implied by PropagateResourceLimits default value of ALL). And I can confirm that setting it to NONE seems to have solved the issue: users on the frontend get limited resources, and jobs on the nodes get the resources they asked.

In this case, Slurm is deliberately looking at the resource limits effect when the job is submitted on the submission host, and then copying them the to job's environment. From the slurm.conf  documentation (https://slurm.schedmd.com/slurm.conf.html):

*PropagateResourceLimits*
    A comma-separated list of resource limit names. The slurmd daemon
    uses these names to obtain the associated (soft) limit values
    from the user's process environment on the submit node. These
    limits are then propagated and applied to the jobs that will run
    on the compute nodes.'

Then later on, it indicates that all resource limits are propagated by default:

The following limit names are supported by Slurm (although some options may not be supported on some systems):

*ALL*
    All limits listed below (default)

You should be able to verify this yourself in the following manner:

1. Start two separate shells on the submission host

2. Change the limits in one of the shells. For example, reduce core size to 0, with 'ulimit -c 0' in just one shell.

3. Then run 'srun ulimit -a' from each shell.

4. Compare the output. The one shell should show that core size is now zero.

--

Prentice

Reply via email to