Re: LWLock statistics collector (was: CSStorm occurred again by postgreSQL8.2) - Mailing list pgsql-hackers
From | Katsuhiko Okano |
---|---|
Subject | Re: LWLock statistics collector (was: CSStorm occurred again by postgreSQL8.2) |
Date | |
Msg-id | 200607311800.BHI65621.LBUBLIuVOPPJLTP@oss.ntt.co.jp Whole thread Raw |
In response to | Re: LWLock statistics collector (was: CSStorm occurred again by postgreSQL8.2) (Katsuhiko Okano <okano.katsuhiko@oss.ntt.co.jp>) |
Responses |
Re: LWLock statistics collector (was: CSStorm occurred again by postgreSQL8.2)
|
List | pgsql-hackers |
Katsuhiko Okano wrote: > Since the cause was found and the provisional patch was made > and solved about the CSStorm problem in previous mails, it reports. (snip) > (A) The algorithm which replaces a buffer is bad. > A time stamp does not become new until swapout completes > the swapout page. > If access is during swap at other pages, the swapout page will be > in the state where it is not used most, > It is again chosen as the page for swapout. > (When work load is high) The following is the patch. diff -cpr postgresql-8.1.4-orig/src/backend/access/transam/slru.c postgresql-8.1.4-SlruSelectLRUPage-fix/src/backend/access/transam/slru.c *** postgresql-8.1.4-orig/src/backend/access/transam/slru.c 2006-01-21 13:38:27.000000000 +0900 --- postgresql-8.1.4-SlruSelectLRUPage-fix/src/backend/access/transam/slru.c 2006-07-25 18:02:49.000000000 +0900 *************** SlruSelectLRUPage(SlruCtl ctl, int pagen *** 703,710 **** for (;;) { int slotno; ! int bestslot = 0; unsigned int bestcount = 0; /* See if page already has a buffer assigned */ for (slotno = 0; slotno < NUM_SLRU_BUFFERS; slotno++) --- 703,712 ---- for (;;) { int slotno; ! int bestslot = -1; ! int betterslot = -1; unsigned int bestcount = 0; + unsigned int bettercount = 0; /* See if page already has a buffer assigned */ for (slotno = 0; slotno < NUM_SLRU_BUFFERS; slotno++) *************** SlruSelectLRUPage(SlruCtl ctl, int pagen *** 720,732 **** */ for (slotno = 0; slotno < NUM_SLRU_BUFFERS; slotno++) { ! if (shared->page_status[slotno] == SLRU_PAGE_EMPTY) ! return slotno; ! if (shared->page_lru_count[slotno] > bestcount && ! shared->page_number[slotno] != shared->latest_page_number) ! { ! bestslot = slotno; ! bestcount = shared->page_lru_count[slotno]; } } --- 722,746 ---- */ for (slotno = 0; slotno < NUM_SLRU_BUFFERS; slotno++) { ! switch (shared->page_status[slotno]) ! { ! case SLRU_PAGE_EMPTY: ! return slotno; ! case SLRU_PAGE_READ_IN_PROGRESS: ! case SLRU_PAGE_WRITE_IN_PROGRESS: ! if (shared->page_lru_count[slotno] > bettercount && ! shared->page_number[slotno] != shared->latest_page_number) ! { ! betterslot = slotno; ! bettercount = shared->page_lru_count[slotno]; ! } ! default: /* SLRU_PAGE_CLEAN,SLRU_PAGE_DIRTY */ ! if (shared->page_lru_count[slotno] > bestcount && ! shared->page_number[slotno] != shared->latest_page_number) ! { ! bestslot = slotno; ! bestcount = shared->page_lru_count[slotno]; ! } } } *************** SlruSelectLRUPage(SlruCtl ctl, int pagen *** 736,741 **** --- 750,758 ---- if (shared->page_status[bestslot] == SLRU_PAGE_CLEAN) return bestslot; + if (bestslot == -1) + bestslot = betterslot; + /* * We need to do I/O. Normal case is that we have to write it out, * but it's possible in the worst case to have selected a read-busy Regards, -------- Katsuhiko Okano okano katsuhiko _at_ oss ntt co jp
pgsql-hackers by date: