------------------------------
Doc Ruckel
Part time programmer
Rocket Forum Shared Account
------------------------------
Doc
If the database does not need it then why throw more memory at a process? Multivalue databases are pretty efficient of memory usage. Its probably better use of memory to increase disk cache size. You could also look at how much activity there is in the UniVerse TEMP (UVTEMP) directory and if it's busy then put it on ramdisk.
Rocket Professional Services can offer system and application-specific tuning advice if you wish - though there is a cost - see https://www.rocketsoftware.com/en-us/insights/multivalue-system-healthcheck.
Regards
JJ
------------------------------
John Jenkins
Thame, Oxfordshire
------------------------------
Doc
If the database does not need it then why throw more memory at a process? Multivalue databases are pretty efficient of memory usage. Its probably better use of memory to increase disk cache size. You could also look at how much activity there is in the UniVerse TEMP (UVTEMP) directory and if it's busy then put it on ramdisk.
Rocket Professional Services can offer system and application-specific tuning advice if you wish - though there is a cost - see https://www.rocketsoftware.com/en-us/insights/multivalue-system-healthcheck.
Regards
JJ
------------------------------
John Jenkins
Thame, Oxfordshire
------------------------------
Thank you, JJ!
~Doc
Hello,
I'm sharing my regular tips for optimizing a Universe environment on Windows Server.
set uv and uvprocess to use more memories
if possible use (with uv 12+) RFS ON, where the I/O are not done by the user session (uvsh, uvapi_slave) process but in-memory by secondary processing and paging mechanims.
I suggest to write a IO(verb,record,file,key,options) function to centralize all your disk access. like :
(This sample can be far more complete !)
FUNCTION IO(verb,record,file,key,options)
COMMON /IO/ FILENAMES,LAST.STATUS,FILEVARS(1)
LAST.STATUS = ''
LOCATE(file,FILENAMES;RG) THEN
FV = FILEVARS(RG)
END ELSE
OPEN file TO FV ELSE result = 0 ; LAST.STATUS = status()
if RG > INMAT(FILEVARS) then DIM FILEVARS(RG + 100) ;* add 100 dimensions
FILENAMES<RG> = file ; FILEVARS(RG) = FV
END
IF LAST.STATUS = '' THEN
ON verb GOSUB doREAD, doREADV, doWRITE,...,doSTATUS, doRECORDLOCKED,...
END
return (result)
*-----------------------
doREAD:
READ record FROM FV,key THEN result = 1 ELSE result = 0
return
doREADV:
READ record FROM FV,key,options THEN result = 1 ELSE result = 0
return
doWRITE:
WRITE record ON file,key ...
return
doSTATUS:
result = LAST.STATUS
return
doRECORDLOCKED:
...
return
doFILEINFO:
return
do...
return
*-----------------------
prepare a include to incorporate the IO Function and Equates into the code
BP IO.H
DEFFUN IO(verb,record,file,key,options) calling "*IO*
EQU IO$READ TO 1 , IO$READV TO 2, ...
and use regex search/replace (or write a basic) to include BP IO.H and refactor your READ|WRITE rec FROM file,key into IF IO(IO$READ/WRITE,file,key,record,'') or READV|WRITEV rec FROM file,key,vm into IF IO(IO$READV|WRITEV,file,key,record,vm)
For sure, you can do it only at the OPEN level and create a myOPEN subr/func, I like the encapsulation of read/write/info verbs then I can easily add logs, warnings or change the logic of the access.
I hope this help.
Hello,
I'm sharing my regular tips for optimizing a Universe environment on Windows Server.
set uv and uvprocess to use more memories
if possible use (with uv 12+) RFS ON, where the I/O are not done by the user session (uvsh, uvapi_slave) process but in-memory by secondary processing and paging mechanims.
I suggest to write a IO(verb,record,file,key,options) function to centralize all your disk access. like :
(This sample can be far more complete !)
FUNCTION IO(verb,record,file,key,options)
COMMON /IO/ FILENAMES,LAST.STATUS,FILEVARS(1)
LAST.STATUS = ''
LOCATE(file,FILENAMES;RG) THEN
FV = FILEVARS(RG)
END ELSE
OPEN file TO FV ELSE result = 0 ; LAST.STATUS = status()
if RG > INMAT(FILEVARS) then DIM FILEVARS(RG + 100) ;* add 100 dimensions
FILENAMES<RG> = file ; FILEVARS(RG) = FV
END
IF LAST.STATUS = '' THEN
ON verb GOSUB doREAD, doREADV, doWRITE,...,doSTATUS, doRECORDLOCKED,...
END
return (result)
*-----------------------
doREAD:
READ record FROM FV,key THEN result = 1 ELSE result = 0
return
doREADV:
READ record FROM FV,key,options THEN result = 1 ELSE result = 0
return
doWRITE:
WRITE record ON file,key ...
return
doSTATUS:
result = LAST.STATUS
return
doRECORDLOCKED:
...
return
doFILEINFO:
return
do...
return
*-----------------------
prepare a include to incorporate the IO Function and Equates into the code
BP IO.H
DEFFUN IO(verb,record,file,key,options) calling "*IO*
EQU IO$READ TO 1 , IO$READV TO 2, ...
and use regex search/replace (or write a basic) to include BP IO.H and refactor your READ|WRITE rec FROM file,key into IF IO(IO$READ/WRITE,file,key,record,'') or READV|WRITEV rec FROM file,key,vm into IF IO(IO$READV|WRITEV,file,key,record,vm)
For sure, you can do it only at the OPEN level and create a myOPEN subr/func, I like the encapsulation of read/write/info verbs then I can easily add logs, warnings or change the logic of the access.
I hope this help.
Hi Manu,
Thank you for the Universe optimization post.
I believe Universe provides the named common functionality for opening files.
Here is how I open files in Universe:
call *OPEN$UV$FILE("", "APBATCH", fileAPBATCH, "fileAPBATCH")
if @user.return.code eq 0 then programMessage = "NO APBATCH FILE" ; errorCode = FILE.OPEN.FAIL ; return
OPEN$UV$FILE is in the APP.PROGS directory.
Hello,
I'm sharing my regular tips for optimizing a Universe environment on Windows Server.
set uv and uvprocess to use more memories
if possible use (with uv 12+) RFS ON, where the I/O are not done by the user session (uvsh, uvapi_slave) process but in-memory by secondary processing and paging mechanims.
I suggest to write a IO(verb,record,file,key,options) function to centralize all your disk access. like :
(This sample can be far more complete !)
FUNCTION IO(verb,record,file,key,options)
COMMON /IO/ FILENAMES,LAST.STATUS,FILEVARS(1)
LAST.STATUS = ''
LOCATE(file,FILENAMES;RG) THEN
FV = FILEVARS(RG)
END ELSE
OPEN file TO FV ELSE result = 0 ; LAST.STATUS = status()
if RG > INMAT(FILEVARS) then DIM FILEVARS(RG + 100) ;* add 100 dimensions
FILENAMES<RG> = file ; FILEVARS(RG) = FV
END
IF LAST.STATUS = '' THEN
ON verb GOSUB doREAD, doREADV, doWRITE,...,doSTATUS, doRECORDLOCKED,...
END
return (result)
*-----------------------
doREAD:
READ record FROM FV,key THEN result = 1 ELSE result = 0
return
doREADV:
READ record FROM FV,key,options THEN result = 1 ELSE result = 0
return
doWRITE:
WRITE record ON file,key ...
return
doSTATUS:
result = LAST.STATUS
return
doRECORDLOCKED:
...
return
doFILEINFO:
return
do...
return
*-----------------------
prepare a include to incorporate the IO Function and Equates into the code
BP IO.H
DEFFUN IO(verb,record,file,key,options) calling "*IO*
EQU IO$READ TO 1 , IO$READV TO 2, ...
and use regex search/replace (or write a basic) to include BP IO.H and refactor your READ|WRITE rec FROM file,key into IF IO(IO$READ/WRITE,file,key,record,'') or READV|WRITEV rec FROM file,key,vm into IF IO(IO$READV|WRITEV,file,key,record,vm)
For sure, you can do it only at the OPEN level and create a myOPEN subr/func, I like the encapsulation of read/write/info verbs then I can easily add logs, warnings or change the logic of the access.
I hope this help.
Manu,
On a busy Windows system with lots of connections being made and dropped (e.g. if using UO with lots of connections and especially with Connection Pooling) then I recommend dropping the Windows registry setting for the TCP Time Wait Delay to 15 - see https://learn.microsoft.com/en-us/biztalk/technical-guides/settings-that-can-be-modified-to-improve-network-performance and also increase the number of ephemeral ports https://learn.microsoft.com/en-us/answers/questions/482793/tcp-ip-concurrent-connections
When connection time delays increase as the connection load/hit-rate increases then these are definitely in the frame. I usually adjust the TCP Time Wait Delay just as a matter of routine.
This frees up socket conections after closure much more quickly than the default and can help avoid socket resource exhaustion.
Regards
JJ
------------------------------
John Jenkins
Thame, Oxfordshire
------------------------------
Manu,
On a busy Windows system with lots of connections being made and dropped (e.g. if using UO with lots of connections and especially with Connection Pooling) then I recommend dropping the Windows registry setting for the TCP Time Wait Delay to 15 - see https://learn.microsoft.com/en-us/biztalk/technical-guides/settings-that-can-be-modified-to-improve-network-performance and also increase the number of ephemeral ports https://learn.microsoft.com/en-us/answers/questions/482793/tcp-ip-concurrent-connections
When connection time delays increase as the connection load/hit-rate increases then these are definitely in the frame. I usually adjust the TCP Time Wait Delay just as a matter of routine.
This frees up socket conections after closure much more quickly than the default and can help avoid socket resource exhaustion.
Regards
JJ
------------------------------
John Jenkins
Thame, Oxfordshire
------------------------------
Hi John,
Do you have a version of this for Unidata 8.3 windows server hosted in the Azure cloud.
Thanks
Hi John,
Do you have a version of this for Unidata 8.3 windows server hosted in the Azure cloud.
Thanks
Hi John,
Thank you for the tips, I add it to my checklist.
(I'm happy you didn't disagrea with my suggestions. :-)
Hi John,
Do you have a version of this for Unidata 8.3 windows server hosted in the Azure cloud.
Thanks
Darren,
This is a.change in Windows timing and not database dependent.
Regards
JJ
Hello,
I'm sharing my regular tips for optimizing a Universe environment on Windows Server.
set uv and uvprocess to use more memories
if possible use (with uv 12+) RFS ON, where the I/O are not done by the user session (uvsh, uvapi_slave) process but in-memory by secondary processing and paging mechanims.
I suggest to write a IO(verb,record,file,key,options) function to centralize all your disk access. like :
(This sample can be far more complete !)
FUNCTION IO(verb,record,file,key,options)
COMMON /IO/ FILENAMES,LAST.STATUS,FILEVARS(1)
LAST.STATUS = ''
LOCATE(file,FILENAMES;RG) THEN
FV = FILEVARS(RG)
END ELSE
OPEN file TO FV ELSE result = 0 ; LAST.STATUS = status()
if RG > INMAT(FILEVARS) then DIM FILEVARS(RG + 100) ;* add 100 dimensions
FILENAMES<RG> = file ; FILEVARS(RG) = FV
END
IF LAST.STATUS = '' THEN
ON verb GOSUB doREAD, doREADV, doWRITE,...,doSTATUS, doRECORDLOCKED,...
END
return (result)
*-----------------------
doREAD:
READ record FROM FV,key THEN result = 1 ELSE result = 0
return
doREADV:
READ record FROM FV,key,options THEN result = 1 ELSE result = 0
return
doWRITE:
WRITE record ON file,key ...
return
doSTATUS:
result = LAST.STATUS
return
doRECORDLOCKED:
...
return
doFILEINFO:
return
do...
return
*-----------------------
prepare a include to incorporate the IO Function and Equates into the code
BP IO.H
DEFFUN IO(verb,record,file,key,options) calling "*IO*
EQU IO$READ TO 1 , IO$READV TO 2, ...
and use regex search/replace (or write a basic) to include BP IO.H and refactor your READ|WRITE rec FROM file,key into IF IO(IO$READ/WRITE,file,key,record,'') or READV|WRITEV rec FROM file,key,vm into IF IO(IO$READV|WRITEV,file,key,record,vm)
For sure, you can do it only at the OPEN level and create a myOPEN subr/func, I like the encapsulation of read/write/info verbs then I can easily add logs, warnings or change the logic of the access.
I hope this help.
Already have an account? Login
Enter your E-mail address. We'll send you an e-mail with instructions to reset your password.