diff options
author | Michael Cahill <michael.cahill@mongodb.com> | 2014-12-31 11:51:39 +1100 |
---|---|---|
committer | Michael Cahill <michael.cahill@mongodb.com> | 2014-12-31 11:51:39 +1100 |
commit | a013404d35734e10d84e8a7c939597913714aaf5 (patch) | |
tree | 90b9463638698ee97d4d66795bed7f46d1e3fdec /src | |
parent | 730d560b5a220093f4c829b007af7a25bc0b3bf4 (diff) | |
parent | 7d8c7ef5a3b62b6f3496dbd1c6f4ffe467a38db6 (diff) | |
download | mongo-a013404d35734e10d84e8a7c939597913714aaf5.tar.gz |
Merge pull request #1501 from wiredtiger/page-yield
Page yield
Diffstat (limited to 'src')
-rw-r--r-- | src/btree/bt_page.c | 32 | ||||
-rw-r--r-- | src/include/stat.h | 5 | ||||
-rw-r--r-- | src/include/wiredtiger.in | 52 | ||||
-rw-r--r-- | src/support/stat.c | 15 |
4 files changed, 77 insertions, 27 deletions
diff --git a/src/btree/bt_page.c b/src/btree/bt_page.c index 799f0cca3ee..db1ccdabc4f 100644 --- a/src/btree/bt_page.c +++ b/src/btree/bt_page.c @@ -67,9 +67,10 @@ __wt_page_in_func(WT_SESSION_IMPL *session, WT_REF *ref, uint32_t flags { WT_DECL_RET; WT_PAGE *page; + u_int sleep_cnt, wait_cnt; int busy, force_attempts, oldgen; - for (force_attempts = oldgen = 0;;) { + for (force_attempts = oldgen = 0, wait_cnt = 0;;) { switch (ref->state) { case WT_REF_DISK: case WT_REF_DELETED: @@ -88,11 +89,14 @@ __wt_page_in_func(WT_SESSION_IMPL *session, WT_REF *ref, uint32_t flags case WT_REF_READING: if (LF_ISSET(WT_READ_CACHE)) return (WT_NOTFOUND); - /* FALLTHROUGH */ + if (LF_ISSET(WT_READ_NO_WAIT)) + return (WT_NOTFOUND); + WT_STAT_FAST_CONN_INCR(session, page_read_blocked); + break; case WT_REF_LOCKED: if (LF_ISSET(WT_READ_NO_WAIT)) return (WT_NOTFOUND); - /* The page is busy -- wait. */ + WT_STAT_FAST_CONN_INCR(session, page_locked_blocked); break; case WT_REF_SPLIT: return (WT_RESTART); @@ -109,8 +113,11 @@ __wt_page_in_func(WT_SESSION_IMPL *session, WT_REF *ref, uint32_t flags #else WT_RET(__wt_hazard_set(session, ref, &busy)); #endif - if (busy) + if (busy) { + WT_STAT_FAST_CONN_INCR( + session, page_busy_blocked); break; + } page = ref->page; WT_ASSERT(session, page != NULL); @@ -121,6 +128,8 @@ __wt_page_in_func(WT_SESSION_IMPL *session, WT_REF *ref, uint32_t flags __evict_force_check(session, page)) { ++force_attempts; WT_RET(__wt_page_release(session, ref, flags)); + WT_STAT_FAST_CONN_INCR( + session, page_forcible_evict_blocked); break; } @@ -148,8 +157,19 @@ __wt_page_in_func(WT_SESSION_IMPL *session, WT_REF *ref, uint32_t flags WT_ILLEGAL_VALUE(session); } - /* We failed to get the page -- yield before retrying. */ - __wt_yield(); + /* + * We failed to get the page -- yield before retrying, and if + * we've yielded enough times, start sleeping so we don't burn + * CPU to no purpose. + */ + if (++wait_cnt < 1000) + __wt_yield(); + else { + sleep_cnt = WT_MIN(wait_cnt, 10000); + wait_cnt *= 2; + WT_STAT_FAST_CONN_INCRV(session, page_sleep, sleep_cnt); + __wt_sleep(0, sleep_cnt); + } } } diff --git a/src/include/stat.h b/src/include/stat.h index 20b7ff9c1d4..8bdc377ac44 100644 --- a/src/include/stat.h +++ b/src/include/stat.h @@ -236,6 +236,11 @@ struct __wt_connection_stats { WT_STATS memory_allocation; WT_STATS memory_free; WT_STATS memory_grow; + WT_STATS page_busy_blocked; + WT_STATS page_forcible_evict_blocked; + WT_STATS page_locked_blocked; + WT_STATS page_read_blocked; + WT_STATS page_sleep; WT_STATS read_io; WT_STATS rec_pages; WT_STATS rec_pages_eviction; diff --git a/src/include/wiredtiger.in b/src/include/wiredtiger.in index 075514e02b4..f79938bb0db 100644 --- a/src/include/wiredtiger.in +++ b/src/include/wiredtiger.in @@ -3300,48 +3300,58 @@ extern int wiredtiger_extension_terminate(WT_CONNECTION *connection); #define WT_STAT_CONN_MEMORY_FREE 1103 /*! connection: memory re-allocations */ #define WT_STAT_CONN_MEMORY_GROW 1104 +/*! thread-yield: page acquire busy blocked */ +#define WT_STAT_CONN_PAGE_BUSY_BLOCKED 1105 +/*! thread-yield: page acquire eviction blocked */ +#define WT_STAT_CONN_PAGE_FORCIBLE_EVICT_BLOCKED 1106 +/*! thread-yield: page acquire locked blocked */ +#define WT_STAT_CONN_PAGE_LOCKED_BLOCKED 1107 +/*! thread-yield: page acquire read blocked */ +#define WT_STAT_CONN_PAGE_READ_BLOCKED 1108 +/*! thread-yield: page acquire time sleeping (usecs) */ +#define WT_STAT_CONN_PAGE_SLEEP 1109 /*! connection: total read I/Os */ -#define WT_STAT_CONN_READ_IO 1105 +#define WT_STAT_CONN_READ_IO 1110 /*! reconciliation: page reconciliation calls */ -#define WT_STAT_CONN_REC_PAGES 1106 +#define WT_STAT_CONN_REC_PAGES 1111 /*! reconciliation: page reconciliation calls for eviction */ -#define WT_STAT_CONN_REC_PAGES_EVICTION 1107 +#define WT_STAT_CONN_REC_PAGES_EVICTION 1112 /*! reconciliation: split bytes currently awaiting free */ -#define WT_STAT_CONN_REC_SPLIT_STASHED_BYTES 1108 +#define WT_STAT_CONN_REC_SPLIT_STASHED_BYTES 1113 /*! reconciliation: split objects currently awaiting free */ -#define WT_STAT_CONN_REC_SPLIT_STASHED_OBJECTS 1109 +#define WT_STAT_CONN_REC_SPLIT_STASHED_OBJECTS 1114 /*! connection: pthread mutex shared lock read-lock calls */ -#define WT_STAT_CONN_RWLOCK_READ 1110 +#define WT_STAT_CONN_RWLOCK_READ 1115 /*! connection: pthread mutex shared lock write-lock calls */ -#define WT_STAT_CONN_RWLOCK_WRITE 1111 +#define WT_STAT_CONN_RWLOCK_WRITE 1116 /*! session: open cursor count */ -#define WT_STAT_CONN_SESSION_CURSOR_OPEN 1112 +#define WT_STAT_CONN_SESSION_CURSOR_OPEN 1117 /*! session: open session count */ -#define WT_STAT_CONN_SESSION_OPEN 1113 +#define WT_STAT_CONN_SESSION_OPEN 1118 /*! transaction: transaction begins */ -#define WT_STAT_CONN_TXN_BEGIN 1114 +#define WT_STAT_CONN_TXN_BEGIN 1119 /*! transaction: transaction checkpoints */ -#define WT_STAT_CONN_TXN_CHECKPOINT 1115 +#define WT_STAT_CONN_TXN_CHECKPOINT 1120 /*! transaction: transaction checkpoint currently running */ -#define WT_STAT_CONN_TXN_CHECKPOINT_RUNNING 1116 +#define WT_STAT_CONN_TXN_CHECKPOINT_RUNNING 1121 /*! transaction: transaction checkpoint max time (msecs) */ -#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_MAX 1117 +#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_MAX 1122 /*! transaction: transaction checkpoint min time (msecs) */ -#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_MIN 1118 +#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_MIN 1123 /*! transaction: transaction checkpoint most recent time (msecs) */ -#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_RECENT 1119 +#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_RECENT 1124 /*! transaction: transaction checkpoint total time (msecs) */ -#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_TOTAL 1120 +#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_TOTAL 1125 /*! transaction: transactions committed */ -#define WT_STAT_CONN_TXN_COMMIT 1121 +#define WT_STAT_CONN_TXN_COMMIT 1126 /*! transaction: transaction failures due to cache overflow */ -#define WT_STAT_CONN_TXN_FAIL_CACHE 1122 +#define WT_STAT_CONN_TXN_FAIL_CACHE 1127 /*! transaction: transaction range of IDs currently pinned */ -#define WT_STAT_CONN_TXN_PINNED_RANGE 1123 +#define WT_STAT_CONN_TXN_PINNED_RANGE 1128 /*! transaction: transactions rolled back */ -#define WT_STAT_CONN_TXN_ROLLBACK 1124 +#define WT_STAT_CONN_TXN_ROLLBACK 1129 /*! connection: total write I/Os */ -#define WT_STAT_CONN_WRITE_IO 1125 +#define WT_STAT_CONN_WRITE_IO 1130 /*! * @} diff --git a/src/support/stat.c b/src/support/stat.c index 265a2673d7c..c93168cd9a1 100644 --- a/src/support/stat.c +++ b/src/support/stat.c @@ -480,6 +480,16 @@ __wt_stat_init_connection_stats(WT_CONNECTION_STATS *stats) "reconciliation: split objects currently awaiting free"; stats->session_cursor_open.desc = "session: open cursor count"; stats->session_open.desc = "session: open session count"; + stats->page_busy_blocked.desc = + "thread-yield: page acquire busy blocked"; + stats->page_forcible_evict_blocked.desc = + "thread-yield: page acquire eviction blocked"; + stats->page_locked_blocked.desc = + "thread-yield: page acquire locked blocked"; + stats->page_read_blocked.desc = + "thread-yield: page acquire read blocked"; + stats->page_sleep.desc = + "thread-yield: page acquire time sleeping (usecs)"; stats->txn_begin.desc = "transaction: transaction begins"; stats->txn_checkpoint_running.desc = "transaction: transaction checkpoint currently running"; @@ -608,6 +618,11 @@ __wt_stat_refresh_connection_stats(void *stats_arg) stats->lsm_work_queue_max.v = 0; stats->rec_pages.v = 0; stats->rec_pages_eviction.v = 0; + stats->page_busy_blocked.v = 0; + stats->page_forcible_evict_blocked.v = 0; + stats->page_locked_blocked.v = 0; + stats->page_read_blocked.v = 0; + stats->page_sleep.v = 0; stats->txn_begin.v = 0; stats->txn_checkpoint.v = 0; stats->txn_fail_cache.v = 0; |