dask jobqueue worker 在启动时失败 'Resource temporarily unavailable'

dask jobqueue worker failure at startup 'Resource temporarily unavailable'

我运行正在通过 jobqueue 解决 slurm 问题,我一直收到 3 个错误...

基本上我的问题是什么可能导致这些失败?乍一看,问题是太多的工作人员同时写入磁盘,或者我的工作人员正在分叉到许多其他进程中,但很难跟踪。我可以通过 ssh 进入节点,但我没有看到异常数量的进程,并且每个节点都有一个 500gb ssd,所以我不应该写得太多。

下面的所有内容都只是关于我的配置等的信息
我的设置如下:

cluster = SLURMCluster(cores=1, memory=f"{args.gbmem}GB", queue='fast_q', name=args.name,
                           env_extra=["source ~/.zshrc"])
cluster.adapt(minimum=1, maximum=200)

client = await Client(cluster, processes=False, asynchronous=True)

我想我什至不确定是否应该设置 processes=False。

我 运行 在 4gb 内存、2 个内核 (-c)(尽管我预计只需要 1 个)和 1 个任务 (-n) 的条件下通过 sbatch 运行此启动脚本。这通过上面的 slurmcluster 配置启动了我所有的工作。我将我的 slurm 提交脚本转储到文件中,它们看起来很合理。

每个作业都不复杂,它是一个 subprocess.call( 命令,用于编译可执行文件,占用 1 个内核和 2-4 GB 内存。我要求客户端调用和进一步的调用是异步的,因为我有很多条件计算。因此,每个工作人员在加载时应包含 1 python 个进程、1 个 运行ning 可执行文件和 1 个 shell。 由我们的调度程序强加

>> ulimit -a
-t: cpu time (seconds)              unlimited
-f: file size (blocks)              unlimited
-d: data seg size (kbytes)          unlimited
-s: stack size (kbytes)             8192
-c: core file size (blocks)         0
-m: resident set size (kbytes)      unlimited
-u: processes                       512
-n: file descriptors                1024
-l: locked-in-memory size (kbytes)  64
-v: address space (kbytes)          unlimited
-x: file locks                      unlimited
-i: pending signals                 1031203
-q: bytes in POSIX msg queues       819200
-e: max nice                        0
-r: max rt priority                 0
-N 15:                              unlimited

并且每个节点有64个核心。所以我真的不认为我达到了任何极限。

我使用的 jobqueue.yaml 文件看起来像:

slurm:
  name: dask-worker
  cores: 1                 # Total number of cores per job
  memory: 2                # Total amount of memory per job
  processes: 1                # Number of Python processes per job
  local-directory: /scratch       # Location of fast local storage like /scratch or $TMPDIR
  queue: fast_q
  walltime: '24:00:00'
  log-directory: /home/dbun/slurm_logs

如果有任何建议,我将不胜感激!完整日志如下。

FORK BLOCKING IO ERROR


distributed.nanny - INFO -         Start Nanny at: 'tcp://172.16.131.82:13687'
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/home/dbun/.local/share/pyenv/versions/3.7.0/lib/python3.7/multiprocessing/forkserver.py", line 250, in main
    pid = os.fork()
BlockingIOError: [Errno 11] Resource temporarily unavailable
distributed.dask_worker - INFO - End worker

Aborted!

CANT START NEW THREAD ERROR

https://pastebin.com/ibYUNcqD

BLOCKING IO ERROR

https://pastebin.com/FGfxqZEk

编辑: 另一块拼图: 看起来 dask_worker 是 运行 多个 multiprocessing.forkserver 调用?听起来合理吗?

https://pastebin.com/r2pTQUS4

此问题是由于 ulimit -u 太低造成的。

事实证明,每个 worker 都有一些关联的进程,而 python 有多个线程。最后,您会得到大约 14 个对您的 ulimit -u 有贡献的线程。我的设置为 512,而对于 64 核系统,我可能会达到 ~896。看起来我本来可以拥有的每个进程的最大线程数应该是 8。

解决方法: 在 .zshrc (.bashrc) 中,我添加了行

ulimit -u unlimited

此后没有遇到任何问题。