JH Unischeduler
景行資源管理與調度軟件(JH Unischeduler)作為一款支持多種類型的應用軟件的通用中間件集成應用,其作用范圍涵蓋機械行業設計軟件、制造業CAD/CAE設計軟件、石油勘探分析軟件、模擬仿真軟件、科學計算軟件和大數據分析軟件等。這些不同類型的應用軟件可以同時被集成到由景行資源管理與調度軟件管理的計算集群中,從而實現了多領域、多學科和多類型應用資源的充分共享。
為了使有限的資源得到高效和充分的利用,景行資源管理與調度軟件內置了多種高效的調度管理策略,包括先來先服務、用戶/用戶組資源配額管理、基于隊列的優先級設置、資源公平共享調度、獨占式作業調度、搶占式作業調度等。
景行資源管理與調度軟件基于以上調度策略,會將各類應用軟件的每次執行實例作為一個作業來進行調度和管理,并為管理員和用戶提供更為方便的作業狀態監控和友好的使用界面。
景行資源管理與調度軟件作為云計算基礎架構產品的支柱,與以此為基石的景行應用門戶軟件、景行安全控制軟件等,均是以安全可靠,體驗至上為原則服務用戶,通過與景行資源分析軟件的集成,可以為用戶呈現詳細的資源使用情況、靈活的作業調度和統計分析報表功能。
景行資源管理與調度軟件是一款完全自主研發的云計算資源管理調度程序。它使用jhds模塊收集系統和作業進程的資源使用信息,并使用jobagent、jobexecutor和scheduler模塊實際控制和執行作業。
在此基礎上,景行資源管理與調度軟件擴展了資源管理模塊,并創建了多個云計算資源的負載探測器來檢測節點資源負載情況,景行資源管理與調度軟件擁有統一的調度模塊以實現先進的作業管理調度策略,如公平共享調度策略、搶占式作業調度策略和獨占式作業調度策略等,同時還提供了資源和許可證的管理與調度。這些模塊是完全獨立運行的系統進程。
云計算資源管理: 景行資源管理與調度軟件能夠將網絡上多臺異構類型的計算機資源整合為一個集群應用服務平臺。應用程序資源的調用不再只局限于個人工作站,也不需要為了滿足個性化的資源需求而手動修改應用程序,只需要編輯一些簡單的應用腳本和命令就能夠使用平臺上的計算資源。景行資源管理與調度軟件還可以根據節點的負載條件和應用程序的資源需求,從整個集群應用服務平臺中選擇最合適的計算節點。
執行作業: 對于景行資源管理與調度軟件管理的應用服務系統而言,遠程和本機執行作業的行為是一致的,即使是最復雜的終端交互控制作業,也如同是在本機執行。當作業獲得所需要的軟硬件資源,或當應用服務平臺的系統負載較輕時,景行資源管理與調度軟件會根據預定的策略自動執行作業,并可以根據資源負載情況,完全控制作業。如:掛起作業和恢復作業運行。景行資源管理與調度軟件能夠以交互式作業或批處理作業的形式執行串行或并行的應用程序。當作業在一組資源負載較輕或空閑的資源節點上執行時,執行效率會大幅提高。
管理應用: 對于由景行資源管理與調度軟件管理的應用服務系統,用戶可以遠程運行本地工作站上沒有的,甚至因為本地工作站配置低而無法完成安裝或運行的大型應用軟件,例如:CAD、CAE和CFD等大型應用軟件。用戶的作業實際是運行在集群后臺的高端服務器上,其執行過程和結果完全透明地展現在用戶的桌面機上。
控制系統資源的訪問: 系統管理員可以輕松地控制應用服務系統中資源的使用,例如:
資源和作業記賬: 景行資源管理與調度軟件提供了資源和作業記賬的機制。這些信息可以幫助管理員分析資源的使用情況和作業的執行情況,以及系統在一天或者一周內的負載情況,同時幫助管理員確定是否有資源過載情況發生,為合理化系統配置或擴展和升級系統提供詳盡的數據支持。
作業記賬: 記錄了作業運行的大量信息,所有這些數據都被存儲在一個作業記賬文件中。如:
應用: 絕大多數的應用都可以通過景行資源管理與調度軟件的接口被啟用,不需要直接與之發生交互,也不需要為了使用景行資源管理與調度軟件而刻意的修改程序。目前,景行資源管理與調度軟件可支持大多數的Linux、CentOS或者Windows的命令和第三方應用程序。
容錯: 一旦有計算資源請求,景行資源管理與調度軟件會通過內置高效的調度策略尋找可用的計算資源,并保證計算資源的請求被及時的派發執行。在應用服務系統中,只要還有一臺服務器在運行,景行資源管理與調度軟件就能夠繼續接收計算資源請求。如果計算資源請求失敗,則會主動把該請求重新派發到另一臺可滿足資源需求的服務器上執行。景行資源管理與調度軟件將整個應用服務系統的狀態保存在文件數據庫中,只要該事務日志文件可訪問,景行資源管理與調度軟件就能保證執行所有的計算資源請求,并可為該事務日志文件設置鏡像備份,以保證主文件服務器停止工作時,可根據鏡像的事務日志文件繼續執行作業的操作,為整個集群應用服務系統提供執行作業的容錯能力。
異構系統的支持: 景行資源管理與調度軟件是連接不同操作系統的中心樞紐,通用的架構使其能夠支持多種類型的操作系統(如:Linux、CentOS和Windows),還可支持這幾種操作系統之間的相互操作。
并行處理: 景行資源管理與調度軟件支持MPI(Message Passing Interface)。它既是集群資源的分配者也是管理者,并可為每個并行作業尋找最佳的節點。
調度策略: 景行資源管理與調度軟件提供了快速高效的調度策略,保證了受其管理的應用服務系統正常運行。用戶可以根據不同的需求使用不同的策略,例如,用戶可以設置隊列級的公平共享調度策略,控制和管理應用資源的需求沖突。景行資源管理與調度軟件還內置了許多其他隊列級的調度策略,如最基本的先來先服務、搶占式和獨占式策略。
功率限制調度: 支持為集群設置功率封頂上限,結合高峰、平時、低谷等不同時段設置不同的功率封頂調度策略;支持全局節點統一功率封頂、功率負載自動分配,支持各節點單獨設置功率封頂等調度策略。
資源預留: 是指對某個作業或隊列強制預留資源。資源預留保證了正在運行的作業有足夠的資源(通過對資源提前占位,可以很好的解決作業運行過程中因請求資源的動態變化而不夠的問題)。
作業數組: 作業數組延伸了作業的概念,作業從單個輸入文件、單例執行的應用程序延伸為多個并行文件、多例執行的應用程序。使用景行資源管理與調度軟件的作業數組功能,可以允許用戶提交單個數組作業,而該數組作業可以使用不同的數據參數來多次執行同一應用程序。
共享資源: 共享資源是指由景行資源管理與調度軟件管理的集群中所有節點上的可用資源,這些資源可以在節點組之間共享。如應用軟件的浮動許可證就是一個典型的可共享資源,集群中的所有節點都可以通過自動獲取到的浮動許可證來執行該軟件。景行資源管理與調度軟件保證了在作業派發到各執行節點前獲得有效的許可證后執行作業,從而使得該浮動許可證資源在各執行節點間得到合理化的應用。
并行作業的處理器預留: 在同一個景行資源管理與調度軟件管理的集群中執行并行和普通應用程序時,因為普通作業只需要一個CPU而并行作業需要等待多個空閑的CPU,所以并行作業所需要的CPU會被普通作業先占用。并行作業處理器的預留功能,允許并行作業在排隊期間將所需的空閑處理器(作業槽slots)預留一段時間而不被其他的普通作業使用。
Job Starter: 每一個景行資源管理與調度軟件隊列都可以配置一個Job Starter。Job Starter是一個可執行腳本或者是可執行程序,主要用來創建作業執行的環境。通過JobStarter,景行資源管理與調度軟件管理員可以自定義作業執行的環境。例如:
可配置作業控制的方式: 可通過景行資源管理與調度軟件的作業控制功能,修改作業在集群系統中的運行狀態。通常情況下,作業先是進入PEND狀態,然后進入RUN狀態,作業執行完成后顯示為DONE狀態。有時會在作業的生命周期內,被系統掛起進入SSUSP狀態,或者是被用戶掛起而進入USUSP狀態。景行資源管理與調度軟件給管理員提供了配置控制作業時所觸發的一系列動作,當作業狀態改變時,這些自定義的觸發動作將會被執行。
AI模型測試: 支持多種主流基準測試,包括MMLU、ARC、DROP、GPQA、HumanEval、GSM-8K、MATH、AGIEval、BIG-Bench Hard 等。
容器支持: 支持由 Docker 或 Singularity 容器封裝的應用啟動和資源調度,內置容器集成腳本,用戶可通過配置修改腳本達到集成使用。
命令行接口: 提供豐富的資源查詢、集群管理和作業提交、管理的命令行接口。
jsub [-h] [-V] [-x] [-H] [-I] [-IX] [-Is] [-djm]
[-L login_shell]
[-P project_name] [-R res_req] [-q queue_name]
[-app application_name]
[-m “host_name[+[pref_level]] | host_group[+[pref_level]]…”]
[-n min_processors[,max_processors]] [-J job_name] [-Jd job_desc]
[-i in_file] [-o out_file] [-e err_file]
[-E pre_exec_command[argument…]]
[-Ep post_exec_command[argument…]]
[-cwd current_working_directory]
[-gpgpu “num [type=type1,type2…] [gmem=gmemsize] [mig=gsize]”]
[-r | rn] [-M mem_limit] [-W run_limit] [-We limit]
[-hosts “num [hselect=hselect_string]”] [-port num] [-mf file]
[-aps priority] [-f [host:]local_file operator [remote_file]]
[-command command [command …]] [-command command [command…]]
$ jsub -m host1 -q short my_job
$ jsub -m "host1+2 host2+1 host3" my_job
$ jsub -R "select[((type==NTX64 && mem > 50)||(type==LINUX64&& mem> 100))]" my_job
$ jsub -R "rusage[mem=50&swap=100]" my_job
$ jsub -n 4 -R "span[hosts=1]" my_job
$ jsub -n 4 -R "span[ptile=2]" my_job
$ jsub -n 2,4 my_job
$ jsub -m ~host1 my_job
$ jsub -o ~/output.sh my_job
$ jsub -i /apps/dir_input/input.sh -o /apps/dir_output/output.log -e
/apps/dir_output/error.log -cwd /apps/dir_output "hhh;sleep 10;hostname"
$ jjobs -l 59
Job <59>, Job Name <hhh;sleep 10;hostname>, User <user1>, Project
<default>, Status <PSUSP>, Queue <normal>, Application
<default>, APS Priority <5000>, Command <hhh;sleep 10;hostname>
Thu Mar 31 17:22:43: Submitted from host <host1>, CWD
</apps/dir_output>, Input File <dir_input/input.sh>, Output File
<dir_output/output.log>, Error File <dir_output/error.log>,
Specified Hosts <host1>;
$ jsub -f '/files/abc.conf > abc.conf' -f ' /tmp/ < test.conf' 'mv
$JH_STAGE_DIR/abc.conf $JH_STAGE_DIR/test.conf'
注:$JH_STAGE_DIR 對應的值為管理門戶->調度管理->高級配置功能頁面表單中對應的配置項"Linux節點數據緩存目錄(STAGE_TOP_DIR_LINUX)"的值(此處以/tmp/stagein為例)。
在此作業的執行節點文件系統下會按照以下規則產生作業文件臨時目錄:
/tmp/stagein/.${JOB_ID}.${JOB_INDEX}.stage
例如:
/tmp/stagein/.54.0.stage/xxx
jjobs [-h] [-V] [-w | -l] [-a] [-d] [-p] [-s]
[-r][-A] [-m host_name]
[-q queue_name] [-app application_name] [-u user_name | -u all]
[-P project_name] [-o “field_name[:[-][output_width]] …
[delimiter=‘character’]”] [-J name_spec] [-Jd desc_spec][-env]
[-t] [-regexp] [jobId [jobId …]]
$ jjobs -p -u user1
$ jjobs -r -m host1
$ jjobs -q short -P my_project -u all
$ jjobs -l job_id
$ jjobs -o "jobid:4 stat:-10 from_host delimiter=';'"
jhosts [-h] [-V] [-w | -l] [-R res_req] [-s
[res_name [res_name …]]]
[host_name [host_name …]] {stat,attrib,remove} …
$jhosts -l host1
$jhosts -R "select[mem>600]"
jmod [-h] [-V] [-L login_shell | -Ln] [-R res_req
| -Rn]
[-q queue_name | -qn] [-m “host_name[+[pref_level]] | host_group[+[pref_level]]…” | -mn]
[-n min_processors[,max_processors] | -nn] [-J job_name]
[-Jd job_desc | -Jdn] [-gpgpu “num [type=type1,type2…]
[gmem=gmemsize] [mig=gsize]” | -gpgpun]
[-app application_name | -appn]
[-hosts “num [hselect=hselect_string]” | -hostsn]
[-port num | -portn] [-mf file | -mfn] [-aps priority | -apsn]
[-M mem_limit | -Mn] [-W run_limit | -Wn] [-P project_name]
[jobId | jobId[index_list]] [[jobId | jobId[index_list]]…]
詳細信息見 jsub 命令,注意:不能修改已經派發成功的作業的-o、-e選項的值。如果在選項后面跟一個’n’,表示重置相應的作業選項信息。
$jmod -q test1 jobID
$jmod -qn jobID
$jmod -W +50 jobID $jmod -W +00:50 jobID
$jmod -W -120 jobID$jmod -W -02:00 jobID
其他選項示例可以參考jsub進行使用。
jctrl stop [-h] [-m host_name] [-q queue_name]
[-u user_name | -u all]
[-J job_name] [-app application_name]
jobId | jobId[index_list] | 0 [jobId | jobId[index_list] | 0 …]
jctrl resume [-h] [-m host_name] [-q
queue_name]
[-u user_name | -u all] [-J job_name]
[-app application_name]
jobId | jobId[index_list] | 0 [jobId | jobId[index_list] | 0 …]
jctrl kill [-h] [-m host_name] [-q queue_name]
[-u user_name | -u all]
[-J job_name] [-f] [-app application_name]
jobId | jobId[index_list] | 0 [jobId | jobId[index_list] | 0 …]
[user1@host1 apps]$ jctrl bot -p 2 241 243 242
Job <241> has been moved to position 2 from bottom
Job <243> has been moved to position 2 from bottom
Job <242> has been moved to position 2 from bottom
[user1@host1 apps]$ jjobs
JOBID USER STAT QUEUE FROM_HOST EXEC_HOST JOB_NAME SUBMIT_TIME ORDER
237 user1 RUN normal host1 host2 sleep 1000 Mar 30 15:40 -
238 user1 RUN normal host1 host2 sleep 1000 Mar 30 15:40 -
239 user1 PEND normal host1 sleep 1000 Mar 30 15:40 1
241 user1 PEND normal host1 sleep 1000 Mar 30 15:40 2
243 user1 PEND normal host1 sleep 1000 Mar 30 15:40 3
242 user1 PEND normal host1 sleep 1000 Mar 30 15:40 4
240 user1 PEND normal host1 sleep 1000 Mar 30 15:40 5
[user1@host1 apps]$ jjobs
JOBID USER STAT QUEUE FROM_HOST EXEC_HOST JOB_NAME SUBMIT_TIME ORDER
237 user1 RUN normal host1 host2 sleep 1000 Mar 30 15:40 -
238 user1 RUN normal host1 host2 sleep 1000 Mar 30 15:40 -
239 user1 PEND normal host1 sleep 1000 Mar 30 15:40 1
240 user1 PEND normal host1 sleep 1000 Mar 30 15:40 2
241 user1 PEND normal host1 sleep 1000 Mar 30 15:40 3
242 user1 PEND normal host1 sleep 1000 Mar 30 15:40 4
243 user1 PEND normal host1 sleep 1000 Mar 30 15:40 5
[user1@host1 apps]$ jctrl top -p 1 241 242 243
Job <241> has been moved to position 1 from top
Job <242> has been moved to position 1 from top
Job <243> has been moved to position 1 from top
[user1@host1 apps]$ jjobs
JOBID USER STAT QUEUE FROM_HOST EXEC_HOST JOB_NAME SUBMIT_TIME ORDER
237 user1 RUN normal host1 host2 sleep 1000 Mar 30 15:40 -
238 user1 RUN normal host1 host2 sleep 1000 Mar 30 15:40 -
243 user1 PEND normal host1 sleep 1000 Mar 30 15:40 1
242 user1 PEND normal host1 sleep 1000 Mar 30 15:40 2
241 user1 PEND normal host1 sleep 1000 Mar 30 15:40 3
239 user1 PEND normal host1 sleep 1000 Mar 30 15:40 4
240 user1 PEND normal host1 sleep 1000 Mar 30 15:40 5
jctrl requeue [-h] [-u user_name | -u all] [-J
job_name] [-d][-e] [-r] [-a] [-H]
0 | jobId | jobId[index] [0 | jobId | jobId[index] …]
$jctrl stop -q short -u user1 0
$jctrl resume -u user1 0
$jctrl kill -q short -u all 0
$jctrl requeue -a -u all 0
$jctrl start -m hostname jobID
$jctrl start -m "hostname1 hostname2" jobID
jctrl clean [-h] [-u user_name | -u all]
jobId | jobId[index_list] | 0 [jobId | jobId[index_list] | 0…]
$jctrl clean -u user1 0
Job <5> is being cleaned
Job <6> is being cleaned
Job <7> is being cleaned
jhist [-h] [-V] [-a] [-d] [-e] [-p] [-r] [-s] [-w
| -l]
[-S time0,time1] [-t] [-f logfile_name | -n 0] [-J job_name]
[-Jd job_desc] [-P project_name] [-q queue_name]
[-app application_name] [-u user_name|all]
[jobId | jobId[index_list] [jobId | jobId[index_list] …]]
jlimits [-h] [-V] [-s | -c] [-u
user_name|user_group|all]
[-m host_name|host_group|all] [-q queue_name|all]
[-app application_name|all] [-w]
$jlimits -u user1
$jlimits -u all
$jlimits -m host2
$jlimits -m all
$jlimits -q queue1
$jlimits -q all
$jlimits -app app1
$jlimits -app all
# jconfig list jhds.conf
cluster_domain=
host=host1
port=6322
max_connections=5
max_connections_candidate=30
timeout=5
jhds_http_port=6324
jhds_port=6325
# jconfig list jhds.conf
cluster_domain=
host=host1
port=6322
max_connections=5
max_connections_candidate=30
timeout=5
jhds_http_port=6324
jhds_port=6325
# jconfig set MASTER_CANDIDATES='host1 host2 host3'
to make the configuration effective, please run the following:
jadmin schedreconfig
jadmin jhdsreconfig
# jconfig set REDIS_PORT=9322
unischeduler stop all
unischeduler start
# jconfig update scheduler.conf CLUSTER_NAME='jhadmin user1'
to make the configuration effective, please run the following:
jadmin schedreconfig
# export LANG=zh_CN
# jcode -e 10036
10036: 許可證失敗
# jcode -r 2001 2002 2006 2009
2001: Gui作業失敗次數達到上限
2002: Gui作業信息讀取錯誤
2006: Gui 作業因初始化失敗而退出
2009: Gui 作業申請會話失敗
$ jsub -Is bash
Job <13> is submitted to default queue <normal> and default
application <default>
<<Waiting for dispatch ...>>
<<Starting on host1>>
<< To escape to local shell, press 'Ctrl + q'. The job will keep
running at server side. >>
<< output from stdout >>
當前端jsub -Is命令終止,后端作業不退出繼續運行,jjobs查詢作業狀態為RUN時,可通過使用命令jattach加作業ID號,attach作業到終端繼續接受交互式操作。
$ jattach 13
Job <13> is running on host1
<<Waiting for attach ...>>
<<Attaching on zrkhost1>>
<< output from stdout >>
7*24小時專家團隊,隨時靜候您的訪問