slurm初步使用
先使用脚本.sh
1 #!/bin/bash 2 #SBATCH --job-name=test 3 #SBATCH -p amd_256 4 #SBATCH --error=log/%J.err 5 # 作业运行的标准错误输出将写到文件log/[JOB ID].err文件中 6 #SBATCH --output=log/%J.out 7 # 作业运行的标准输出将写到文件log/[JOB ID].out文件中 8 #SBATCH --time=1:00:00 9 10 #### 第一部分:环境配置(可选) #### 11 module load java/1.8.0_221-public3 12 # 1. 使用module指令载入所需的软件环境 # 13 # 2. 配置其他必要的环境变量 # 14 15 #### 第二部分:获取主节点(即编号为0的slurm task)所在机器的Infiniband网卡IP地址 16 17 NETWORK_INTERFACE=ib0 18 master_ip=$(srun --ntasks=1 --nodes=1 bash -c "ip -4 addr show $NETWORK_INTERFACE | grep -oP '(?<=inet ).*(?=/)'") 19 echo "The IP address of the master task is" $master_ip 20 random_port=$(($RANDOM + 10000)) 21 22 #### 第二部分:执行具体的程序 #### 23 ### 使用driver-script.py脚本来具体启动与运行程序,将主进程所在机器的IP地址、一个随机端口号作为启动脚本的参数 24 srun python3 driver-script.py $master_ip $random_port
然后加上.py脚本
1 #!/usr/bin/env python3 2 import os 3 import sys 4 import subprocess 5 import time 6 7 ## 第一部分:获得关键变量(本部分代码不要修改) 8 # 主进程所在机器的IP地址 9 master_ip = sys.argv[1] 10 # 主进程用于监听的一个随机端口号 11 master_port = int(sys.argv[2]) 12 # 当前进程编号 13 proc_id = int(os.environ["SLURM_PROCID"]) 14 # 本次计算参与的总进程数 15 num_proc = int(os.environ["SLURM_NTASKS"]) 16 17 ## 第二部分:启动计算所业(需要修改) 18 19 if proc_id == 0: 20 # 启动主进程 21 print("Start the master process...") 22 # 通过os.system函数调用其他程序,启动主进程(修改这里) 23 #os.system("ls -lh") 24 try: 25 subprocess.run(f"java -cp 1.jar org.example.TotalClient {master_port}", shell=True, stdout=sys.stdout, stderr=sys.stderr) 26 except subprocess.TimeoutExpired: 27 pass 28 print("The main process finishes.") 29 else: 30 # 启动从进程 31 time.sleep(10) # 等待1s,等待主进程启动 32 print("Start the worker process {}...".format(proc_id)) 33 # 通过os.system函数调用其他程序,启动从进程(修改这里) 34 #os.system("ls -lh") 35 subprocess.run(f"java -cp 1.jar org.example.PrimeNumberClient {master_ip} {master_port}", shell=True, stdout=sys.stdout, stderr=sys.stderr) 36 print("The worker process {} finishes.".format(proc_id))
将这两个脚本上传到平台的同一个文件夹,jar包也要放入这个文件(运用sftp parasc进行上传)
再用ssh parasc进入超算平台
进入xiaocai,输入
1 sbatch --nodes=1 --ntasks-per-node=5 文件名.sh 2 cd log 3 cat 任务名.out 4 scancel 人物名
发现没有进行多线程保护
目前可以在Server端实现gRPC的每个方法头添加上synchronized关键字(这个关键字可以保证Server端在同一时间只处理一个Client发来的请求,不会同时并行的处理多个Client发来的请求)。就是public synchronized void signClient...