summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichael Cahill <michael.cahill@mongodb.com>2014-12-31 11:51:39 +1100
committerMichael Cahill <michael.cahill@mongodb.com>2014-12-31 11:51:39 +1100
commita013404d35734e10d84e8a7c939597913714aaf5 (patch)
tree90b9463638698ee97d4d66795bed7f46d1e3fdec /src
parent730d560b5a220093f4c829b007af7a25bc0b3bf4 (diff)
parent7d8c7ef5a3b62b6f3496dbd1c6f4ffe467a38db6 (diff)
downloadmongo-a013404d35734e10d84e8a7c939597913714aaf5.tar.gz
Merge pull request #1501 from wiredtiger/page-yield
Page yield
Diffstat (limited to 'src')
-rw-r--r--src/btree/bt_page.c32
-rw-r--r--src/include/stat.h5
-rw-r--r--src/include/wiredtiger.in52
-rw-r--r--src/support/stat.c15
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;