See my comments in the text:
Robert Eskridge wrote: > (20 days later -- occurrences aren't that common) > > Jared, > > Ok, I've re-RTFM'd the Concepts manual and have dog eared Steve's book > unbelievably. I've used the event 10046 traces while the blocking > lock event was going on. The curious thing is that I'm not seeing any > buffer busy waits. The blocked process sits there and cranks out an > equeue wait trace every 3 seconds and does not report a file, block > or row that it is waiting on. If I'm reading Steve's book correctly, > I should see file and block but no row if it's an initrans problem, so > that's out. > I am assuming that the mode for the TX enqueue is 4. Right ? > > In Katz's article in the Feb 2002 elementK Journal he says that if all > three are 0 then it's a problem with free space in the block and maybe > pctfree is low. The table I'm inserting into has 2k blocks and > PCTFREE=30. The insert is only populating 7 of the 185 columns, > that's 6 varchar2's and a date. There should be plenty of room, > unless as you pointed out that the problem was really not in this > table -- possibly in the indexes. This guy does have 15 indexes (all > single column, all PCTFREE=10). A curious thing is that when I look > at the blocker, he shows that he's blocking on 2 tables, this one that > he has a transaction open on, and a journaling table that triggers off > the first insert into -- but his rows are only 70 bytes and he has > PCTFREE=10 also. > Are the indexes UNIQUE ? If yes, what is the chance of people inserting into with the same value ? Are the indexes BITMAP ? > > So I've got 17 suspects, all with plausible alibis. And I haven't > figured out how to get the enqueue wait to squeal on any of them. If > I'm understanding the file=0 block=0 row=0 properly, he tried, he > couldn't get a block so he waits 3 seconds and tries again > indefinately. But when one of these happens, I see a rash of them so > something's causing it. > Forget about the file, block, row values. They don't mean a thing if you are not waiting on TX mode 6. > > I keep returning to free lists. This is an evolved application (he > says euphemistically) and it's had a freelist=1 on everything since it > slithered out of the slime. Now it's running on a 4 cpu sparc. I'm > wondering if the free list is just getting overran and if bumping it > to the sometimes advised cpu*2 could clear the problem. I have > lingering doubts because I haven't found anything that specifically > says what I should be seeing when that happens. > The only freelist problem that you could have is transaction freelists. But you are doing inserts so that is not the case here. > > So I guess I should try to make this into a question.... hmmn... > > Am I barking up the wrong tree? > The right tree, but the tree doesn't understand barking ;-) Anjo. > > -rje > > > From: [EMAIL PROTECTED] <[EMAIL PROTECTED]> > > To: [EMAIL PROTECTED] <[EMAIL PROTECTED]> > > Date: Tuesday, February 05, 2002, 10:36:27 AM > > Subject: testing freelists > > > > ===8<==============Original message text=============== > > Robert, > > > > Simulating the problem and proving the correction is an excellent idea. > > > > One thing to consider when putting together your testing scenario is > > that writes to the database block by a transaction are done in memory, > > that is they are made to the cached database blocks. > > > > An internal locking mechanism ( a latch ) is used to control access to > > the cache, and it is normally held for only a short time. > > > > The data may be written to the disk before a commit, and it may not > > be written to disk until after a commit. ( referring to datafiles only > > here, not the redo log ). > > > > The 60 second sleep in your script is only simulating user think time, > > it's not actually blocking anything. You will need to similate several > > session simultaneously inserting, and you will need to know if the > > contention > > is in the table or in an index: I'm guessing it's an index or indexes. > > > > Some time spent with the Concepts manual would help you out here. > > > > Here's an excerpt from the section on database writer: > > > > Database Writer (DBWn) > > > > The database writer writes modified blocks from the database buffer > > cache to the datafiles. Although one database writer process (DBW0) > > is sufficient for most systems, you can configure additional processes > > (DBW1 through DBW9) to improve write performance for a system that > > modifies data heavily. The initialization parameter DB_WRITER_PROCESSES > > specifies the number of DBWn processes. > > > > Since Oracle uses write-ahead logging, DBWn does not need to write > > blocks when a transaction commits. Instead, DBWn is designed to perform > > batched > > writes with high efficiency. In the most common case, DBWn writes only > > when more > > data needs to be read into the system global area and too few database > > buffers are free. The least recently used data is written to the datafiles > > first. DBWn > > also performs writes for other functions such as checkpointing. > > > > Take a look at Chapter 15 on Transactions as well. > > > > Also check out Steve Adams' web site, www.ixora.com.au. Lots of > > interesting stuff > > there if you want to learn about the internals. Here's an excerpt from > > the section > > on Free lists: > > > > As mentioned previously, free list contention occurs when multiple > > processes using the same free list attempt to modify the data block on the > > head of the free list concurrently. It is shown in V$WAITSTAT against the data >block class. V$WAITSTAT can also show contention for the segment header and free list >blocks. This occurs where multiple transaction in the same free list > > group need to update their free list header records simultaneously. There > > are various ways of addressing these problems such as rebuilding the table > > with more free list groups, or increasing _bump_highwater_mark_count, or the novel >idea of fixing the application. > > To drill down on which segments are causing data block contention, I suggested >using event 10046, level 8. This creates a trace > > file much like to one produced by the sql_trace facility, except that for each >event wait a line is printed to the trace > > file. In particular, each buffer busy wait is recorded together with the > > P1 and P2 values which are the data file and block number of the wait. So > > to find which blocks a process has been waiting on, you just grep the trace file >for buffer busy waits lines and produce a histogram of the file and block numbers >most commonly > > waited for. Once you have suspect file and block numbers, you can relate > > them to a segment by querying DBA_EXTENTS. In the case of free list > > contention on a table it is common to have several hot blocks just below > > the high water mark for the segment. > > > > If you really want to learn the internals, his book is excellent for that. > > It's not normally necessary > > IMO to delve that deep into the internals to deal with tuning problems, at > > least in my experience. > > > > It will certainly help you develop insight and intuition as to what is > > going on with your database though. > > > > HTH > > > > Jared > > > > > > > > > > > > > > Robert Eskridge <[EMAIL PROTECTED]> > > Sent by: [EMAIL PROTECTED] > > 02/04/02 08:15 PM > > Please respond to ORACLE-L > > > > > > To: Multiple recipients of list ORACLE-L <[EMAIL PROTECTED]> > > cc: > > Subject: testing freelists > > > > > > I've got a database that I'm experiencing blocking locks on insert > > statements into the largest, most active transaction table. The > > freelists currently=1 and it's on a 4 CPU Sparc under 8.0.5 in a 24/7 > > environment. > > > > I think this points to freelists needing to be increased. The "powers > > that be" want a guarantee before they give me a maintenance window so I > > can go through the rebuild on this table to change the freelists. > > (We've got an 8.1.7 conversion project going but this can't wait.) > > > > So I'm trying to put together a test set to prove that the freelist > > increase will help. What I've been trying has two parts. A simple > > sql script like: > > > > $cat blocktest.sql > > insert into block_test values > > ('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx > > xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx > > xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx > > xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx > > xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'); > > host sleep 60 > > commit; > > exit; > > > > And a shell script to run it. > > > > $ cat block.sh > > itr=1 > > echo $itr > > while : > > do > > sqlplus me/mypasswd@sid @blocktest & > > itr=`expr $itr + 1 ` > > echo $itr > > if [ $itr -eq $1 ] > > then > > break > > fi > > done > > > > I've run starting up to the max processes allowed by the database, and > > still don't get the blocking lock on the database. If I can't get > > blocking locks to appear in a test situation, then I can't prove that > > increasing the freelists helps the situation. > > > > Any suggestions? > > > > -rje > > > > > > -- > > -- > Please see the official ORACLE-L FAQ: http://www.orafaq.com > -- > Author: Robert Eskridge > INET: [EMAIL PROTECTED] > > Fat City Network Services -- (858) 538-5051 FAX: (858) 538-5051 > San Diego, California -- Public Internet access / Mailing Lists > -------------------------------------------------------------------- > To REMOVE yourself from this mailing list, send an E-Mail message > to: [EMAIL PROTECTED] (note EXACT spelling of 'ListGuru') and in > the message BODY, include a line containing: UNSUB ORACLE-L > (or the name of mailing list you want to be removed from). You may > also send the HELP command for other information (like subscribing). -- Please see the official ORACLE-L FAQ: http://www.orafaq.com -- Author: Anjo Kolk INET: [EMAIL PROTECTED] Fat City Network Services -- (858) 538-5051 FAX: (858) 538-5051 San Diego, California -- Public Internet access / Mailing Lists -------------------------------------------------------------------- To REMOVE yourself from this mailing list, send an E-Mail message to: [EMAIL PROTECTED] (note EXACT spelling of 'ListGuru') and in the message BODY, include a line containing: UNSUB ORACLE-L (or the name of mailing list you want to be removed from). You may also send the HELP command for other information (like subscribing).