Details
-
Improvement
-
Status: Resolved
-
Major
-
Resolution: Fixed
-
1.2.3
-
None
-
Reviewed
-
Description
As titled, on our production environment we observed 98 out of 128 handlers get stuck waiting for the CountDownLatch seqNumAssignedLatch inside WALKey#getWriteEntry under a high writing workload.
After digging into the problem, we found that the problem is mainly caused by advancing mvcc in the append logic. Below is some detailed analysis:
Under current branch-1 code logic, all batch puts will call WALKey#getWriteEntry after appending edit to WAL, and seqNumAssignedLatch is only released when the relative append call is handled by RingBufferEventHandler (see FSWALEntry#stampRegionSequenceId). Because currently we're using a single event handler for the ringbuffer, the append calls are handled one by one (actually lot's of our current logic depending on this sequential dealing logic), and this becomes a bottleneck under high writing workload.
The worst part is that by default we only use one WAL per RS, so appends on all regions are dealt with in sequential, which causes contention among different regions...
To fix this, we could also take use of the "sequential appends" mechanism, that we could grab the WriteEntry before publishing append onto ringbuffer and use it as sequence id, only that we need to add a lock to make "grab WriteEntry" and "append edit" a transaction. This will still cause contention inside a region but could avoid contention between different regions. This solution is already verified in our online environment and proved to be effective.
Notice that for master (2.0) branch since we already change the write pipeline to sync before writing memstore (HBASE-15158), this issue only exists for the ASYNC_WAL writes scenario.
Attachments
Attachments
Issue Links
- breaks
-
HBASE-17471 Region Seqid will be out of order in WAL if using mvccPreAssign
- Resolved
- is related to
-
HBASE-17509 Remove the mvcc preassign lock and take usage of MVCC internal lock instead
- Resolved
- relates to
-
HBASE-17482 mvcc mechanism fails when using mvccPreAssign
- Resolved
-
HBASE-16873 WAL: SequenceId assign with less friction
- Open
-
HBASE-17507 Add document for the mvcc preassign feature introduced in HBASE-16698
- Open