CAD - Environment Modules(module avail等)命令加速
CAD - Environment Modules(module avail等)命令加速从算法的角度看,如何能将module avail的时间复杂度从O(n)降到O(1)呢?
CAD - Environment Modules(module avail等)命令加速
文章目录
前言
HPC中涉及的环境配置很复杂。开源软件Environtment Modules帮助我们解决了环境配置的问题,使得HPC用户不用关注环境配置的具体细节,专注于更有价值的业务。
然而HPC中的软件众多,对应的配置文件(modulefile)很多:
- 相对简单的环境,通常以
"${ARCHITECTURE}/${PACKAGE}/${VERSION}"
目录结构来放modulefile; - 相对复杂的环境,可能是
"${ARCHITECTURE}/${COMPILERNAME}-${COMPILERVER}/${PACKAGE}-${VERSION}-${HASH}"
(spack包管理器生成的modulefile默认目录结构)
假设现有环境为第一种环境:有2种架构,100个包,每个包有10个版本,最多需要有2000个modulefile。每次用户执行module avail时,都要遍历目录与这2000个modulefile并读取第一行来确定是有效的modulefile文件,并将其显示。这样的操作,时间复杂度为O(n),非常耗时,实际场景中往往要超过5s。
从算法的角度看,如何能将module avail的时间复杂度从O(n)降到O(1)呢?
一、Environtment Modules是什么,有几种实现?
HPC环境中的用户有非常复杂的环境需要管理,其中涉及到的就是工具管理。业界主要有两种开源管理工具:
1)Environment Modules
- 旧版本有C与TCL两种实现,新版本为TCL实现。写作时最新版本为v4.7.1。
2)Lmod
- Lmod是lua语言的实现,拥有比Environment Modules更多更优的特性。
二、如何让module avail命令加速?
1. Environment Modules
在4.3.0版本说明中
If modulefile is fully read, cache the content read and the file header computed to avoid another file read if the same modulefile need to be read multiple times.
在4.4.1版本说明中
Correctly filter modulefile search memory cache entries when using a full search result to search later on a specific modulefile.
在较旧的Modules 4.2.0 (2018-10-18)就开始加入了该cache特性
。该cache特性,将modulefile的读取缓存到内存中,以便需要再次被读取多次。
所以建议使用新版本的Environment Modules来利用该特性加速。
然而很多HPC环境尚在使用较旧的版本,自身未带cache特性。那怎么办呢?
可以参考Lmod的加速方式:从Lmod的实现中可以得知,Lmod会将module avail结果全集存放在一个cache文件中,只要modulefile目录层级与文件未改动,该cache文件帮助加速module avail命令。同时也要有更新cache文件的触发机制,在增删改modulefile目录层级或文件后,及时地更新cache文件。另外,假设用户的MODULEPATH变量是自定义过的,也要将其自定义部分,以及查询输出顺序以其MODULEPATH的路径顺序输出,这样才是兼容的输出。
2. Lmod
Lmod spider中介绍到,现在在安装了数量巨大的modulefile文件的站点,构建系统spider缓存文件非常重要。使用该功能,用户可以无需遍历modulefile目录结构与文件,直接读取缓存文件即可获得查询结果。
- 打开该功能
export LMOD_CACHED_LOADS=yes
- 使用
module avail
- 不使用缓存
module --ignore_cache avail
- 更新缓存
update_lmod_system_cache_files
更多资料请浏览Lmod spider。
总结
本文简单讲述了如何对Environment Modules(与Lmod)的module avail命令做加速的一些思考与资料。
总的来说,要节省时间,就要建立查询结果全集缓存,并将缓存放到高速访问的介质中,以供Modules相关命令使用。 因为从高速介质中访问一个文件,比从普通网络文件系统中walk MODULEPATH的快很多, 使用缓存的时间复杂度为O(1),walk MODULEPATH的时间复杂度是O(n) 。
更多推荐
所有评论(0)