Я запускаю модульные тесты против биткойнов, которые выполняют запросы JSON-RPC с высокой скоростью. Случайные сбои — это проблема. Например, если у вас есть что-то подобное в журналах printconsole:
ThreadRPCServer method=gettransaction
ThreadRPCServer method=gettransaction
ThreadRPCServer method=gettransaction
ThreadRPCServer method=gettransaction
....
ThreadRPCServer method=gettransaction
ThreadRPCServer method=gettransaction
sending: inv (37 bytes)
ThreadRPCServer method=gettransaction
ThreadRPCServer method=listtransactions
sending: inv (37 bytes)
Вы начинаете получать:
synced with network?".format(name)) from e
cryptoassets.core.backend.bitcoind.BitcoindJSONError: Got timeout when doing bitcoin RPC call listtransactions.
Я пробовал как повторно использовать HTTP-соединение, так и не использовать повторно HTTP-соединение с различными результатами.
Есть ли какие-нибудь простые способы сделать bitcoind
интерфейс RPC более стабильным (увеличение количества потоков, параллелизма и т. д.)?
Я использую следующую реализацию Python JSON-RPC:
https://github.com/jgarzik/python-bitcoinrpc/blob/master/bitcoinrpc/authproxy.py
ОБНОВЛЕНИЕ: похоже, проблемный вызов может быть listtransactions
. При одновременном вызове из командной строки curl
также нет ответа:
[~]% curl --user foo:bar --data-binary '{"id":"t0", "method": "listtransactions", "params": ["cryptoassets"] }' http://127.0.0.1:8332/ |python -m json.tool
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:--100 70 0 0 100 70 0 58
Я использовал BitcoinLib для выполнения 15 000 последовательных listtransactions
вызовов, и результат был таким:
0 timeouts
Fastest response: 0.1133479 sec
Slowest response: 0.6475277 sec
bitcoind
был запущен с параметрами по умолчанию и получал блоки во время теста.
Микко Отамаа
rpcthreads=64
кажется, решает проблему, но не объясняет, что происходит.