Skip to content

getblock performance issue on verbosity #15925

@fanatid

Description

@fanatid

getblock is slow on verbosity, it's happened because LOCK(cs_main) applied for whole function including JSON generation

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.

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?

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions