MB-21650: Prevent false sharing of frequently modified memory stats 51/69951/8
authorDave Rigby <daver@couchbase.com>
Wed, 16 Nov 2016 17:59:55 +0000 (17:59 +0000)
committerDave Rigby <daver@couchbase.com>
Fri, 18 Nov 2016 13:14:37 +0000 (13:14 +0000)
commit8bf142736895169aeaa67936df02fffde61b76c9
treef55cfcee84986b4af14c1f9769b9ab77b4646ca2
parent637ecccdfd484d768bd52fa21af43fd03d462255
MB-21650: Prevent false sharing of frequently modified memory stats

We record the memory usage, memory overhead and number of Items per
bucket, in the EPStats object. These stats are very frequenly updated
(on every memory allocation/deallocation, and every Item
creation/destruction), and they are updated from all threads. This can
cause false sharing between these values if they co-exist in the same
cache line.

A recent change (66882e8 - MB-20852 [17/N]: Serialize VB state
changes) added a new element to EPStats which resulted in the layout
of that class changing such that memory stat variables (memOverhead,
numItem, totalMemory) ended up on the same cache line. This resulted
in a signficant regression (1.9M op/s -> 1.4M ops) in the performance
of the 'kv_max_ops_reads_512_avg_ops_hera_kv' test, due to false
sharing between these variables.

To address this, ensure that each variable is placed on its own cache
line to prevent false sharing, by using the CachelinePadded template
class.

Change-Id: I8316637a7a0c6fd05fd6f6ba24a1df44c43390c5
Reviewed-on: http://review.couchbase.org/69951
Reviewed-by: Trond Norbye <trond.norbye@gmail.com>
Tested-by: buildbot <build@couchbase.com>
12 files changed:
src/checkpoint.cc
src/checkpoint.h
src/ep.cc
src/ep_engine.cc
src/ep_engine.h
src/objectregistry.cc
src/stats.h
src/stored-value.cc
src/tapconnection.cc
src/tapconnection.h
src/vbucket.cc
src/vbucket.h