-
Notifications
You must be signed in to change notification settings - Fork 37.7k
Closed
Description
getblock
is slow on verbosity, it's happened because LOCK(cs_main)
applied for whole function including JSON generation
bitcoin/src/rpc/blockchain.cpp
Line 810 in ef70f9b
LOCK(cs_main); |
I added few lines which print spent time:
LOCK(cs_main);
auto t1 = std::chrono::high_resolution_clock::now();
...
auto t2 = std::chrono::high_resolution_clock::now();
auto ret = blockToJSON(block, pblockindex, verbosity >= 2);
auto t3 = std::chrono::high_resolution_clock::now();
std::cout << "blockToJSON " << pblockindex->nHeight << ": " << std::chrono::duration_cast<std::chrono::microseconds>(t2 - t1).count() << " " << std::chrono::duration_cast<std::chrono::microseconds>(t3 - t1).count() << std::endl;
return ret;
and numbers looks like:
blockToJSON 570019: 14727 201870
blockToJSON 570022: 16049 225224
blockToJSON 570021: 33776 217398
blockToJSON 570020: 21754 191669
blockToJSON 570023: 30949 236941
blockToJSON 570025: 23346 223673
blockToJSON 570024: 18732 203002
blockToJSON 570026: 17467 216213
blockToJSON 570027: 16658 217395
blockToJSON 570028: 19015 219183
i.e. everything before JSON generation takes 15-30ms, while JSON takes minimum 190ms and lock cs_main
for all this time. As result it's possible extract only ~5 blocks per second.
Looking on the code I think it's possible copy data from CBlockIndex
to extra structure, so in this case cs_main
can be unlocked right after GetBlockChecked
.
bitcoin/src/rpc/blockchain.cpp
Line 828 in ef70f9b
const CBlock block = GetBlockChecked(pblockindex); |
As result
getblock
in verbosity mode should be much faster (in case if -rpcthreads
will be adjusted too).
Does this make sense?