Title: | DECram |
Notice: | DECram Notesfile. See note 2.0 for the Kit location |
Moderator: | AXEL::FOLEY |
Created: | Mon Sep 23 1991 |
Last Modified: | Tue Apr 15 1997 |
Last Successful Update: | Fri Jun 06 1997 |
Number of topics: | 136 |
Total number of notes: | 520 |
Hi, Could someone explain why the hitrate for DECram device MDA0, as reported by @SYS$STARTUP:RAMDISK$STARTUP HITRATE, is totally erroneous? Thanks, Greg Marshall -------------------------------------------------------------------- Customer says that the statistic seemed reasonable for a period of time but now appears wrong. He has supplied the following info: Config: OpenVMS/Alpha v6.2-1H2 DECram v2.2B Sample output from each node, which includes: - Output from HITRATE display - One of four SYS$STARTUP:RAMDISK$nodename.DAT files (all four are exactly the same ... just double checked them all with DIF). $ SYSMAN SYSMAN> set env /node=(EMJVX0, EMJVX1, EMJVX2, EMJVX3) SYSMAN> do @sys$startup:ramdisk$startup hitrate %SYSMAN-I-OUTPUT, command execution on node EMJVX0 Current RAMdisk hit rate = 4294967272% Created: 11-JAN-1997 17:33:50.62 SYS$SYSDEVICE operation count = 11451082, RAMdisk operation count= 32344817 %RAMdisk-S-HITRATE, RAMdisk HITRATE completed successfully %SYSMAN-I-OUTPUT, command execution on node EMJVX1 Current RAMdisk hit rate = 4294967289% Created: 11-JAN-1997 18:00:10.78 SYS$SYSDEVICE operation count = 9326662, RAMdisk operation count= 39391873 %RAMdisk-S-HITRATE, RAMdisk HITRATE completed successfully %SYSMAN-I-OUTPUT, command execution on node EMJVX2 Current RAMdisk hit rate = 4294967227% Created: 18-JAN-1997 17:23:26.34 SYS$SYSDEVICE operation count = 6192256, RAMdisk operation count= 22774372 %RAMdisk-S-HITRATE, RAMdisk HITRATE completed successfully %SYSMAN-I-OUTPUT, command execution on node EMJVX3 Current RAMdisk hit rate = 4294967221% Created: 18-JAN-1997 15:19:07.00 SYS$SYSDEVICE operation count = 6036882, RAMdisk operation count= 21879205 %RAMdisk-S-HITRATE, RAMdisk HITRATE completed successfully ! Name: RAMDISK$EMJVX3.DAT ! Description: ! ! This is the data file used by RAMDISK$STARTUP.COM during a CREATE or a ! SIZE function to build a read-only RAMdisk. ! ! The data file must be named SYS$STARTUP:RAMDISK$node.DAT where node is ! your system's nodename. ! ! **** The files listed here are just an example. You need to determine ! **** which files on your system should be moved to the RAMdisk. Consult ! **** the DECram documentation for more details. ! ! The data file is used to identify which directories and files you wish ! to copy to the RAMdisk and use from that location. Define the system ! logical from the origin of the files followed by the filename. ! Wildcards are NOT allowed. ! ! If any of the files copied were installed on the physical disk, they ! are de-installed and installed on the RAMdisk so image activations and ! hard faults occur on the RAMdisk. ! ! CAUTION: Images such as DCLTABLES.EXE should never be moved to the ! RAMdisk because some processes (for example, SMISERVER) will have! already started using the physical disk version by the time you get the ! RAMdisk loaded and running. ! ! There are also two parameters examined by the procedure. These are ! "minimum_free_memory" and "extra_disk_blocks". The "extra_disk_blocks" ! allows you to specify how much free space you need on the RAMdisk. ! Extra space on the disk would allow you to manually add files to the ! RAMdisk. The "minimum_free_memory" parameter ensures the RAMdisk will ! not be created unless it will leave at least that amount of free ! page(let)s in memory. If you do not wish to specify these parameters, ! simply set them to zero. ! ! Here are the user defined parameters: ! minimum_free_memory is expressed in pagelets on OpenVMS AXP minimum_free_memory=1000 extra_disk_blocks=0 sys$system:backup.exe sys$system:copy.exe sys$system:dcl.exe sys$system:delete.exe sys$system:directory.exe sys$system:loginout.exe sys$system:mail.exe sys$system:mail_server.exe sys$system:mom.exe sys$system:netserver.exe sys$system:queman.exe sys$system:rename.exe sys$system:rundet.exe sys$system:search.exe sys$system:set.exe sys$system:setp0.exe sys$system:show.exe sys$system:submit.exe sys$system:sysgen.exe sys$system:tpu.exe sys$system:type.exe sys$system:vue$master.exe sys$library:BASRTL_D56_TV.EXE sys$library:BASRTL_TV_SUPPORT.EXE sys$library:cddshr.exe !sys$library:CMA$TIS_SHR.EXE ! Don't put into RAM - INSTALL problem sys$library:CONVSHR.EXE !sys$library:dcltables.exe ** do not put this file on the RAMdisk sys$library:DEC$BASRTL.EXE !sys$library:DECC$SHR.EXE ! Don't put into RAM - INSTALL problem sys$library:debugshr.exe SYS$LIBRARY:SYNRTL.EXE SYS$LIBRARY:SYNRTLSRT.EXE ! !sys$library:DPML$SHR.EXE ! Don't put into RAM - INSTALL problem sys$library:FDLSHR.EXE !sys$library:LBRSHR.EXE ! Don't put into RAM - INSTALL problem !sys$library:LIBOTS.EXE ! Don't put into RAM - INSTALL problem sys$library:LIBOTS2.EXE !sys$library:LIBRTL.EXE ! Don't put into RAM - INSTALL problem sys$library:LIBRTL_D56_TV.EXE sys$library:MTHRTL_D53_TV.EXE sys$library:NCSSHR.EXEsys$library:mailshr.exe sys$library:nm_mailshr.exe !sys$library:secureshrp.exe ! Don't put into RAM - INSTALL problem sys$library:SORTSHR.EXE sys$library:TIE$SHARE.EXE ! sys$message:dblmf.exe ! Leave this marker here. It is used to cleanly locate the end of this ! data file so several routines can use it. end_of_file
T.R | Title | User | Personal Name | Date | Lines |
---|---|---|---|---|---|
134.1 | 32bit overflow | GIDDAY::GILLINGS | a crucible of informative mistakes | Wed Feb 12 1997 02:21 | 66 |
Greg, The code to calculate this statistic is as follows: $ sysdisk_ops = f$getdvi("sys$sysdevice","opcnt") $ ramdisk_ops = f$getdvi("RAMdisk","opcnt") $ open/read/error=error$ statsfile RAMdisk:[000000]RAMdisk$stats.dat $ read/error=error$ statsfile sysdisk_ops_creation $ read/error=error$ statsfile ramdisk_ops_creation $ read/error=error$ statsfile create_date $ close/error=error$ statsfile $ sysdisk_ops = sysdisk_ops - sysdisk_ops_creation $ ramdisk_ops = ramdisk_ops - ramdisk_ops_creation $ say "" $ say f$fao("Current RAMdisk hit rate = !UL% Created: !AS",- ramdisk_ops*100/(sysdisk_ops+ramdisk_ops),create_date) $ say "" $ say - f$fao("SYS$SYSDEVICE operation count = !UL, RAMdisk operation count= !UL",- sysdisk_ops,ramdisk_ops) According to your note, the values are: $ sysdisk_ops=11451082 $ ramdisk_ops=32344817 The largest positive value expressible as a signed 32 bit integer is 2147483647, but the intermediate result of "ramdisk_ops*100" should be 3234481700. Since DCL doesn't signal an overflow, the result is (hex) %XC0CA4624 which is interpreted as -1060485596. This value is then divided by 43795899, yielding -24. However, the formatting is "%UL" which interprets the result as unsigned, hence 4294967289%. Now, the calculation could have been expressed as: ramdisk_ops/((sysdisk_ops+ramdisk_ops)/100) which, in this case would have yielded the correct answer of 73, but would result in reduced accuracy for small values and a divide by zero error for very small values (ie: sysdisk_ops+ramdisk_ops < 100). Even if the code were changed, the calculation would eventually fail since other values could exceed the limits of 32 bit arithmetic. Indeed, the counters themselves would eventually wrap around, also resulting in odd behaviour. OpenVMS is sometimes just too reliable for it's own good ;-) If the customer is very concerned about this, they could change the code from: $ say f$fao("Current RAMdisk hit rate = !UL% Created: !AS",- ramdisk_ops*100/(sysdisk_ops+ramdisk_ops),create_date) to: $ IF ramdisk_ops < 20000000 ! actually 21474837 but why push it? $ THEN $ say f$fao("Current RAMdisk hit rate = !UL% Created: !AS",- ramdisk_ops*100/(sysdisk_ops+ramdisk_ops),create_date) $ ELSE $ say f$fao("Current RAMdisk hit rate = !UL% Created: !AS",- ramdisk_ops/((sysdisk_ops+ramdisk_ops)/100),create_date) $ ENDIF Note that the change would need to be propogated into any new versions of the file created by reinstallation or upgrade of the product. John Gillings, Sydney CSC |