1 | %ZTM6 ;SEA/RDS-TaskMan: Manager, Part 8 (Load Balancing) ;07/28/2005 16:14
|
---|
2 | ;;8.0;KERNEL;**23,118,127,136,355**;JUL 10, 1995;Build 9
|
---|
3 | ;
|
---|
4 | BALANCE ;CHECK^%ZTM--determine whether cpu should wait for balance
|
---|
5 | ;Return ZTOVERLD =1 if need to wait, 0 to run
|
---|
6 | ;The TM with the largest value sets ^%ZTSCH("LOAD",value)=who^when
|
---|
7 | ;If your value is greater or equal then you run.
|
---|
8 | ;If your value is less you wait unless you set LOAD then you run.
|
---|
9 | L +^%ZTSCH("LOAD"):5 N X,ZTIME,ZTLEFT,ZTPREV
|
---|
10 | N $ES,$ET S $ET="Q:$ES>0 D ER^%ZTM6"
|
---|
11 | S ZTOVERLD=0,ZTPREV=+$O(^%ZTSCH("LOAD",0)),@("ZTLEFT="_%ZTPFLG("BAL"))
|
---|
12 | S ZTIME=$$H3($H),ZTOVERLD=$$COMPARE(%ZTPAIR,ZTLEFT,ZTPREV)
|
---|
13 | ;If we are RUNNING have other submanagers wait
|
---|
14 | I 'ZTOVERLD D
|
---|
15 | . S X="" F S X=$O(^%ZTSCH("LOADA",X)) Q:X="" S $P(^(X),"^")=1
|
---|
16 | . K ^%ZTSCH("LOAD") S ^("LOAD",ZTLEFT)=%ZTPAIR_"^"_ZTIME
|
---|
17 | ;Now set a value that is used by our %ZTMS to run/wait also
|
---|
18 | S ^%ZTSCH("LOADA",%ZTPAIR)=ZTOVERLD_"^"_ZTLEFT_"^"_ZTIME_"^"_$J
|
---|
19 | L -^%ZTSCH("LOAD")
|
---|
20 | Q
|
---|
21 | ;
|
---|
22 | STOPWT() ;See if we should stop Balance wait
|
---|
23 | L +^%ZTSCH("LOAD"):0 Q:'$T 0 ;Keep waiting if can't get lock
|
---|
24 | N I,J S I="",J=1
|
---|
25 | F S I=$O(^%ZTSCH("LOADA",I)) Q:I="" I '^(I) S J=0
|
---|
26 | L -^%ZTSCH("LOAD")
|
---|
27 | Q J ;Return: stop waiting 1, keep waiting 0.
|
---|
28 | ;
|
---|
29 | CHECK ;Called when job limit reached.
|
---|
30 | ;If not doing balancing, remove node and quit
|
---|
31 | N I,J I %ZTPFLG("BAL")="" K ^%ZTSCH("LOADA",%ZTPAIR) Q
|
---|
32 | L +^%ZTSCH("LOAD"):0 Q:'$T ;Get it next time
|
---|
33 | S I=$O(^%ZTSCH("LOAD",0)),J=$G(^%ZTSCH("LOADA",%ZTPAIR))
|
---|
34 | S I=$P(J,"^",2)<I,$P(^%ZTSCH("LOADA",%ZTPAIR),"^",1)=I
|
---|
35 | L -^%ZTSCH("LOAD")
|
---|
36 | Q
|
---|
37 | ;
|
---|
38 | COMPARE(ID,ZTLEFT,ZTPREV) ;
|
---|
39 | ;BALANCE--compare our cpu capacity left to that of previous checker
|
---|
40 | ;input: cpu name, cpu capacity left, cpu capacity of previous checker
|
---|
41 | ;output: whether current cpu should wait, 0=run, 1=wait
|
---|
42 | N X
|
---|
43 | I ZTLEFT'<ZTPREV Q 0
|
---|
44 | S X=^%ZTSCH("LOAD",ZTPREV)
|
---|
45 | I $P(X,"^",2)+150<ZTIME Q 0
|
---|
46 | Q $P(X,"^")'[ID
|
---|
47 | ;
|
---|
48 | ER ;Clean up if error
|
---|
49 | S $EC="",%ZTPFLG("BAL")="",ZTOVERLD=0 L -^%ZTSCH("LOAD")
|
---|
50 | Q
|
---|
51 | ;
|
---|
52 | H3(%) ;Convert $H to seconds
|
---|
53 | Q 86400*%+$P(%,",",2)
|
---|
54 | ;
|
---|
55 | VXD(BIAS) ;--algorithm for VAX DSM
|
---|
56 | ;Capacity Left=Available Jobs - Active Jobs - (4 * Compute Queue Length)
|
---|
57 | ;output: cpu capacity left+bias
|
---|
58 | N ZTJ,ZTL S ZTJ=$$VXDJOBS
|
---|
59 | S ZTL=$P(ZTJ,",")-$P(ZTJ,",",2)-(4*$P(ZTJ,",",3)) I ZTL<1 S ZTL=1
|
---|
60 | Q ZTL+$G(BIAS)
|
---|
61 | ;
|
---|
62 | VXDJOBS() ;
|
---|
63 | ;VXD--gather job table information
|
---|
64 | ;output: sysgen max # jobs, current # jobs, current # computable jobs
|
---|
65 | N
|
---|
66 | D INIT^%VOLDEF I '%SMSTART Q ""
|
---|
67 | S ZTJOBSIZ=%JOBSIZ,ZTJOBTAB=%JOBTAB
|
---|
68 | S ZTMAX=%MAXPROC,(ZTCOMP,ZTCOUNT)=0
|
---|
69 | F ZTJOB=1:1:ZTMAX D
|
---|
70 | .S ZTADDR=ZTJOB*ZTJOBSIZ+ZTJOBTAB,ZTPID=$V(ZTADDR+20) D VXDJ1:ZTPID Q
|
---|
71 | Q ZTMAX_","_ZTCOUNT_","_ZTCOMP
|
---|
72 | ;
|
---|
73 | VXDJ1 ;VXDJOBS--adjust # active and # computable based on current entry
|
---|
74 | S X="VXDJE",@^%ZOSF("TRAP")
|
---|
75 | S ZTNAME=$ZC(%GETJPI,ZTPID,"PRCNAM") Q:ZTNAME["Sub"
|
---|
76 | S ZTSTATE=$ZC(%GETJPI,ZTPID,"STATE")
|
---|
77 | S ZTCOUNT=ZTCOUNT+1
|
---|
78 | I ZTSTATE["COM"!(ZTSTATE["CUR") S ZTCOMP=ZTCOMP+1
|
---|
79 | VXDJE S X="",@^%ZOSF("TRAP") Q
|
---|
80 | ;
|
---|
81 | MSM4() ;Use MSMv4 LAT calcuation
|
---|
82 | N MAXJOB,CURJOB
|
---|
83 | S MAXJOB=$V($V(3,-5),-3,0),CURJOB=$V(168,-4,2)
|
---|
84 | Q MAXJOB-CURJOB*255\MAXJOB
|
---|
85 | ;
|
---|
86 | CACHE1(%) ;Use available jobs
|
---|
87 | N CUR,MAX
|
---|
88 | Q $$AVJ^%ZOSV()+$G(%)
|
---|
89 | ;
|
---|
90 | CACHE2(%COM,%LOG) ;Cache, Pull metric data
|
---|
91 | N TMP,$ET
|
---|
92 | S $ETRAP="S $ECODE="""" Q ZTPREV"
|
---|
93 | S %LOG=$G(%LOG,"VISTA$METRIC")
|
---|
94 | I $L($G(%COM)) S TMP=$ZF(-1,%COM)
|
---|
95 | Q $ZF("TRNLNM",%LOG)
|
---|
96 | ;
|
---|
97 | RNDRBN() ;Round Robin
|
---|
98 | L +^%ZTSCH("RNDRBN"):1
|
---|
99 | N R S R=$G(^%ZTSCH("RNDRBN"))+2,^%ZTSCH("RNDRBN")=(R#512)
|
---|
100 | L -^%ZTSCH("RNDRBN")
|
---|
101 | Q
|
---|