%getperfcount() function

The %getperfcount() function returns the D3 performance counters.

Syntax

n = %getperfcount(buffer, MAXBUF)

Parameter(s)

n Number of characters returned in the buffer. If n = -1, the buffer size is too small.
buffer Specifies the buffer in which to return a dynamic array of the performance count information.
MAXBUF Specifies the maximum size for the buffer.

Example(s)

The example program below illustrates displaying the performance counter.

include dm,bp,includes nt_util.inc
equ MAXBUF to 512
char buffer[MAXBUF]
n = %getperfcount( buffer, MAXBUF )
if n > 0 print buffer

This returns a display of the following performance counters:

Reads:                  117988
Writes:                 4008
ItemLocks:              2
GroupLocks:             0
Opens:                  36245
MemoryFull:             0
OvfAdds:                1
OvfReads:               16413
CacheMiss:              16823

Reads Represents the number of times per second a record was read.
Note: This does not necessarily imply a disk I/O.
Writes Represents the number of times per second a record was written.
Note: This does not necessarily imply a disk I/O.
ItemLocks Represents the number of times per second a thread failed to acquire an item lock.
GroupLocks Represents the number of times per second a thread failed to acquire a group lock. Group locks are internal locks set when a table is modified. High group lock counts indicate that small tables are accessed by many threads. A solution might be to increase the modulo   of these tables.
Opens Represents the number of times per second a table was opened. If this number is consistently high, it may be an indication of an application problem that keeps opening files and never closes them.
Note: The VME caches file descriptors. As a result, it does not hurt to leave files open. Generally, Visual Basic OLE applications do not have access to such a cache. Therefore, a rogue Visual BASIC application that loops opening files can create this kind of problem.
MemoryFull Represents the number of times per second the server failed to map a page in memory because all entries are in use. This counter should always be null. If this counter becomes non-null, it is an indication that the memory is too small for the application. If the physical memory is already above 2 GB of memory, splitting the database across two or more servers could help solve this problem.
OvfAdds Represents the number of times per second a table was extended. If this number is consistently not null, it is an indication that one or more files are severely undersized and are in the process of being populated.
OvfReads Represents the number of times per second poorly-sized tables are accessed. If this number is consistently not null, it is an indication that one or more files are severely undersized and are accessed heavily.

A high ratio (Ovf Read / ( Read + Write ) is an indication that there are one or more frequently used files that are poorly sized. It is important to locate these files and resize them. The D3 File Manager has a tool to scan a database for poorly sized files and, currently, they can be resized using the nt_resize utility from the VME (see the D3 Reference Manual). Determining that the ratio is high depends on the capability of the system. A 50% ratio would start to be problematic. Approaching 100% will likely degrade performance.

CacheMiss Represents the number of times per second a given page was not found in the mapped pages. Each cache miss does not necessarily trigger a disk I/O, because the missing page can still be in the Windows disk cache.