- 所有节点需和同一个时钟源严格同步时钟
- 一些文件系统操作在defaultHelperNodes上面运行,默认是所有节点,设置为NSD节点可能获得更好的性能
- maxMBpS是每个节点的GPFS的吞吐量,可设置为节点IO吞吐量的两倍,特别是IO节点
- 默认是2048;单路FDR设置1200,单路QDR设置8000,双路万兆设置5000
- GPFS的NSD节点如为专用IO节点,NSD节点没有数据访问则不会缓存任何数据,但是缓存可以为NSD工作线程所用,故可进行如下优化:
- 增加pagepool的大小
- 将nsdBufSpace设置为最大值(70%)
- 磁盘系统优化
- RAID segment size × 数据盘个数 = stripe size,GPFS block size应整倍数于stripe size
- GPFS block size应整倍数于HBA卡最大IO尺寸
- 最好倍数都是1
- /sys/block/*/queue/max_sectors_kb
- 存储的缓存策略
- 顺序IO负载:启用读缓存,禁用任何形式的预读
- 随机IO负载和Metadata:启用读写缓存
- 对于使用大量文件的GPFS节点,特别是登录节点、NFS/SMB输出节点、登录节点,可进行如下优化:
- 提高maxFilesToCache的值,这是缓存文件metadata的数量,最好能提高到并发打开文件数加上最近使用的文件数
- 在Linux上面maxStatCache是无效的,所以需要设定maxStatCache为一个较小的值,如512
- 按照maxFilesToCache × 3 KB + maxStatCache × 400 bytes估算内存消耗,增加的内存不在pagepool中
- 增加pagepool的大小,修改pagepoolMaxPhysMemPct可提高pagepool的上限
- 网络优化
- net.core.rmem_max = 8388608
net.core.wmem_max = 8388608
net.ipv4.tcp_rmem = 4096 262144 8388608
net.ipv4.tcp_wmem = 4096 262144 8388608 - GPFS的socketMaxListenConnections和系统的net.core.somaxconn设置为集群节点数量
- net.core.rmem_max = 8388608
- sharedMemLimit和maxBufferDescs等看mmfsadm dump fs | head -8输出结果决定是否需要增加
- 文件系统的-n参数匹配集群节点数
- 后端由大量磁盘或固态盘组成NSD设置ignorePrefetchLUNCount=yes
- 用mmlsconfig和mmdiag –config可以查看配置
分类: HPC
使用 rrdcached 解决 Ganglia 高 IOPS
用Ganglia监控一个近300个节点的集群,采样时间为默认的15s,加了一些自定义的参数,rrds目录容量74GB,12万个rrd文件。这样的一个规模下,平均每秒写入32MB、8k IOPS,平均每次写入只有4K数据,基本都是gmetad将采样的数据写入rrd文件中。这样高的IOPS对存储还是有明显的压力的,RRDtool中的rrdcached可以将对rrd的updates操作缓存到内存中然后在合并写入硬盘,显著降低了对硬盘的压力。
创建一个rrdcached的服务,编辑文件 /usr/lib/systemd/system/rrdcached.service,内容如下
[Unit] Description=Data caching daemon for rrdtool After=network.service Before=gmetad.service httpd.service [Service] Type=forking PIDFile=/run/rrdcached.pid ExecStart=/usr/bin/rrdcached -s ganglia -m 664 -l unix:/var/lib/ganglia/rrdcached.sock -s apache -m 777 -P FLUSH,STATS,HELP -l unix:/var/lib/ganglia/rrdcached_limited.sock -b /var/lib/ganglia/rrds -B -p /run/rrdcached.pid [Install] WantedBy=multi-user.target
- rrdcached.sock给gmetad用的、rrdcached_limited.sock限制了可用的操作给WEB前台用
- -b指定工作目录,-B限制在工作目录下
- -w指定缓存时间,如果更新时发现超过本文件已经缓存了超过此缓存时间,就放到写入队列中等待写入,默认300s
- -z指定随机延迟,每一个rrd写入时都插入一个随机延迟,此值不能比-w,默认为0
- -f指定超时,如果rrd超过此时间还没有更新则写入硬盘
启动服务
systemctl daemon-reload systemctl enable --now rrdcached.service
修改 /usr/lib/systemd/system/gmetad.service ,在[Unit]和[Service]段修改和添加,并重启gmetad服务
[Unit] ………… After=network.target rrdcached.service Requires=rrdcached.service [Service] Environment=RRDCACHED_ADDRESS=/var/lib/ganglia/rrdcached.sock ………… …………
修改前台网页的配置 /etc/ganglia/conf.php 添加一行,并重启httpd服务
$conf['rrdcached_socket'] = "unix:/var/lib/ganglia/rrdcached_limited.sock";
LSF 配置NUMA Affinity
首先要给节点启用NUMA Affinity,在lsb.hosts的Host节中添加AFFINITY列,值为Y,如:
Begin Host HOST_NAME MXJ r1m pg ls tmp DISPATCH_WINDOW AFFINITY ...... default ! () () () () () (Y) End Host
启用后用bhost -l -aff可以看到Affinity已经Enable
提交作业时-R参数添加affinity字段如affinity[core:membind=localprefer:distribute=pack]
HP MSA 2040 SAN 测试
HP MSA 2040 SAN,双控制器,每控制器4GB缓存。两台IO节点与存储双控通过16Gb FC冗余链接。
测试命令:iozone -i 0 -i 1 -r 128K -s 256G -t 2 -+m ./iolist -C
每个IO节点一个iozone进程,更多的进程更慢
write | rewrite | read | reread | |
900GByte 2.5-inch 10Krpm 6Gb/s SAS 每5个盘做一组RAID5,4组RAID5 |
2421 | 2421 | 2419 | 2418 |
4TByte 3.5-inch 7.2Krpm 6Gb/s NL-SAS 每6个盘做一组RAID6,2组RAID6 |
1249 | 1228 | 1276 | 1279 |
通过作业调度系统进行系统维护
HPC集群中一些系统维护工作不需要立刻执行,而希望在不影响用户正常使用的情况下见缝插针的进行,这个时候可以将这些维护工作做成作业,通过作业调度系统来调度完成。下面以通过LSF作业调度系统升级Infiniband卡固件和驱动为例:
- 允许root用户提交作业
- 修改lsf.conf,添加一行
LSF_ROOT_REX=local
- 重启相关服务让修改生效
$ badmin mbdrestart $ lsadmin resrestart all
- 修改lsf.conf,添加一行
- 编写升级脚本
cd /root/mellanox/ #进入目录 unzip fw-ConnectX3Pro-rel-2_35_5100.zip mstflint -d 08:00.0 -i ./fw-ConnectX3Pro-rel-2_35_5100-FlexBoot-3.4.648-CLP-8025-UEFI-14.8.43.bin b #升级固件 tar xf MLNX_OFED_LINUX-3.1-1.0.3-rhel6.7-x86_64.tgz cd MLNX_OFED_LINUX-3.1-1.0.3-rhel6.7-x86_64 yum install perl pciutils python gcc-gfortran libxml2-python tcsh libnl.i686 libnl expat glib2 tcl libstdc++ bc tk gtk2 atk cairo numactl pkgconfig -y ./mlnxofedinstall --all --enable-affinity --enable-mlnx_tune <<< "y\n" #安装新版驱动 sed -i s/HWADDR=/#HWADDR=/ /etc/sysconfig/network-scripts/ifcfg-ib0 cd rm -rf /root/mellanox #删除升级目录 reboot #重启
- 将升级所需文件复制到所有节点
pscp -r mellanox node:/root/
- 编写作业提交脚本
如果队列之间有抢占,系统维护作业需要提交到低优先级队列,提交到高优先级队列会造成重启时还有被抢占挂起的作业
首先关闭节点,再进行维护作业,完成后再打开节点#!/bin/bash for i in `cat nodelist` #nodelist文件中是所有需要升级节点的主机名列表 do bsub -q e52680v3ib -n 24 -m $i -o $i "badmin hclose $i;/root/mellanox/up.sh;badmin hopen $i" done
GPFS Windows CIFS共享问题
GPFS的盘在Windows 2008及以上版本上用CIFS共享出去,当GPFS的盘里面文件发生变化时(如增加删除),某些Windows Vista及以上版本的客户端无法看到这些变化,即使刷新也不行,必须在客户端上面建立或删除文件才能看到,而如果这个共享是Windows自己的硬盘上的则没有这个问题。
在这里IBM说明了,从SMBv2(Vista和2008开始)开始引入了一个新的特性,客户端可以对文件和文件夹的metadata进行缓存,刷新这个缓存依赖于目录变更通知,但是GPFS的在Windows上面不支持这个功能,所以客户端并不知道目录中的文件发生了变化。解决方法也很简单暴利,直接关闭SMBv2回退到SMBv1即可。这里详述了打开关闭各个版本SMB的办法,对于Windows 2008 (R2)来说就是在注册表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters下新增一个SMB2的DWORD为0的值,需要特别注意的是Windows 2008 HPC版本不支持这个注册表项目,添加后会导致共享整个就没有了。在这里详述了各个版本的Server Client之间会使用什么样版本的SMB,和在Windows 8/2012怎么查看SMB的版本。
xCAT 更新root ssh key方法
流程如下:生成新的key,分发新key,替换所有节点key,替换xcat key
ssh-keygen //生成新的key命令为id_rsa1 pscp id_rsa1.pub all:/root/.ssh/authorized_keys mv id_rsa id_rsa.old mv id_rsa.pub id_rsa.pub.old mv id_rsa1 id_rsa mv id_rsa1.pub id_rsa.pub pscp id_rsa all:/root/.ssh/ pscp id_rsa.pub all:/root/.ssh/ cp /root/.ssh/id_rsa.pub /install/postscripts/_ssh/authorized_keys
Platform LSF ELIM
LSF可以让用户自定义一些资源,其中动态资源可以通过ELIM向LSF汇报,下面以本地磁盘(一个机械盘一个SSD)负载为例:
在$LSF_ENVDIR/lsf.shared的Begin Resource中增加
diskut Numeric 60 Y (Percentage of CPU time during which I/O requests were issued to local disk) ssdut Numeric 60 Y (Percentage of CPU time during which I/O requests were issued to local SSD disk)
在$LSF_ENVDIR/lsf.cluster.的Begin ResourceMap中增加一行
diskut [default] ssdut [default]
在$LSF_SERVERDIR/下新建一个文件elim.disk内容如下并且chmod +x elim.disk
#!/bin/sh declare -a util while true; do util=(`sar -d 60 1|grep Average|grep dev8|awk '{print $10}'`) case "${#util[@]}" in 1) echo 1 diskut ${util[0]} ;; 2) echo 2 diskut ${util[0]} ssdut ${util[1]} ;; esac done
所有节点需要lsadmin limrestart,然后用lsload -l就可以看到多出来两列了
bsub时可以使用这些参数
-R “order[diskut]” 优先选择disk负载最轻的
-R “select[diskut < 10]” 要求disk负载小于10%
-R “rusage[diskut=10]” 为这个任务预留10%的disk负载。rusage不影响lsload的显示,但是会叠加到lsload显示的实际值上面从而影响order select的结果,除非lsf确定预留的资源被这个job所使用了(比如mem)。
Platform LSF Compute Units 调度策略
Compute Units(CU)可以对一个队列中的机器在调度时进行分组,可以控制作业在这些组中的分配。
假设有三个cu,每个cu空闲的job slots如下:
cu name | free job slots |
cu1 | 4 |
cu2 | 6 |
cu3 | 8 |
cu[pref=minavail]:把cu按照空闲的job slots从小到大排序,按顺序填充分配使用cu。例:-n 4则使用cu1的4个;-n 6则使用cu1的4个和cu2的2个。
cu[pref=maxavail]:把cu按照空闲的job slots从大到小排序,按顺序填充分配使用cu。例:-n 6则使用cu3的6个;-n 10则使用cu3的8个和cu2的2个。
上面的情况下,如果cu中空闲的job slots数量一样,则按照其在lsb.hosts中Begin ComputeUnitvs中的顺序使用
cu[balance]:按照在lsb.hosts中Begin ComputeUnitvs中的顺序,在尽量少的cu中分配使用且每个cu中使用的job slots尽量平衡。例:-n 6则使用cu2的6个;-n 8则使用cu3的8个;-n 10则使用cu2和cu3的各使用5个;-n 12则cu2和cu3个使用6个;-n 14则cu1使用4个、cu2和cu3各使用5个。
cu[balance:pref=minavail]和cu[balance:pref=maxavail]:把cu按照空闲的job slots排序,在尽量少的cu中分配使用且每个cu中使用的job slots尽量平衡。例:-n 4 -R “cu[balance:pref=minavail]”使用cu1,-n 4 -R “cu[balance:pref=maxavail]”使用cu3。
对于HPC来说,其实更想要一种类似于minavail但是又尽量分布到最少cu上的策略,如果必须跨cu则应尽量不等分减少跨cu通讯。