[BDB TDS] Very bad concurrent write performance due to too many deadlocks
600261Jul 17 2009 — edited Jul 28 2009Hi, all,
I put some 1K key-value pairs(1M) into two btree database with multiple threads(10 threads) concurrently, But, I got too many deadlocks, the write performance is very very poor even I can not put this into to production!
Db::put: DB_LOCK_DEADLOCK: Locker killed to resolve a deadlock
Db::put: DB_LOCK_DEADLOCK: Locker killed to resolve a deadlock
Db::put: DB_LOCK_DEADLOCK: Locker killed to resolve a deadlock
Db::put: DB_LOCK_DEADLOCK: Locker killed to resolve a deadlock
...
here is the thread worker logic:
txn->start
DB_A->put(key,value) // main db
DB_B->put(value, key) // index db
txn->commit
my environment:
db 4.7.25, BDB TDS, C++ API, Btree Access Method, Duplicated value, page size: 4K.
run deadlock detecting every 100 msec in a separate thread.
By running "db_stats -Co", I see the detail lock table:
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Lock REGINFO information:
Lock Region type
5 Region ID
__db.005 Region name
0x19a2c000 Original region address
0x19a2c000 Region address
0x19a2c0c0 Region primary address
0 Region maximum allocation
0 Region allocated
Region allocations: 300009 allocations, 0 failures, 0 frees, 1 longest
REGION_JOIN_OK Region flags
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Locks grouped by object:
Locker Mode Count Status ----------------- Object ---------------
80001209 WRITE 1 HELD 01234567890123456789>Quer page 524
5 READ 1 HELD 01234567890123456789>Quer handle 4
80001201 WRITE 1 HELD 01234567890123456789>Quer page 7
800011fd WRITE 1 WAIT 01234567890123456789>Quer page 7
800011fe READ 1 WAIT 01234567890123456789>Quer page 7
80001204 READ 1 WAIT 01234567890123456789>Quer page 7
80001205 WRITE 1 WAIT 01234567890123456789>Quer page 7
800011fc READ 1 WAIT 01234567890123456789>Quer page 7
80001200 READ 1 WAIT 01234567890123456789>Quer page 7
80001209 READ 1 WAIT 01234567890123456789>Quer page 7
80001208 WRITE 1 WAIT 01234567890123456789>Quer page 7
80001207 READ 1 WAIT 01234567890123456789>Quer page 7
9 READ 1 HELD 01234567890123456789>Quer handle 6
80001209 WRITE 1 HELD 01234567890123456789>Quer page 0
80001201 WRITE 1 WAIT 01234567890123456789>Quer page 0
1 READ 1 HELD 01234567890123456789>Quer handle 0
9 READ 2 HELD 01234567890123456789>Quer handle 0
1 READ 1 HELD 01234567890123456789>Quer handle 2
80001205 WRITE 1 HELD 01234567890123456789>Quer page 197
80001209 WRITE 2 HELD 01234567890123456789>Quer page 136
800011fd WRITE 1 HELD 01234567890123456789>Quer page 128
80001208 WRITE 1 HELD 01234567890123456789>Quer page 158
80001209 WRITE 1 HELD 01234567890123456789>Quer page 269
80001207 WRITE 1 HELD 01234567890123456789>Quer page 282
80001201 WRITE 1 HELD 01234567890123456789>Quer page 475
80001200 WRITE 1 HELD 01234567890123456789>Quer page 465
80001204 WRITE 1 HELD 01234567890123456789>Quer page 483
800011fc WRITE 1 HELD 01234567890123456789>Quer page 404
80001209 WRITE 1 HELD 01234567890123456789>Quer page 420
800011fe WRITE 1 HELD 01234567890123456789>Quer page 432
When I run it by single thread, it works well with a good write performance. The test case has not read operations.
Any advice is appreciated.
Steve