![]() |
![]() HP OpenVMS Systemsask the wizard |
![]() |
The Question is: Is it possible to prevent PAGEDYN becoming to fragmented during Oracle processing. LNM-blocks in PAGEDYN growing to more than 70% and would never be released again. The Answer is : The OpenVMS Wizard suspects you might be accumulating logical name tables -- please contact Oracle for a simple fix for this (known) leak in Oracle. Please also contact Oracle for any issues that might be specific to the use and the operation of Oracle software. Here is a command procedure that can clean up the stale logical name tables that can accumulate: $! $! Command procedure to clean up logical name tables left by Oracle $! processes in order to recover lost PAGEDYN $! $! Reported against Oracle V7.1.4 $! $! When an Oracle process is created, a logical name table is also created $! to pass information to the new process. Since this is a permanent, $! shareable table, it is not deleted when the process terminates. Over $! time, the accumulation of logical names will deplete PAGEDYN to the point $! that the system hangs or crashes. $! $! The logical name tables have names of the form TNS_xxxxxxxx where xxxxxxxx $! is the PID of the process for which it was created. It is therefore quite $! straightforward to detect "orphaned" tables by testing to see if the $! owner process still exists. $! $! WARNING - The SHOW LOGICAL/STRUCTURE command is used to generate a list $! of all shareable logical name tables on the system. Since the command $! takes out the LNM spinlock for the duration of the command, it will $! hang most user processes for its duration. If there is a large accumulation $! of logical name tables, this can be a significant time. One report was $! for a hang of 20mins when displaying 10MB of logical names. $! $! If this procedure is executed frequently, the duration of the hang should $! be minimal. Note that the size/response time of the command is non-linear. $! $! Requires SYSPRV and/or BYPASS privilege $! $! Author: John Gillings $! Systems Software Consultant $! Compaq Customer Support Centre $! Sydney, Australia $! $! email: John.Gillings@Compaq.com $! $! PROCEDURE $! $! First list all shareable logical name tables $! $ SHOW LOGICAL/STRUCTURE/OUT=LNMLIST.TMP $! $! Filter for Oracle logical name tables $! $ SEARCH LNMLIST.TMP "(TNS_" /OUT=ORACLE_TABLES.TMP $ DELETEXX LNMLIST.TMP; $ OPEN/READ in ORACLE_TABLES.TMP $! $! Scan Oracle tables $! $ loop: READ/END=Finished/ERROR=Finished in Table $! $! Get the table name by removing all whitespace and brackets $! $ Table=F$EDIT(Table,"COLLAPSE")-"("-")" $! $! Extract PID from table name $! $ pid=F$ELEMENT(1,"_",Table) $! $! Ignore if process still exists. If process does not exist, the $! F$GETJPI call will fail with %SYSTEM-W-NONEXPR, nonexistent process $! and thus fall through. We will also fall through if there is any $! mismatch between the input and output PIDs. This should never $! happen, but it's safer code. $! $ ON WARNING THEN CONTINUE $ IF F$GETJPI(pid,"PID").EQS.pid THEN GOTO loop $! $! Sanity check PID format, make sure it's a valid, non-zero, 8 digit $! hex string. F$INTEGER will return 0 if there are any non-numeric $! characters in the input string $! $ IF F$INTEGER("%X''pid'").EQ.0.OR.F$LENGTH(pid).NE.8 $ THEN $! $! Don't know what this table is, output message about it $! $ WRITE SYS$OUTPUT "Unrecognised table name ''Table'" $ ELSE $! $! Passed all tests, this must be an orphaned logical name table. $! $! Delete the logical names in table and the table itself. $! Note that the DEASSIGN/ALL should be redundant, but again, it's $! safer to be explicit $! $ WRITE SYS$OUTPUT "Deleting table ''Table'" $ DEASSIGN/ALL/TABLE='Table' $ DEASSIGN/USER/TABLE=LNM$SYSTEM_DIRECTORY 'Table' $ ENDIF $ GOTO LOOP $ Finished: $ CLOSE in $ DELETE ORACLE_TABLES.TMP; $ EXIT
|