array(2) { ["docs"]=> array(10) { [0]=> array(10) { ["id"]=> string(3) "428" ["text"]=> string(77) "Visual Studio 2017 单独启动MSDN帮助(Microsoft Help Viewer)的方法" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(8) "DonetRen" ["tagsname"]=> string(55) "Visual Studio 2017|MSDN帮助|C#程序|.NET|Help Viewer" ["tagsid"]=> string(23) "[401,402,403,"300",404]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400964" ["_id"]=> string(3) "428" } [1]=> array(10) { ["id"]=> string(3) "427" ["text"]=> string(42) "npm -v;报错 cannot find module "wrapp"" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "zzty" ["tagsname"]=> string(50) "node.js|npm|cannot find module "wrapp“|node" ["tagsid"]=> string(19) "[398,"239",399,400]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400760" ["_id"]=> string(3) "427" } [2]=> array(10) { ["id"]=> string(3) "426" ["text"]=> string(54) "说说css中pt、px、em、rem都扮演了什么角色" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(12) "zhengqiaoyin" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400640" ["_id"]=> string(3) "426" } [3]=> array(10) { ["id"]=> string(3) "425" ["text"]=> string(83) "深入学习JS执行--创建执行上下文(变量对象,作用域链,this)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "Ry-yuan" ["tagsname"]=> string(33) "Javascript|Javascript执行过程" ["tagsid"]=> string(13) "["169","191"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511399901" ["_id"]=> string(3) "425" } [4]=> array(10) { ["id"]=> string(3) "424" ["text"]=> string(30) "C# 排序技术研究与对比" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "vveiliang" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(8) ".Net Dev" ["catesid"]=> string(5) "[199]" ["createtime"]=> string(10) "1511399150" ["_id"]=> string(3) "424" } [5]=> array(10) { ["id"]=> string(3) "423" ["text"]=> string(72) "【算法】小白的算法笔记:快速排序算法的编码和优化" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "penghuwan" ["tagsname"]=> string(6) "算法" ["tagsid"]=> string(7) "["344"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511398109" ["_id"]=> string(3) "423" } [6]=> array(10) { ["id"]=> string(3) "422" ["text"]=> string(64) "JavaScript数据可视化编程学习(二)Flotr2,雷达图" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "chengxs" ["tagsname"]=> string(28) "数据可视化|前端学习" ["tagsid"]=> string(9) "[396,397]" ["catesname"]=> string(18) "前端基本知识" ["catesid"]=> string(5) "[198]" ["createtime"]=> string(10) "1511397800" ["_id"]=> string(3) "422" } [7]=> array(10) { ["id"]=> string(3) "421" ["text"]=> string(36) "C#表达式目录树(Expression)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "wwym" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(4) ".NET" ["catesid"]=> string(7) "["119"]" ["createtime"]=> string(10) "1511397474" ["_id"]=> string(3) "421" } [8]=> array(10) { ["id"]=> string(3) "420" ["text"]=> string(47) "数据结构 队列_队列实例:事件处理" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "idreamo" ["tagsname"]=> string(40) "C语言|数据结构|队列|事件处理" ["tagsid"]=> string(23) "["246","247","248",395]" ["catesname"]=> string(12) "数据结构" ["catesid"]=> string(7) "["133"]" ["createtime"]=> string(10) "1511397279" ["_id"]=> string(3) "420" } [9]=> array(10) { ["id"]=> string(3) "419" ["text"]=> string(47) "久等了,博客园官方Android客户端发布" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(3) "cmt" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511396549" ["_id"]=> string(3) "419" } } ["count"]=> int(200) } 222 slurm-16.05.3任务调度系统部署与测试(1) - 爱码网
liwanliangblog

1.概述

本博客通过VMware workstation创建了虚拟机console,然后在console内部创建了8台kvm虚拟机,使用这8台虚拟机作为集群,来部署配置和测试slurm任务调度系统

配置为4核心CPU,8G内存,20G系统盘,20G数据盘挂载到/opt,10G数据盘挂载到/home,一块NAT网卡模拟带外,一块Host only网卡模拟专用内网

为了使console能够同时管理8台kvm虚拟机,需要做一下部署和操作:

  • 部署console到8台虚拟机node11-node18的免密码登陆,通过sshpass+shell的for循环实现
  • 部署console为NTP服务器,将node11-node18的NTP指向为console
  • 部署console为LDAP服务器,能够实现用户的全局管理和认证
  • 格式化数据盘之后,将文件系统/opt,/home通过NFS共享给node11-node18

注:
这部分内容涉及较多,如VMware workstation虚拟机创建,KVM虚拟机创建,创建NFS全局文件系统,多节点免密码登陆,NTP服务器和LDAP服务器部署等,这里为避免内容喧宾夺主,具体细节不多加描述,可参见本人之前博客,或在网上检索各类优秀教程。

2.同步节点时间

将console部署NTP服务器周,通过计划任务来同步node[11-18]时间
pdsh -w node[11-18] ntpdate 192.168.80.8
执行crontab -e,输入:

*/5 * * * *  pdsh -w node[11-18] "ntpdate 192.168.80.8;hwclock --systohc"

3.下载并解压文件

本博客使用的是:
munge-0.5.12
slurm-16.05.3(该版本已经无法下载,可以下载更高版本)

4.编译安装munge-0.5.12

创建安装目录:mkdir -p /opt/munge/munge-0.5.12
解压:unzip munge-munge-0.5.12.zip
编译:cd unzip munge-munge
帮助:./configure --help,按照以下参数编译:

注:因为采用将munge安装在全局文件系统NFS上,为了保证每个节点都保存不同的状态,否则会造成互斥,而无法启动进程,因此将--localstatedir指定到不同的目录,这里各个节点的根文件系统的var目录

./configure \
--prefix=/opt/munge/munge-0.5.12 \
--sysconfdir=/opt/munge/munge-0.5.12/etc \
--localstatedir=/var 
编译报错(1):
checking which cryptographic library to use... failed
configure: error: unable to locate cryptographic library
解决如下:
yum -y install openssl openssl-devel

编译安装:make && make install
查看安装 :

[root@consoleA munge-0.5.12]# pwd
/opt/munge/munge-0.5.12
[root@consoleA munge-0.5.12]# ls
bin  etc  include  lib  sbin  share
[root@consoleA munge-0.5.12]#

5.配置munge

1.创建munge.key,并修改权限:
cd /opt/munge/munge-0.5.12/etc
echo "helloeveryone,I'ammungekeyonkvmcluster." > munge.key && chmod 600 munge.key

注:munge.key的内容必须大于32字节,否则在启动munged时会提示:munged: Error: Keyfile must be at least 32 bytes

2.在所有节点上创建munge运行时所需要的目录:
pdsh -w node[11-18] mkdir -p /var/{log,run,lib}/munge

3.修改munge运行进程的用户为超级用户root
cd /opt/munge/munge-0.5.12/etc/rc.d/init.d
vim munge修改内容如下:

prefix="/opt/munge/munge-0.5.12"
exec_prefix="${prefix}"
sbindir="${exec_prefix}/sbin"
sysconfdir="/opt/munge/munge-0.5.12/etc"
localstatedir="/var"
SERVICE_NAME="MUNGE"
DAEMON_EXEC="$sbindir/munged"
PIDFILE="$localstatedir/run/munge/munged.pid"
USER="root"
GROUP="root"
VARRUNDIR="$localstatedir/run/munge"

4.修改启动脚本的配置文件
vim /opt/munge/munge-0.5.12/etc/sysconfig/munge,内容如下:

DAEMON_ARGS="--key-file /opt/munge/munge-0.5.12/etc/munge/munge.key --num-threads 1"
USER="root"
GROUP="root"

5.创建环境变量添加脚本并拷贝到各个节点
vim /etc/profile.d/optenv.sh

#!/bin/bash
export PATH=$PATH:/opt/munge/munge-0.5.12/sbin

拷贝该脚本至所有节点

for i in $(seq 11 18)
do
 scp /etc/profile.d/optenv.sh node$i:/etc/profile.d
done

6.节点启动munged
pdsh -w node[11-18] munged
pdsh -w node[11-18] ps -ef|grep munge|grep -v grep

6.编译安装slurm-16.05.3

1.创建安装目录:
mkdir -p /opt/slurm/slurm-16.05.3
2.编译安装,执行如下:

./configure \
--prefix=/opt/slurm/slurm-16.05.3/ \
--sysconfdir=/opt/slurm/slurm-16.05.3/etc 
--with-munge=/opt/munge/munge-0.5.12/

make && make install

3.创建其他所需目录
cd /opt/slurm/slurm-16.05.3 && mkdir etc log state

  • etc:用于放置slurmctld,slurmdbd的配置文件等
  • log:用户存放slurmctld,slurmdbd的日志文件等
  • state:用于存放作业状态文件等

4.创建slurmadmin用户,并修改相应目录权限

注:slurmadmin用户用作运行slurmctld,slurmdbd等进程的用户,需要手动创建
同时修改state的属主为slurmadmin,同时增加log目录的slurmadmin写权限

chown -R slurmadmin:slurmadmin state && setfacl -R -m u:slurmadmin:rwx log

7.配置slurm

注:
slurm集群中,存在slurmctld,slurmdbd,slurmd三种守护进程。本博客中做以下规定:
node11运行slurmctld(master),slurmdbd
node12运行slurmctld(backup)
node13-18运行slurmd
同时也在node11上配置MySQL,运行mysqld进程。
在实际应用过程中,可以将slurmctld(master),slurmctld(backup),slurmdbd,mysqld运行在不同节点,只要在编辑配置文件过程中,正确指定即可。

1.创建slurm.conf,如下:

#slurm集群名称
ClusterName=myslurm
#slurm主控制器主机名
ControlMachine=node11
#slurm从控制器主机名
BackupController=node12
#slurm进程用户
SlurmUser=slurmadmin
#slurmd节点守护进程用户
SlurmdUser=root
#slurmctld控制器端口
SlurmctldPort=6817
#slurmd节点守护进程端口
SlurmdPort=6818
#slurm通信认证
AuthType=auth/munge

SwitchType=switch/none
MpiDefault=none
#slurm任务状态保存目录
StateSaveLocation=/opt/slurm/slurm-16.05.3/state
#slurmd守护进程日志保存
SlurmdSpoolDir=/var/log/slurmd
#slurmctld的pid存放
SlurmctldPidFile=/var/run/slurmctld.pid
#slurmd守护进程的pid文件存放
SlurmdPidFile=/var/run/slurmd.pid

TaskPlugin=task/cgroup
ProctrackType=proctrack/cgroup
#第一个jobid号
FirstJobId=1000
#最大的jobid号
MaxJobId=50000
ReturnToService=2

SlurmctldTimeout=300
SlurmdTimeout=300
TCPTimeout=10
InactiveLimit=0
MinJobAge=300
KillWait=30
Waittime=0
SchedulerType=sched/backfill
SelectType=select/linear

FastSchedule=1
DebugFlags=NO_CONF_HASH
SlurmctldDebug=3
#slurmctld控制器守护进程的日志存放,全局文件系统
SlurmctldLogFile=/opt/slurm/slurm-16.05.3/log/slurmctldlogfile
SlurmdDebug=3
#slurmd节点守护进程的日志文件,节点本地
SlurmdLogFile=/var/log/slurmdlogfile
#slurm运行插件的路径
PluginDir=/opt/slurm/slurm-16.05.3/lib:/opt/slurm/slurm-16.05.3/lib/slurm
#jod限制类型
JobAcctGatherType=jobacct_gather/cgroup
#计费等配置
#采用slurmdbd守护进程进行存储
AccountingStorageType=accounting_storage/slurmdbd
#运行slurmdbd进程的节点主机名
AccountingStorageHost=node11
#slurmdbd运行节点的端口
AccountingStoragePort=6819
AccountingStorageEnforce=limints,qos
#account存放的库
AccountingStorageLoc=slurm_acct_db
#运行slurmdbd的数据库用户
AccountingStorageUser=slurmadmin
AccountingStoragePass=/var/run/munge/munge.socket.2
AcctGatherNodeFreq=180
#资源配置,包括节点配置,队列(分区)配置等
NodeName=node[11-18] CPUs=4 RealMemory=300 sockets=2 CoresPerSocket=2 ThreadsPerCore=1 State=UNKNOWN
PartitionName=q_x86_1 Nodes=node[11-18] MaxTime=INFINITE State=UP DEFAULT=YES AllowAccounts=ALL

2.创建slurmdbd.conf,如下:

PurgeEventAfter=1month
PurgeJobAfter=36month
PurgeResvAfter=1month
PurgeStepAfter=1month
PurgeSuspendAfter=1month
DebugLevel=debug5
LogFile=/opt/slurm/slurm-16.05.3/log/slurmdbd.log
PidFile=/var/run/slurmdbd.pid
AuthType=auth/munge
AuthInfo=/var/run/munge/munge.socket.2
DbdHost=node11
DbdPort=6819
SlurmUser=slurmadmin
StorageType=accounting_storage/mysql
StorageHost=node11
StorageLoc=slurm_acct_db
StoragePort=3306
StorageUser=slurmadmin
StoragePass=liwanliang

3.创建cgroup.conf,如下:

#CgroupReleaseAgentDir=="/etc/slurm/cgroup"
CgroupAutomount=yes
CgroupMountpoint=/cgroup
CgroupReleaseAgentDir=="/tmp/slurm"
ConstrainCores=yes
TaskAffinity=no
ConstrainRAMSpace=no
MaxRAMPercent=98
AllowedRAMSpace=96

8.配置MySQL数据库环境

根据配置文件,需要在node11部署mysql服务器,操作如下:
1.安装MySQL:yum -y install mysql mysql-client mysql-server mysql-libs
2.启动MySQL,并设置开机自启动:service mysqld start && chkconfig mysql on
3.配置MySQL权限:执行mysql进入数据库,配置root登陆权限:

use mysql;
delete from user where user = ' ' and host = 'localhost' ;
delete from user where user = ' ' and host = 'node11';
grant all privileges on *.* to 'root'@'%' identified by 'liwanliag';
create database slurm_acct_db;
grant all privileges on slurm_acct_db.* to 'slurmadmin'@'node11' identified by 'liwanliang';
flush privileges;

9.启动slurm集群

1.启动munged
console执行:pdsh -w ssh:node[11-18] munged
2.启动slurmdbd
console执行:ssh node11 slurmdbd
注意,此时需要在数据库中添加集群
执行: sacctmgr add cluster myslurm
3.启动slurmctld
console执行:ssh node11 slurmctld
4.验证集群信息
console执行:sinfo

注:此时console必须也munged,否则会报错。
此时显示:q_x86_1* up infinite 8 down* node[11-18]

5.启动节点的slurmd
console执行:pdsh -w ssh:node[11-18] slurmd

注:
此时显示:q_x86_1* up infinite 8 idle node[11-18]

6.测试提交
console执行:srun -n 32 hostname

10.总结

本博客只是slurm集群的基本部署和测试。在部署过程中遇到两个比较棘手的问题:

1.munge编译过程中的没有安装mysql-devel环境,导致在编译slurm的时候不能够编译相应的插件。此时通过yum -y install msyql-devel安装依赖环境,然后重新编译解决
2.在所有环境部署好之后,通过sinfo发现有6个节点总是drain状态,这个状态表示节点通过slurmd获取的节点配置和配置文件中的不相同,尤其是节点的CPU的参数。最后通过重新配置参数,然后清空state目录下的所有文件,同事修改log目录权限为777 解决

下篇博客主要会测试一些其他复杂的功能。

<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">

相关文章: