Subject: SMON - Temporary Segment Cleanup and Free Space Coalescing
Doc ID: Note:61997.1
Subject: SMON - Temporary Segment Cleanup and Free Space Coalescing
Type: BULLETIN
Status: PUBLISHED
Content Type: TEXT/PLAIN
Creation Date: 30-JUN-1998
Last Revision Date: 06-FEB-2003
SMON - Temporary Segment Cleanup and Free Space Coalescing in Oracle 7.3 and  

Higher

PURPOSE

~~~~~~~

Since the introduction of the unlimited extents feature in Oracle 7.3, it is

possible for SMON to have to either clean up a large number of temporary

extents, or to coalesce a large number of free extents. This can manifest

itself by SMON appearing to spin, consuming a high percentage of CPU for

long periods. This article explains what is happening, and what (if

anything) can be done.

The discussion concentrates mainly on non-TEMPORARY type tablespaces. There

is however a section at the end of the article which discusses possible

issues with tablespaces of type TEMPORARY.

SCOPE & APPLICATION

~~~~~~~~~~~~~~~~~~~

This article is intended to assist DBAs encountering SMON appearing to spin

and consume high percentages of CPU by providing an understanding of the

issues.

What to look for

~~~~~~~~~~~~~~~~

The most common indicator is the SMON process consuming large amounts

of CPU for a long period. UNIX O/S utilities sar or vmstat will show how busy

CPU(s) are; ps will show which process is using the CPU.

What is SMON doing

~~~~~~~~~~~~~~~~~~

Once you have identified that SMON is using lots of CPU, you need to

identify whether it is performing temporary segment (extent) cleanup, or

free space coalescing.

Free space coalescing

~~~~~~~~~~~~~~~~~~~~~

When does SMON coalesce?

o. SMON wakes itself every 5 minutes and checks for tablespaces with

default pctincrease != 0.

How to identify whether SMON is coalescing

o. Check whether there are a large number of free extents that might

be being coalesced by running the following query a few times:

SELECT COUNT(*) FROM DBA_FREE_SPACE;

If the count returned is dropping while SMON is working, it is

likely that SMON is coalescing free space.

What are the effects on the database?

o. Because SMON acquires the Space Transaction (ST) enqueue in

exclusive mode, other processes requiring the enqueue will be

blocked. This is typically manifested by multiple <oerr:ORA-1575>

errors.

o. SMON sits in a very tight loop while coalescing, and consumes close

to 100% CPU. If the system is CPU-bound, the run queue will increase

as other processes try to get onto CPU.

Can anything be done to stop SMON grabbing CPU?

o. If there is no CPU contention, and no processes being blocked because

of failure to acquire the ST enqueue, DO NOT DO ANYTHING. Leave SMON

to complete the coalescing.

THE DATABASE CAN BE SHUTDOWN CLEANLY WITH UN-COALESCED EXTENTS. If SMON

is performing the coalesce, a shutdown will NOT undo the work completed

so far.

o. Use the 'alter tablespace <tbs name> coalesce' command. This is quicker

than SMON, and the work is performed in in fewer space transactions, and

therefore makes fewer enqeueue acquisitions. HOWEVER, IF THE COMMAND IS

INTERRUPTED, ALL ITS COALESCING WORK WILL BE LOST.

o. It is possible to force a user session to coalesce free extents. See

[NOTE:35513.1] "Removing `stray` TEMPORARY Segments" for details. Again,

quicker than SMON. HOWEVER, IF THIS OPERATION IS INTERRUPTED, ALL IT'S

COALESCING WORK WILL BE LOST.

o. Offlining the tablespace/datafiles containing the extents to be

coalesced has NO effect.

Temporary segment cleanup

~~~~~~~~~~~~~~~~~~~~~~~~~

When does SMON cleanup temporary segments?

o. Typically a user process allocates a temporary segment (multiple

extents) and then dies before cleaning them up, or the user process

receives an error causing the statement to fail. SMON is posted to do

the cleanup. SMON also might get tied up cleaning uncommitted

transactions though, and be too busy to process requests to grow an

existing sort segment. Starting with Oracle 8i, playing around with

fast_start_parallel_rollback might workaround that.

In addition, actions like CREATE INDEX create a temporary segment for

the index, and only convert it to permanent once the index has been

created. Also, DROP <object> converts the segment to temporary and then

cleans up the temporary segment.

o. During normal operations, user processes that create temporary segments

are responsible for cleanup.

How to identify whether SMON is cleaning up temporary extents

o. Check whether there are a large number of temporary extents that might

be being cleaned up by running the following query a few times:

SELECT COUNT(*) FROM DBA_EXTENTS WHERE SEGMENT_TYPE='TEMPORARY';

If the count returned by the above query is dropping while SMON is

working, it is likely that SMON is performing temp segment cleanup.

See section 'Tablespaces of type TEMPORARY' for more details on

this.

What are the effects on the database?

o. Again, SMON will continually acquire and then release the ST enqueue

in exclusive mode. This can cause contention with other processes and

lead to <oerr:ORA-1575> errors.

o. CPU utilization is not exceptionally high. During tests, SMON

consumed between 10% and 20% CPU during cleanup, and so this operation

has less impact than coalescing, as far as SMON is concerned.

Furthermore, SMON performed the cleanup in 'chunks', cleaning up a

subset of the extents at a time.

Can anything be done to stop SMON grabbing CPU?

o. Not a great deal. As with coalescing, if there is no CPU contention,

and no processes being blocked because of failure to acquire the ST

enqueue, DO NOT DO ANYTHING. However because SMON does not work as hard

cleaning up temporary extents, it should not be a big issue.

Note: If you are using TEMPORARY type temporary tablespaces then

SMONs cleanup of the segment can be a problem as it will not

service sort segment requests while performing cleanup.

See below (TEMPORARY tablespaces) for more information.

It should be noted that a normal/immediate shutdown will not complete

until all temporary segments have been cleaned up. Shutdown will

'kick' SMON to complete cleanup.

o. Offlining the tablespace/datafiles in which the extents reside has NO

effect.

Avoidance

~~~~~~~~~

With a little forethought and care, the above situations can be avoided:

o. Do not create temporary tablespaces with small initial and next default

storage parameters. Also beware of unlimited maxextents on temporary

tablespaces.

Note, TEMPORARY type tablespaces set maxextents unlimited automatically.

Furthermore, the NEXT AND INITIAL extent sizes are determined from

the default NEXT size (default INITIAL is ignored). For more details on

temporary extent sizes, see [NOTE:50592.1] "Extent Sizes for Sort, Direct

Load and Parallel Operations (PCTAS & PDML)".

o. Use tablespaces of type TEMPORARY. Sort segments in these tablespaces

are not cleaned up. This reduces contention on the ST enqueue and also

reduces CPU usage by SMON **UNLESS** the database is shutdown and

restarted. If TEMPORARY type tablespaces are in use then SMON will

clean up its segments after startup following a shutdown. In this case

large numbers of extents can be a severe problem as SMON will not

service user "sort segment requests" until the cleanup is complete.

If the cleanup is to take a long time users will not be able to perform

sort operations.

In this scenario you can point users at a PERMANENT temporary tablespace

while SMON cleans up the TEMPORARY temporary tablespace. This is likely to

cause ST enqueue contention but will allow users sessions to sort on disk

when necessary rather then them just blocking.

Eg:

If SMON is busy cleaning up a TEMP segment containing a lot

of extents it cannot service 'sort segment requests' from other

sessions. Pointing the users at a PERMANENT tablespace as

their temporary tablespace can help keep the system running

until SMON is free again:

CREATE TABLESPACE NEWTEMP .... (your own specification here)

(DO NOT CREATE IT AS TYPE TEMPORARY)

Move the users over to this:

select username from dba_users

where temporary_tablespace='TEMP';

For each user in this list:

alter user XXXXX temporary tablespace NEWTEMP;

Once SMON has cleaned up the extents reset the storage clause

on each tablespace to sensible values and you can then point

users back at a TEMPORARY temp tablespace.

Starting with Oracle8i, rather than reverting back to a PERMANENT

tablespace if SMON is cleaning up an old sort segment at startup,

you can potentially drop and recreate the tempfiles of the existing

TEMPORARY tablespace. The cleanup should be faster anyway since by rule

a TEMPORARY tablespace made of tempfiles need to be LOCALLY MANAGED.

You can remove tempfiles from TEMPORARY tablespaces and keep the logical

structure empty.

o. Beware of creating large objects with inappropriate (small) extents. If

the creation of the object fails, SMON cleans up. Also, dropping such an

object will create a lot of cleanup work for the user process.

Oracle8 ONLY. Make use of the tablespace MINIMUM EXTENT size to help

minimise the risk of mistakes in scripts causing small extent sizes.

This parameter ensures that every used and/or free extent size in a

tablespace is at least as large as, and is a multiple of, this value.

Oracle8i ONLY: It is worth considering the use of a locally managed

temporary tablespace. This has the benefit of faster temporary segment

cleanup after the instance has been aborted.

Note, locally managed temporary tablespaces must be created using

tempfile(s). Any attempt to create a locally managed temporary

tablespace using a datafile will result in the error:

ORA-25144: invalid option for CREATE TABLESPACE with TEMPORARY contents

Tablespaces of type TEMPORARY

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

TEMPORARY-type tablespaces were introduced in Oracle 7.3 (see [NOTE:65973.1]

"Temporary Tablespace, the Sort Extent Pool, and OPS"). In summary:

o. The first disk sort (after instance startup) creates a sort segment in

the TEMPORARY tablespace.

o. Free extents in the sort segment are re-used as required by sessions.

o. The sort segment grows to a steady-state.

o. Sort extents are not de-allocated whilst the instance is running.

o. Permanent objects cannot be created in TEMPORARY tablespaces.

o. There is a maximum of one sort segment per TEMPORARY tablespace.

Thus, contention on the ST enqueue is reduced as user sessions are allocating

and de-allocating fewer extents. Even if a user session dies, SMON will not

de-allocate extents that the session was using for sorting.

SMON actually de-allocates the sort segment after the instance has been

started and the database has been opened. Thus, after the database has been

opened, SMON may be seen to consume large amounts of CPU as it first

de-allocates the (extents from the) temporary segment, and then when it is

requested to perform free space coalescing of the free extents created by

the temporary segment cleanup. Again, this behaviour will be exaggerated if

the TEMPORARY tablespace in which the sort segment resides has inappropriate

(small) default NEXT storage parameters (see 'Avoidance' above).

Permanent object cleanup

~~~~~~~~~~~~~~~~~~~~~~~~

If a permanent object is made up of many extents, and the object is to be

dropped, the user process dropping the object will consume large amounts

of CPU in the same way as SMON does when cleaning up a temporary segment.

Please see [NOTE:68836.1] "How To Efficiently Drop A Table With Many Extents"

for a discussion of this.

References

~~~~~~~~~~

[NOTE:1070504.6] How To Force Temporary Segment Cleanup In Oracle 8.x