Index: storage/innobase/buf/buf0dblwr.cc =================================================================== --- storage/innobase/buf/buf0dblwr.cc (版本 3920) +++ storage/innobase/buf/buf0dblwr.cc (工作副本) @@ -46,6 +46,8 @@ #ifdef UNIV_PFS_MUTEX /* Key to register the mutex with performance schema */ UNIV_INTERN mysql_pfs_key_t buf_dblwr_mutex_key; + +UNIV_INTERN mysql_pfs_key_t buf_dblwr_s_mutex_key; #endif /* UNIV_PFS_RWLOCK */ /** The doublewrite buffer */ @@ -54,6 +56,8 @@ /** Set to TRUE when the doublewrite buffer is being created */ UNIV_INTERN ibool buf_dblwr_being_created = FALSE; +#define DBLWR_MUTEX_EXTEND + /****************************************************************//** Determines if a page number is located inside the doublewrite buffer. @return TRUE if the location is inside the two blocks of the @@ -130,6 +134,9 @@ mutex_create(buf_dblwr_mutex_key, &buf_dblwr->mutex, SYNC_DOUBLEWRITE); + + mutex_create(buf_dblwr_s_mutex_key, + &buf_dblwr->s_mutex, SYNC_DOUBLEWRITE); buf_dblwr->first_free = 0; buf_dblwr->s_reserved = 0; @@ -567,7 +574,8 @@ buf_dblwr->in_use = NULL; mutex_free(&buf_dblwr->mutex); - mem_free(buf_dblwr); + mutex_free(&buf_dblwr->s_mutex); + mem_free(buf_dblwr); buf_dblwr = NULL; } @@ -914,6 +922,8 @@ goto try_again; } + export_vars.innodb_dblwr_batch_flush++; + zip_size = buf_page_get_zip_size(bpage); if (zip_size) { @@ -1001,10 +1011,17 @@ } retry: - mutex_enter(&buf_dblwr->mutex); +#ifdef DBLWR_MUTEX_EXTEND + mutex_enter(&buf_dblwr->s_mutex); +#else + mutex_enter(&buf_dblwr->mutex); +#endif if (buf_dblwr->s_reserved == n_slots) { - +#ifdef DBLWR_MUTEX_EXTEND + mutex_exit(&buf_dblwr->s_mutex); +#else mutex_exit(&buf_dblwr->mutex); +#endif /* All slots are reserved. Since it involves two IOs during the processing a sleep of 10ms should be enough. */ @@ -1018,13 +1035,20 @@ break; } } + + export_vars.innodb_dblwr_single_flush++; + /* We are guaranteed to find a slot. */ ut_a(i < size); buf_dblwr->in_use[i] = TRUE; buf_dblwr->s_reserved++; buf_dblwr->buf_block_arr[i] = bpage; +#ifdef DBLWR_MUTEX_EXTEND + mutex_exit(&buf_dblwr->s_mutex); +#else mutex_exit(&buf_dblwr->mutex); +#endif /* Lets see if we are going to write in the first or second block of the doublewrite buffer. */ @@ -1077,9 +1101,13 @@ /* Sync the writes to the disk. */ buf_flush_sync_datafiles(); - mutex_enter(&buf_dblwr->mutex); - - buf_dblwr->s_reserved--; +#ifdef DBLWR_MUTEX_EXTEND + mutex_enter(&buf_dblwr->s_mutex); +#else + mutex_enter(&buf_dblwr->mutex); +#endif + + buf_dblwr->s_reserved--; buf_dblwr->buf_block_arr[i] = NULL; buf_dblwr->in_use[i] = FALSE; @@ -1087,7 +1115,10 @@ srv_stats.dblwr_pages_written.inc(); srv_stats.dblwr_writes.inc(); - mutex_exit(&(buf_dblwr->mutex)); - +#ifdef DBLWR_MUTEX_EXTEND + mutex_exit(&buf_dblwr->s_mutex); +#else + mutex_exit(&buf_dblwr->mutex); +#endif } #endif /* !UNIV_HOTBACKUP */ Index: storage/innobase/handler/ha_innodb.cc =================================================================== --- storage/innobase/handler/ha_innodb.cc (版本 3920) +++ storage/innobase/handler/ha_innodb.cc (工作副本) @@ -639,6 +639,10 @@ {"purge_view_trx_id_age", (char*) &export_vars.innodb_purge_view_trx_id_age, SHOW_LONG}, #endif /* UNIV_DEBUG */ + {"dblwr_single_flush", + (char*) &export_vars.innodb_dblwr_single_flush, SHOW_LONGLONG}, + {"dblwr_batch_flush", + (char*) &export_vars.innodb_dblwr_batch_flush, SHOW_LONGLONG}, {NullS, NullS, SHOW_LONG} }; Index: storage/innobase/include/srv0srv.h =================================================================== --- storage/innobase/include/srv0srv.h (版本 3920) +++ storage/innobase/include/srv0srv.h (工作副本) @@ -848,6 +848,8 @@ ulint innodb_purge_view_trx_id_age; /*!< rw_max_trx_id - purged view's min trx_id */ #endif /* UNIV_DEBUG */ + long long innodb_dblwr_batch_flush; + long long innodb_dblwr_single_flush; }; /** Thread slot in the thread table. */ Index: storage/innobase/include/buf0dblwr.h =================================================================== --- storage/innobase/include/buf0dblwr.h (版本 3920) +++ storage/innobase/include/buf0dblwr.h (工作副本) @@ -115,7 +115,8 @@ struct buf_dblwr_t{ ib_mutex_t mutex; /*!< mutex protecting the first_free field and write_buf */ - ulint block1; /*!< the page number of the first + ib_mutex_t s_mutex; + ulint block1; /*!< the page number of the first doublewrite block (64 pages) */ ulint block2; /*!< page number of the second block */ ulint first_free; /*!< first free position in write_buf measured