2018-08-04 12:35:03 +02:00
|
|
|
from concurrent import futures
|
|
|
|
|
from fixtures import * # noqa: F401,F403
|
2026-01-07 09:58:11 +10:30
|
|
|
from pyln.client import RpcError
|
2018-08-04 12:35:03 +02:00
|
|
|
from tqdm import tqdm
|
2026-01-07 09:58:11 +10:30
|
|
|
from utils import (wait_for, TIMEOUT, only_one)
|
2018-08-04 12:35:03 +02:00
|
|
|
|
|
|
|
|
|
2025-11-20 12:07:16 +10:30
|
|
|
import os
|
2017-11-20 16:16:17 +01:00
|
|
|
import pytest
|
|
|
|
|
import random
|
2025-11-20 12:07:16 +10:30
|
|
|
import statistics
|
|
|
|
|
import threading
|
|
|
|
|
import time
|
2017-11-20 16:16:17 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
num_workers = 480
|
|
|
|
|
num_payments = 10000
|
|
|
|
|
|
|
|
|
|
|
2025-11-20 12:07:16 +10:30
|
|
|
def get_bench_node(node_factory, extra_options={}):
|
tests/benchmark.py: tune nodes a little.
Drop the log level, don't do extra memory checks, don't dump I/O. These are not
realistic for testing non-development nodes.
Here's the comparison, using:
VALGRIND=0 eatmydata uv run pytest -v --benchmark-compare=0001_baseline tests/benchmark.py
Name (time in us) Min Max Mean StdDev Median IQR Outliers OPS Rounds Iterations
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
test_invoice (NOW) 414.9430 (1.0) 39,115.6150 (12.35) 834.7296 (1.0) 2,274.1198 (6.59) 611.7745 (1.0) 162.0230 (1.0) 1;33 1,197.9927 (1.0) 290 1
test_invoice (0001_baselin) 951.9740 (2.29) 3,166.4061 (1.0) 1,366.7944 (1.64) 345.1460 (1.0) 1,328.6110 (2.17) 339.3517 (2.09) 48;15 731.6389 (0.61) 221 1
test_pay (NOW) 36,339.2329 (87.58) 69,477.8530 (21.94) 51,719.9459 (61.96) 8,033.4262 (23.28) 52,639.5601 (86.04) 9,590.1425 (59.19) 6;0 19.3349 (0.02) 17 1
test_pay (0001_baselin) 61,741.5591 (148.80) 108,801.6961 (34.36) 88,284.6752 (105.76) 15,875.4417 (46.00) 96,006.0760 (156.93) 27,500.9771 (169.74) 6;0 11.3270 (0.01) 13 1
test_single_payment (NOW) 46,721.4010 (112.60) 66,027.6250 (20.85) 56,699.4597 (67.93) 5,829.7234 (16.89) 54,659.9385 (89.35) 9,810.9820 (60.55) 6;0 17.6369 (0.01) 14 1
test_single_payment (0001_baselin) 52,215.3670 (125.84) 109,608.0400 (34.62) 74,521.8032 (89.28) 16,175.6833 (46.87) 72,881.5976 (119.13) 17,668.8581 (109.05) 4;1 13.4189 (0.01) 12 1
test_forward_payment (NOW) 108,338.2401 (261.09) 115,570.7800 (36.50) 111,353.7021 (133.40) 2,483.2338 (7.19) 111,981.6790 (183.04) 3,360.6182 (20.74) 3;0 8.9804 (0.01) 11 1
test_forward_payment (0001_baselin) 108,917.7490 (262.49) 168,348.2911 (53.17) 140,321.5990 (168.10) 22,375.2216 (64.83) 143,746.4900 (234.97) 36,363.4459 (224.43) 3;0 7.1265 (0.01) 7 1
test_start (NOW) 299,278.4000 (721.25) 330,340.2610 (104.33) 314,121.8292 (376.32) 11,385.4700 (32.99) 314,603.4899 (514.25) 13,876.4871 (85.65) 2;0 3.1835 (0.00) 5 1
test_start (0001_baselin) 305,928.9111 (737.28) 575,270.0820 (181.68) 419,496.8460 (502.55) 138,248.1937 (400.55) 334,207.0500 (546.29) 254,339.0035 (>1000.0) 2;0 2.3838 (0.00) 5 1
test_long_forward_payment (NOW) 1,088,077.8680 (>1000.0) 1,131,035.0260 (357.20) 1,108,896.7970 (>1000.0) 20,494.1195 (59.38) 1,098,544.8329 (>1000.0) 36,904.4899 (227.77) 3;0 0.9018 (0.00) 5 1
test_long_forward_payment (0001_baselin) 1,282,326.5721 (>1000.0) 1,450,350.8301 (458.04) 1,369,618.5776 (>1000.0) 73,432.8716 (212.76) 1,380,547.3910 (>1000.0) 132,647.3573 (818.69) 2;0 0.7301 (0.00) 5 1
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
2025-11-20 12:07:16 +10:30
|
|
|
"""Get a node which is optimized for benchmarking"""
|
2025-11-20 12:07:16 +10:30
|
|
|
options = extra_options.copy()
|
tests/benchmark.py: tune nodes a little.
Drop the log level, don't do extra memory checks, don't dump I/O. These are not
realistic for testing non-development nodes.
Here's the comparison, using:
VALGRIND=0 eatmydata uv run pytest -v --benchmark-compare=0001_baseline tests/benchmark.py
Name (time in us) Min Max Mean StdDev Median IQR Outliers OPS Rounds Iterations
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
test_invoice (NOW) 414.9430 (1.0) 39,115.6150 (12.35) 834.7296 (1.0) 2,274.1198 (6.59) 611.7745 (1.0) 162.0230 (1.0) 1;33 1,197.9927 (1.0) 290 1
test_invoice (0001_baselin) 951.9740 (2.29) 3,166.4061 (1.0) 1,366.7944 (1.64) 345.1460 (1.0) 1,328.6110 (2.17) 339.3517 (2.09) 48;15 731.6389 (0.61) 221 1
test_pay (NOW) 36,339.2329 (87.58) 69,477.8530 (21.94) 51,719.9459 (61.96) 8,033.4262 (23.28) 52,639.5601 (86.04) 9,590.1425 (59.19) 6;0 19.3349 (0.02) 17 1
test_pay (0001_baselin) 61,741.5591 (148.80) 108,801.6961 (34.36) 88,284.6752 (105.76) 15,875.4417 (46.00) 96,006.0760 (156.93) 27,500.9771 (169.74) 6;0 11.3270 (0.01) 13 1
test_single_payment (NOW) 46,721.4010 (112.60) 66,027.6250 (20.85) 56,699.4597 (67.93) 5,829.7234 (16.89) 54,659.9385 (89.35) 9,810.9820 (60.55) 6;0 17.6369 (0.01) 14 1
test_single_payment (0001_baselin) 52,215.3670 (125.84) 109,608.0400 (34.62) 74,521.8032 (89.28) 16,175.6833 (46.87) 72,881.5976 (119.13) 17,668.8581 (109.05) 4;1 13.4189 (0.01) 12 1
test_forward_payment (NOW) 108,338.2401 (261.09) 115,570.7800 (36.50) 111,353.7021 (133.40) 2,483.2338 (7.19) 111,981.6790 (183.04) 3,360.6182 (20.74) 3;0 8.9804 (0.01) 11 1
test_forward_payment (0001_baselin) 108,917.7490 (262.49) 168,348.2911 (53.17) 140,321.5990 (168.10) 22,375.2216 (64.83) 143,746.4900 (234.97) 36,363.4459 (224.43) 3;0 7.1265 (0.01) 7 1
test_start (NOW) 299,278.4000 (721.25) 330,340.2610 (104.33) 314,121.8292 (376.32) 11,385.4700 (32.99) 314,603.4899 (514.25) 13,876.4871 (85.65) 2;0 3.1835 (0.00) 5 1
test_start (0001_baselin) 305,928.9111 (737.28) 575,270.0820 (181.68) 419,496.8460 (502.55) 138,248.1937 (400.55) 334,207.0500 (546.29) 254,339.0035 (>1000.0) 2;0 2.3838 (0.00) 5 1
test_long_forward_payment (NOW) 1,088,077.8680 (>1000.0) 1,131,035.0260 (357.20) 1,108,896.7970 (>1000.0) 20,494.1195 (59.38) 1,098,544.8329 (>1000.0) 36,904.4899 (227.77) 3;0 0.9018 (0.00) 5 1
test_long_forward_payment (0001_baselin) 1,282,326.5721 (>1000.0) 1,450,350.8301 (458.04) 1,369,618.5776 (>1000.0) 73,432.8716 (212.76) 1,380,547.3910 (>1000.0) 132,647.3573 (818.69) 2;0 0.7301 (0.00) 5 1
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
2025-11-20 12:07:16 +10:30
|
|
|
# The normal log-level trace makes for a lot of IO.
|
2025-11-20 12:07:16 +10:30
|
|
|
options['log-level'] = 'info'
|
|
|
|
|
node = node_factory.get_node(start=False, options=options)
|
tests/benchmark.py: tune nodes a little.
Drop the log level, don't do extra memory checks, don't dump I/O. These are not
realistic for testing non-development nodes.
Here's the comparison, using:
VALGRIND=0 eatmydata uv run pytest -v --benchmark-compare=0001_baseline tests/benchmark.py
Name (time in us) Min Max Mean StdDev Median IQR Outliers OPS Rounds Iterations
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
test_invoice (NOW) 414.9430 (1.0) 39,115.6150 (12.35) 834.7296 (1.0) 2,274.1198 (6.59) 611.7745 (1.0) 162.0230 (1.0) 1;33 1,197.9927 (1.0) 290 1
test_invoice (0001_baselin) 951.9740 (2.29) 3,166.4061 (1.0) 1,366.7944 (1.64) 345.1460 (1.0) 1,328.6110 (2.17) 339.3517 (2.09) 48;15 731.6389 (0.61) 221 1
test_pay (NOW) 36,339.2329 (87.58) 69,477.8530 (21.94) 51,719.9459 (61.96) 8,033.4262 (23.28) 52,639.5601 (86.04) 9,590.1425 (59.19) 6;0 19.3349 (0.02) 17 1
test_pay (0001_baselin) 61,741.5591 (148.80) 108,801.6961 (34.36) 88,284.6752 (105.76) 15,875.4417 (46.00) 96,006.0760 (156.93) 27,500.9771 (169.74) 6;0 11.3270 (0.01) 13 1
test_single_payment (NOW) 46,721.4010 (112.60) 66,027.6250 (20.85) 56,699.4597 (67.93) 5,829.7234 (16.89) 54,659.9385 (89.35) 9,810.9820 (60.55) 6;0 17.6369 (0.01) 14 1
test_single_payment (0001_baselin) 52,215.3670 (125.84) 109,608.0400 (34.62) 74,521.8032 (89.28) 16,175.6833 (46.87) 72,881.5976 (119.13) 17,668.8581 (109.05) 4;1 13.4189 (0.01) 12 1
test_forward_payment (NOW) 108,338.2401 (261.09) 115,570.7800 (36.50) 111,353.7021 (133.40) 2,483.2338 (7.19) 111,981.6790 (183.04) 3,360.6182 (20.74) 3;0 8.9804 (0.01) 11 1
test_forward_payment (0001_baselin) 108,917.7490 (262.49) 168,348.2911 (53.17) 140,321.5990 (168.10) 22,375.2216 (64.83) 143,746.4900 (234.97) 36,363.4459 (224.43) 3;0 7.1265 (0.01) 7 1
test_start (NOW) 299,278.4000 (721.25) 330,340.2610 (104.33) 314,121.8292 (376.32) 11,385.4700 (32.99) 314,603.4899 (514.25) 13,876.4871 (85.65) 2;0 3.1835 (0.00) 5 1
test_start (0001_baselin) 305,928.9111 (737.28) 575,270.0820 (181.68) 419,496.8460 (502.55) 138,248.1937 (400.55) 334,207.0500 (546.29) 254,339.0035 (>1000.0) 2;0 2.3838 (0.00) 5 1
test_long_forward_payment (NOW) 1,088,077.8680 (>1000.0) 1,131,035.0260 (357.20) 1,108,896.7970 (>1000.0) 20,494.1195 (59.38) 1,098,544.8329 (>1000.0) 36,904.4899 (227.77) 3;0 0.9018 (0.00) 5 1
test_long_forward_payment (0001_baselin) 1,282,326.5721 (>1000.0) 1,450,350.8301 (458.04) 1,369,618.5776 (>1000.0) 73,432.8716 (212.76) 1,380,547.3910 (>1000.0) 132,647.3573 (818.69) 2;0 0.7301 (0.00) 5 1
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
2025-11-20 12:07:16 +10:30
|
|
|
# Memleak detection here creates significant overhead!
|
|
|
|
|
del node.daemon.env["LIGHTNINGD_DEV_MEMLEAK"]
|
|
|
|
|
# Don't bother recording all our io.
|
|
|
|
|
del node.daemon.opts['dev-save-plugin-io']
|
|
|
|
|
node.start()
|
|
|
|
|
return node
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def get_bench_line_graph(node_factory, num_nodes, wait_for_announce=False):
|
|
|
|
|
nodes = [get_bench_node(node_factory) for _ in range(num_nodes)]
|
|
|
|
|
node_factory.join_nodes(nodes, wait_for_announce=wait_for_announce)
|
|
|
|
|
return nodes
|
|
|
|
|
|
|
|
|
|
|
2017-11-20 16:16:17 +01:00
|
|
|
@pytest.fixture
|
|
|
|
|
def executor():
|
|
|
|
|
ex = futures.ThreadPoolExecutor(max_workers=num_workers)
|
|
|
|
|
yield ex
|
|
|
|
|
ex.shutdown(wait=False)
|
|
|
|
|
|
2018-02-21 19:46:04 +01:00
|
|
|
|
2017-11-20 16:16:17 +01:00
|
|
|
def test_single_hop(node_factory, executor):
|
tests/benchmark.py: tune nodes a little.
Drop the log level, don't do extra memory checks, don't dump I/O. These are not
realistic for testing non-development nodes.
Here's the comparison, using:
VALGRIND=0 eatmydata uv run pytest -v --benchmark-compare=0001_baseline tests/benchmark.py
Name (time in us) Min Max Mean StdDev Median IQR Outliers OPS Rounds Iterations
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
test_invoice (NOW) 414.9430 (1.0) 39,115.6150 (12.35) 834.7296 (1.0) 2,274.1198 (6.59) 611.7745 (1.0) 162.0230 (1.0) 1;33 1,197.9927 (1.0) 290 1
test_invoice (0001_baselin) 951.9740 (2.29) 3,166.4061 (1.0) 1,366.7944 (1.64) 345.1460 (1.0) 1,328.6110 (2.17) 339.3517 (2.09) 48;15 731.6389 (0.61) 221 1
test_pay (NOW) 36,339.2329 (87.58) 69,477.8530 (21.94) 51,719.9459 (61.96) 8,033.4262 (23.28) 52,639.5601 (86.04) 9,590.1425 (59.19) 6;0 19.3349 (0.02) 17 1
test_pay (0001_baselin) 61,741.5591 (148.80) 108,801.6961 (34.36) 88,284.6752 (105.76) 15,875.4417 (46.00) 96,006.0760 (156.93) 27,500.9771 (169.74) 6;0 11.3270 (0.01) 13 1
test_single_payment (NOW) 46,721.4010 (112.60) 66,027.6250 (20.85) 56,699.4597 (67.93) 5,829.7234 (16.89) 54,659.9385 (89.35) 9,810.9820 (60.55) 6;0 17.6369 (0.01) 14 1
test_single_payment (0001_baselin) 52,215.3670 (125.84) 109,608.0400 (34.62) 74,521.8032 (89.28) 16,175.6833 (46.87) 72,881.5976 (119.13) 17,668.8581 (109.05) 4;1 13.4189 (0.01) 12 1
test_forward_payment (NOW) 108,338.2401 (261.09) 115,570.7800 (36.50) 111,353.7021 (133.40) 2,483.2338 (7.19) 111,981.6790 (183.04) 3,360.6182 (20.74) 3;0 8.9804 (0.01) 11 1
test_forward_payment (0001_baselin) 108,917.7490 (262.49) 168,348.2911 (53.17) 140,321.5990 (168.10) 22,375.2216 (64.83) 143,746.4900 (234.97) 36,363.4459 (224.43) 3;0 7.1265 (0.01) 7 1
test_start (NOW) 299,278.4000 (721.25) 330,340.2610 (104.33) 314,121.8292 (376.32) 11,385.4700 (32.99) 314,603.4899 (514.25) 13,876.4871 (85.65) 2;0 3.1835 (0.00) 5 1
test_start (0001_baselin) 305,928.9111 (737.28) 575,270.0820 (181.68) 419,496.8460 (502.55) 138,248.1937 (400.55) 334,207.0500 (546.29) 254,339.0035 (>1000.0) 2;0 2.3838 (0.00) 5 1
test_long_forward_payment (NOW) 1,088,077.8680 (>1000.0) 1,131,035.0260 (357.20) 1,108,896.7970 (>1000.0) 20,494.1195 (59.38) 1,098,544.8329 (>1000.0) 36,904.4899 (227.77) 3;0 0.9018 (0.00) 5 1
test_long_forward_payment (0001_baselin) 1,282,326.5721 (>1000.0) 1,450,350.8301 (458.04) 1,369,618.5776 (>1000.0) 73,432.8716 (212.76) 1,380,547.3910 (>1000.0) 132,647.3573 (818.69) 2;0 0.7301 (0.00) 5 1
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
2025-11-20 12:07:16 +10:30
|
|
|
l1 = get_bench_node(node_factory)
|
|
|
|
|
l2 = get_bench_node(node_factory)
|
2017-11-20 16:16:17 +01:00
|
|
|
|
2018-05-17 16:03:57 -04:00
|
|
|
l1.rpc.connect(l2.rpc.getinfo()['id'], 'localhost:%d' % l2.port)
|
2017-11-20 16:16:17 +01:00
|
|
|
l1.openchannel(l2, 4000000)
|
|
|
|
|
|
|
|
|
|
print("Collecting invoices")
|
|
|
|
|
fs = []
|
|
|
|
|
invoices = []
|
|
|
|
|
for i in tqdm(range(num_payments)):
|
2021-07-12 16:19:19 +09:30
|
|
|
inv = l2.rpc.invoice(1000, 'invoice-%d' % (i), 'desc')
|
|
|
|
|
invoices.append((inv['payment_hash'], inv['payment_secret']))
|
2017-11-20 16:16:17 +01:00
|
|
|
|
|
|
|
|
route = l1.rpc.getroute(l2.rpc.getinfo()['id'], 1000, 1)['route']
|
|
|
|
|
print("Sending payments")
|
|
|
|
|
start_time = time()
|
|
|
|
|
|
2021-07-12 16:19:19 +09:30
|
|
|
def do_pay(i, s):
|
|
|
|
|
p = l1.rpc.sendpay(route, i, payment_secret=s)
|
2018-05-18 09:08:58 -04:00
|
|
|
r = l1.rpc.waitsendpay(p['payment_hash'])
|
|
|
|
|
return r
|
|
|
|
|
|
2021-07-12 16:19:19 +09:30
|
|
|
for i, s in invoices:
|
|
|
|
|
fs.append(executor.submit(do_pay, i, s))
|
2017-11-20 16:16:17 +01:00
|
|
|
|
2018-05-18 09:08:58 -04:00
|
|
|
for f in tqdm(futures.as_completed(fs), total=len(fs)):
|
2017-11-20 16:16:17 +01:00
|
|
|
f.result()
|
|
|
|
|
|
|
|
|
|
diff = time() - start_time
|
|
|
|
|
print("Done. %d payments performed in %f seconds (%f payments per second)" % (num_payments, diff, num_payments / diff))
|
|
|
|
|
|
2018-02-21 19:46:04 +01:00
|
|
|
|
2017-11-20 16:16:17 +01:00
|
|
|
def test_single_payment(node_factory, benchmark):
|
tests/benchmark.py: tune nodes a little.
Drop the log level, don't do extra memory checks, don't dump I/O. These are not
realistic for testing non-development nodes.
Here's the comparison, using:
VALGRIND=0 eatmydata uv run pytest -v --benchmark-compare=0001_baseline tests/benchmark.py
Name (time in us) Min Max Mean StdDev Median IQR Outliers OPS Rounds Iterations
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
test_invoice (NOW) 414.9430 (1.0) 39,115.6150 (12.35) 834.7296 (1.0) 2,274.1198 (6.59) 611.7745 (1.0) 162.0230 (1.0) 1;33 1,197.9927 (1.0) 290 1
test_invoice (0001_baselin) 951.9740 (2.29) 3,166.4061 (1.0) 1,366.7944 (1.64) 345.1460 (1.0) 1,328.6110 (2.17) 339.3517 (2.09) 48;15 731.6389 (0.61) 221 1
test_pay (NOW) 36,339.2329 (87.58) 69,477.8530 (21.94) 51,719.9459 (61.96) 8,033.4262 (23.28) 52,639.5601 (86.04) 9,590.1425 (59.19) 6;0 19.3349 (0.02) 17 1
test_pay (0001_baselin) 61,741.5591 (148.80) 108,801.6961 (34.36) 88,284.6752 (105.76) 15,875.4417 (46.00) 96,006.0760 (156.93) 27,500.9771 (169.74) 6;0 11.3270 (0.01) 13 1
test_single_payment (NOW) 46,721.4010 (112.60) 66,027.6250 (20.85) 56,699.4597 (67.93) 5,829.7234 (16.89) 54,659.9385 (89.35) 9,810.9820 (60.55) 6;0 17.6369 (0.01) 14 1
test_single_payment (0001_baselin) 52,215.3670 (125.84) 109,608.0400 (34.62) 74,521.8032 (89.28) 16,175.6833 (46.87) 72,881.5976 (119.13) 17,668.8581 (109.05) 4;1 13.4189 (0.01) 12 1
test_forward_payment (NOW) 108,338.2401 (261.09) 115,570.7800 (36.50) 111,353.7021 (133.40) 2,483.2338 (7.19) 111,981.6790 (183.04) 3,360.6182 (20.74) 3;0 8.9804 (0.01) 11 1
test_forward_payment (0001_baselin) 108,917.7490 (262.49) 168,348.2911 (53.17) 140,321.5990 (168.10) 22,375.2216 (64.83) 143,746.4900 (234.97) 36,363.4459 (224.43) 3;0 7.1265 (0.01) 7 1
test_start (NOW) 299,278.4000 (721.25) 330,340.2610 (104.33) 314,121.8292 (376.32) 11,385.4700 (32.99) 314,603.4899 (514.25) 13,876.4871 (85.65) 2;0 3.1835 (0.00) 5 1
test_start (0001_baselin) 305,928.9111 (737.28) 575,270.0820 (181.68) 419,496.8460 (502.55) 138,248.1937 (400.55) 334,207.0500 (546.29) 254,339.0035 (>1000.0) 2;0 2.3838 (0.00) 5 1
test_long_forward_payment (NOW) 1,088,077.8680 (>1000.0) 1,131,035.0260 (357.20) 1,108,896.7970 (>1000.0) 20,494.1195 (59.38) 1,098,544.8329 (>1000.0) 36,904.4899 (227.77) 3;0 0.9018 (0.00) 5 1
test_long_forward_payment (0001_baselin) 1,282,326.5721 (>1000.0) 1,450,350.8301 (458.04) 1,369,618.5776 (>1000.0) 73,432.8716 (212.76) 1,380,547.3910 (>1000.0) 132,647.3573 (818.69) 2;0 0.7301 (0.00) 5 1
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
2025-11-20 12:07:16 +10:30
|
|
|
l1, l2 = get_bench_line_graph(node_factory, 2)
|
2017-11-20 16:16:17 +01:00
|
|
|
|
|
|
|
|
def do_pay(l1, l2):
|
|
|
|
|
invoice = l2.rpc.invoice(1000, 'invoice-{}'.format(random.random()), 'desc')['bolt11']
|
|
|
|
|
l1.rpc.pay(invoice)
|
|
|
|
|
|
|
|
|
|
benchmark(do_pay, l1, l2)
|
2018-05-17 18:14:01 -04:00
|
|
|
|
|
|
|
|
|
2018-10-12 15:02:58 +02:00
|
|
|
def test_forward_payment(node_factory, benchmark):
|
tests/benchmark.py: tune nodes a little.
Drop the log level, don't do extra memory checks, don't dump I/O. These are not
realistic for testing non-development nodes.
Here's the comparison, using:
VALGRIND=0 eatmydata uv run pytest -v --benchmark-compare=0001_baseline tests/benchmark.py
Name (time in us) Min Max Mean StdDev Median IQR Outliers OPS Rounds Iterations
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
test_invoice (NOW) 414.9430 (1.0) 39,115.6150 (12.35) 834.7296 (1.0) 2,274.1198 (6.59) 611.7745 (1.0) 162.0230 (1.0) 1;33 1,197.9927 (1.0) 290 1
test_invoice (0001_baselin) 951.9740 (2.29) 3,166.4061 (1.0) 1,366.7944 (1.64) 345.1460 (1.0) 1,328.6110 (2.17) 339.3517 (2.09) 48;15 731.6389 (0.61) 221 1
test_pay (NOW) 36,339.2329 (87.58) 69,477.8530 (21.94) 51,719.9459 (61.96) 8,033.4262 (23.28) 52,639.5601 (86.04) 9,590.1425 (59.19) 6;0 19.3349 (0.02) 17 1
test_pay (0001_baselin) 61,741.5591 (148.80) 108,801.6961 (34.36) 88,284.6752 (105.76) 15,875.4417 (46.00) 96,006.0760 (156.93) 27,500.9771 (169.74) 6;0 11.3270 (0.01) 13 1
test_single_payment (NOW) 46,721.4010 (112.60) 66,027.6250 (20.85) 56,699.4597 (67.93) 5,829.7234 (16.89) 54,659.9385 (89.35) 9,810.9820 (60.55) 6;0 17.6369 (0.01) 14 1
test_single_payment (0001_baselin) 52,215.3670 (125.84) 109,608.0400 (34.62) 74,521.8032 (89.28) 16,175.6833 (46.87) 72,881.5976 (119.13) 17,668.8581 (109.05) 4;1 13.4189 (0.01) 12 1
test_forward_payment (NOW) 108,338.2401 (261.09) 115,570.7800 (36.50) 111,353.7021 (133.40) 2,483.2338 (7.19) 111,981.6790 (183.04) 3,360.6182 (20.74) 3;0 8.9804 (0.01) 11 1
test_forward_payment (0001_baselin) 108,917.7490 (262.49) 168,348.2911 (53.17) 140,321.5990 (168.10) 22,375.2216 (64.83) 143,746.4900 (234.97) 36,363.4459 (224.43) 3;0 7.1265 (0.01) 7 1
test_start (NOW) 299,278.4000 (721.25) 330,340.2610 (104.33) 314,121.8292 (376.32) 11,385.4700 (32.99) 314,603.4899 (514.25) 13,876.4871 (85.65) 2;0 3.1835 (0.00) 5 1
test_start (0001_baselin) 305,928.9111 (737.28) 575,270.0820 (181.68) 419,496.8460 (502.55) 138,248.1937 (400.55) 334,207.0500 (546.29) 254,339.0035 (>1000.0) 2;0 2.3838 (0.00) 5 1
test_long_forward_payment (NOW) 1,088,077.8680 (>1000.0) 1,131,035.0260 (357.20) 1,108,896.7970 (>1000.0) 20,494.1195 (59.38) 1,098,544.8329 (>1000.0) 36,904.4899 (227.77) 3;0 0.9018 (0.00) 5 1
test_long_forward_payment (0001_baselin) 1,282,326.5721 (>1000.0) 1,450,350.8301 (458.04) 1,369,618.5776 (>1000.0) 73,432.8716 (212.76) 1,380,547.3910 (>1000.0) 132,647.3573 (818.69) 2;0 0.7301 (0.00) 5 1
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
2025-11-20 12:07:16 +10:30
|
|
|
l1, l2, l3 = get_bench_line_graph(node_factory, 3, wait_for_announce=True)
|
2018-10-12 15:02:58 +02:00
|
|
|
|
|
|
|
|
def do_pay(src, dest):
|
|
|
|
|
invoice = dest.rpc.invoice(1000, 'invoice-{}'.format(random.random()), 'desc')['bolt11']
|
|
|
|
|
src.rpc.pay(invoice)
|
|
|
|
|
|
|
|
|
|
benchmark(do_pay, l1, l3)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_long_forward_payment(node_factory, benchmark):
|
tests/benchmark.py: tune nodes a little.
Drop the log level, don't do extra memory checks, don't dump I/O. These are not
realistic for testing non-development nodes.
Here's the comparison, using:
VALGRIND=0 eatmydata uv run pytest -v --benchmark-compare=0001_baseline tests/benchmark.py
Name (time in us) Min Max Mean StdDev Median IQR Outliers OPS Rounds Iterations
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
test_invoice (NOW) 414.9430 (1.0) 39,115.6150 (12.35) 834.7296 (1.0) 2,274.1198 (6.59) 611.7745 (1.0) 162.0230 (1.0) 1;33 1,197.9927 (1.0) 290 1
test_invoice (0001_baselin) 951.9740 (2.29) 3,166.4061 (1.0) 1,366.7944 (1.64) 345.1460 (1.0) 1,328.6110 (2.17) 339.3517 (2.09) 48;15 731.6389 (0.61) 221 1
test_pay (NOW) 36,339.2329 (87.58) 69,477.8530 (21.94) 51,719.9459 (61.96) 8,033.4262 (23.28) 52,639.5601 (86.04) 9,590.1425 (59.19) 6;0 19.3349 (0.02) 17 1
test_pay (0001_baselin) 61,741.5591 (148.80) 108,801.6961 (34.36) 88,284.6752 (105.76) 15,875.4417 (46.00) 96,006.0760 (156.93) 27,500.9771 (169.74) 6;0 11.3270 (0.01) 13 1
test_single_payment (NOW) 46,721.4010 (112.60) 66,027.6250 (20.85) 56,699.4597 (67.93) 5,829.7234 (16.89) 54,659.9385 (89.35) 9,810.9820 (60.55) 6;0 17.6369 (0.01) 14 1
test_single_payment (0001_baselin) 52,215.3670 (125.84) 109,608.0400 (34.62) 74,521.8032 (89.28) 16,175.6833 (46.87) 72,881.5976 (119.13) 17,668.8581 (109.05) 4;1 13.4189 (0.01) 12 1
test_forward_payment (NOW) 108,338.2401 (261.09) 115,570.7800 (36.50) 111,353.7021 (133.40) 2,483.2338 (7.19) 111,981.6790 (183.04) 3,360.6182 (20.74) 3;0 8.9804 (0.01) 11 1
test_forward_payment (0001_baselin) 108,917.7490 (262.49) 168,348.2911 (53.17) 140,321.5990 (168.10) 22,375.2216 (64.83) 143,746.4900 (234.97) 36,363.4459 (224.43) 3;0 7.1265 (0.01) 7 1
test_start (NOW) 299,278.4000 (721.25) 330,340.2610 (104.33) 314,121.8292 (376.32) 11,385.4700 (32.99) 314,603.4899 (514.25) 13,876.4871 (85.65) 2;0 3.1835 (0.00) 5 1
test_start (0001_baselin) 305,928.9111 (737.28) 575,270.0820 (181.68) 419,496.8460 (502.55) 138,248.1937 (400.55) 334,207.0500 (546.29) 254,339.0035 (>1000.0) 2;0 2.3838 (0.00) 5 1
test_long_forward_payment (NOW) 1,088,077.8680 (>1000.0) 1,131,035.0260 (357.20) 1,108,896.7970 (>1000.0) 20,494.1195 (59.38) 1,098,544.8329 (>1000.0) 36,904.4899 (227.77) 3;0 0.9018 (0.00) 5 1
test_long_forward_payment (0001_baselin) 1,282,326.5721 (>1000.0) 1,450,350.8301 (458.04) 1,369,618.5776 (>1000.0) 73,432.8716 (212.76) 1,380,547.3910 (>1000.0) 132,647.3573 (818.69) 2;0 0.7301 (0.00) 5 1
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
2025-11-20 12:07:16 +10:30
|
|
|
nodes = get_bench_line_graph(node_factory, 21, wait_for_announce=True)
|
2018-10-12 15:02:58 +02:00
|
|
|
|
|
|
|
|
def do_pay(src, dest):
|
|
|
|
|
invoice = dest.rpc.invoice(1000, 'invoice-{}'.format(random.random()), 'desc')['bolt11']
|
|
|
|
|
src.rpc.pay(invoice)
|
|
|
|
|
|
|
|
|
|
benchmark(do_pay, nodes[0], nodes[-1])
|
|
|
|
|
|
|
|
|
|
|
2018-05-17 18:14:01 -04:00
|
|
|
def test_invoice(node_factory, benchmark):
|
tests/benchmark.py: tune nodes a little.
Drop the log level, don't do extra memory checks, don't dump I/O. These are not
realistic for testing non-development nodes.
Here's the comparison, using:
VALGRIND=0 eatmydata uv run pytest -v --benchmark-compare=0001_baseline tests/benchmark.py
Name (time in us) Min Max Mean StdDev Median IQR Outliers OPS Rounds Iterations
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
test_invoice (NOW) 414.9430 (1.0) 39,115.6150 (12.35) 834.7296 (1.0) 2,274.1198 (6.59) 611.7745 (1.0) 162.0230 (1.0) 1;33 1,197.9927 (1.0) 290 1
test_invoice (0001_baselin) 951.9740 (2.29) 3,166.4061 (1.0) 1,366.7944 (1.64) 345.1460 (1.0) 1,328.6110 (2.17) 339.3517 (2.09) 48;15 731.6389 (0.61) 221 1
test_pay (NOW) 36,339.2329 (87.58) 69,477.8530 (21.94) 51,719.9459 (61.96) 8,033.4262 (23.28) 52,639.5601 (86.04) 9,590.1425 (59.19) 6;0 19.3349 (0.02) 17 1
test_pay (0001_baselin) 61,741.5591 (148.80) 108,801.6961 (34.36) 88,284.6752 (105.76) 15,875.4417 (46.00) 96,006.0760 (156.93) 27,500.9771 (169.74) 6;0 11.3270 (0.01) 13 1
test_single_payment (NOW) 46,721.4010 (112.60) 66,027.6250 (20.85) 56,699.4597 (67.93) 5,829.7234 (16.89) 54,659.9385 (89.35) 9,810.9820 (60.55) 6;0 17.6369 (0.01) 14 1
test_single_payment (0001_baselin) 52,215.3670 (125.84) 109,608.0400 (34.62) 74,521.8032 (89.28) 16,175.6833 (46.87) 72,881.5976 (119.13) 17,668.8581 (109.05) 4;1 13.4189 (0.01) 12 1
test_forward_payment (NOW) 108,338.2401 (261.09) 115,570.7800 (36.50) 111,353.7021 (133.40) 2,483.2338 (7.19) 111,981.6790 (183.04) 3,360.6182 (20.74) 3;0 8.9804 (0.01) 11 1
test_forward_payment (0001_baselin) 108,917.7490 (262.49) 168,348.2911 (53.17) 140,321.5990 (168.10) 22,375.2216 (64.83) 143,746.4900 (234.97) 36,363.4459 (224.43) 3;0 7.1265 (0.01) 7 1
test_start (NOW) 299,278.4000 (721.25) 330,340.2610 (104.33) 314,121.8292 (376.32) 11,385.4700 (32.99) 314,603.4899 (514.25) 13,876.4871 (85.65) 2;0 3.1835 (0.00) 5 1
test_start (0001_baselin) 305,928.9111 (737.28) 575,270.0820 (181.68) 419,496.8460 (502.55) 138,248.1937 (400.55) 334,207.0500 (546.29) 254,339.0035 (>1000.0) 2;0 2.3838 (0.00) 5 1
test_long_forward_payment (NOW) 1,088,077.8680 (>1000.0) 1,131,035.0260 (357.20) 1,108,896.7970 (>1000.0) 20,494.1195 (59.38) 1,098,544.8329 (>1000.0) 36,904.4899 (227.77) 3;0 0.9018 (0.00) 5 1
test_long_forward_payment (0001_baselin) 1,282,326.5721 (>1000.0) 1,450,350.8301 (458.04) 1,369,618.5776 (>1000.0) 73,432.8716 (212.76) 1,380,547.3910 (>1000.0) 132,647.3573 (818.69) 2;0 0.7301 (0.00) 5 1
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
2025-11-20 12:07:16 +10:30
|
|
|
l1 = get_bench_node(node_factory)
|
2018-05-17 18:14:01 -04:00
|
|
|
|
|
|
|
|
def bench_invoice():
|
|
|
|
|
l1.rpc.invoice(1000, 'invoice-{}'.format(time()), 'desc')
|
|
|
|
|
|
|
|
|
|
benchmark(bench_invoice)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_pay(node_factory, benchmark):
|
tests/benchmark.py: tune nodes a little.
Drop the log level, don't do extra memory checks, don't dump I/O. These are not
realistic for testing non-development nodes.
Here's the comparison, using:
VALGRIND=0 eatmydata uv run pytest -v --benchmark-compare=0001_baseline tests/benchmark.py
Name (time in us) Min Max Mean StdDev Median IQR Outliers OPS Rounds Iterations
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
test_invoice (NOW) 414.9430 (1.0) 39,115.6150 (12.35) 834.7296 (1.0) 2,274.1198 (6.59) 611.7745 (1.0) 162.0230 (1.0) 1;33 1,197.9927 (1.0) 290 1
test_invoice (0001_baselin) 951.9740 (2.29) 3,166.4061 (1.0) 1,366.7944 (1.64) 345.1460 (1.0) 1,328.6110 (2.17) 339.3517 (2.09) 48;15 731.6389 (0.61) 221 1
test_pay (NOW) 36,339.2329 (87.58) 69,477.8530 (21.94) 51,719.9459 (61.96) 8,033.4262 (23.28) 52,639.5601 (86.04) 9,590.1425 (59.19) 6;0 19.3349 (0.02) 17 1
test_pay (0001_baselin) 61,741.5591 (148.80) 108,801.6961 (34.36) 88,284.6752 (105.76) 15,875.4417 (46.00) 96,006.0760 (156.93) 27,500.9771 (169.74) 6;0 11.3270 (0.01) 13 1
test_single_payment (NOW) 46,721.4010 (112.60) 66,027.6250 (20.85) 56,699.4597 (67.93) 5,829.7234 (16.89) 54,659.9385 (89.35) 9,810.9820 (60.55) 6;0 17.6369 (0.01) 14 1
test_single_payment (0001_baselin) 52,215.3670 (125.84) 109,608.0400 (34.62) 74,521.8032 (89.28) 16,175.6833 (46.87) 72,881.5976 (119.13) 17,668.8581 (109.05) 4;1 13.4189 (0.01) 12 1
test_forward_payment (NOW) 108,338.2401 (261.09) 115,570.7800 (36.50) 111,353.7021 (133.40) 2,483.2338 (7.19) 111,981.6790 (183.04) 3,360.6182 (20.74) 3;0 8.9804 (0.01) 11 1
test_forward_payment (0001_baselin) 108,917.7490 (262.49) 168,348.2911 (53.17) 140,321.5990 (168.10) 22,375.2216 (64.83) 143,746.4900 (234.97) 36,363.4459 (224.43) 3;0 7.1265 (0.01) 7 1
test_start (NOW) 299,278.4000 (721.25) 330,340.2610 (104.33) 314,121.8292 (376.32) 11,385.4700 (32.99) 314,603.4899 (514.25) 13,876.4871 (85.65) 2;0 3.1835 (0.00) 5 1
test_start (0001_baselin) 305,928.9111 (737.28) 575,270.0820 (181.68) 419,496.8460 (502.55) 138,248.1937 (400.55) 334,207.0500 (546.29) 254,339.0035 (>1000.0) 2;0 2.3838 (0.00) 5 1
test_long_forward_payment (NOW) 1,088,077.8680 (>1000.0) 1,131,035.0260 (357.20) 1,108,896.7970 (>1000.0) 20,494.1195 (59.38) 1,098,544.8329 (>1000.0) 36,904.4899 (227.77) 3;0 0.9018 (0.00) 5 1
test_long_forward_payment (0001_baselin) 1,282,326.5721 (>1000.0) 1,450,350.8301 (458.04) 1,369,618.5776 (>1000.0) 73,432.8716 (212.76) 1,380,547.3910 (>1000.0) 132,647.3573 (818.69) 2;0 0.7301 (0.00) 5 1
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
2025-11-20 12:07:16 +10:30
|
|
|
l1, l2 = get_bench_line_graph(node_factory, 2)
|
2018-05-17 18:14:01 -04:00
|
|
|
|
|
|
|
|
invoices = []
|
|
|
|
|
for _ in range(1, 100):
|
|
|
|
|
invoice = l2.rpc.invoice(1000, 'invoice-{}'.format(random.random()), 'desc')['bolt11']
|
|
|
|
|
invoices.append(invoice)
|
|
|
|
|
|
|
|
|
|
def do_pay(l1, l2):
|
|
|
|
|
l1.rpc.pay(invoices.pop())
|
|
|
|
|
|
|
|
|
|
benchmark(do_pay, l1, l2)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_start(node_factory, benchmark):
|
|
|
|
|
benchmark(node_factory.get_node)
|
2025-11-20 12:07:16 +10:30
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_generate_coinmoves(node_factory, bitcoind, executor, benchmark):
|
|
|
|
|
l1, l2, l3 = get_bench_line_graph(node_factory, 3, wait_for_announce=True)
|
|
|
|
|
|
|
|
|
|
# Route some payments
|
|
|
|
|
l1.rpc.xpay(l3.rpc.invoice(1, "test_generate_coinmoves", "test_generate_coinmoves")['bolt11'])
|
|
|
|
|
# Make some payments
|
|
|
|
|
l2.rpc.xpay(l3.rpc.invoice(1, "test_generate_coinmoves3", "test_generate_coinmoves3")['bolt11'])
|
|
|
|
|
# Receive some payments
|
|
|
|
|
l1.rpc.xpay(l2.rpc.invoice(1, "test_generate_coinmoves", "test_generate_coinmoves")['bolt11'])
|
|
|
|
|
wait_for(lambda: all([c['htlcs'] == [] for c in l1.rpc.listpeerchannels()['channels']]))
|
|
|
|
|
|
|
|
|
|
l2.stop()
|
|
|
|
|
entries = l2.db.query('SELECT * FROM channel_moves ORDER BY id;')
|
|
|
|
|
assert len(entries) == 4
|
|
|
|
|
next_id = entries[-1]['id'] + 1
|
|
|
|
|
next_timestamp = entries[-1]['timestamp'] + 1
|
|
|
|
|
|
|
|
|
|
batch = []
|
|
|
|
|
# Let's make 5 million entries.
|
|
|
|
|
for _ in range(5_000_000 // len(entries)):
|
|
|
|
|
# Random payment_hash
|
|
|
|
|
entries[0]['payment_hash'] = entries[1]['payment_hash'] = random.randbytes(32)
|
|
|
|
|
entries[2]['payment_hash'] = random.randbytes(32)
|
|
|
|
|
entries[3]['payment_hash'] = random.randbytes(32)
|
|
|
|
|
# Incrementing timestamps
|
|
|
|
|
for e in entries:
|
|
|
|
|
e['timestamp'] = next_timestamp
|
|
|
|
|
next_timestamp += 1
|
|
|
|
|
|
|
|
|
|
for e in entries:
|
|
|
|
|
batch.append((
|
|
|
|
|
next_id,
|
|
|
|
|
e['account_channel_id'],
|
|
|
|
|
e['account_nonchannel_id'],
|
|
|
|
|
e['tag_bitmap'],
|
|
|
|
|
e['credit_or_debit'],
|
|
|
|
|
e['timestamp'],
|
|
|
|
|
e['payment_hash'],
|
|
|
|
|
e['payment_part_id'],
|
|
|
|
|
e['payment_group_id'],
|
|
|
|
|
e['fees'],
|
|
|
|
|
))
|
|
|
|
|
next_id += 1
|
|
|
|
|
|
|
|
|
|
l2.db.executemany("INSERT INTO channel_moves"
|
|
|
|
|
" (id, account_channel_id, account_nonchannel_id, tag_bitmap, credit_or_debit,"
|
|
|
|
|
" timestamp, payment_hash, payment_part_id, payment_group_id, fees)"
|
|
|
|
|
" VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
|
|
|
|
|
batch)
|
|
|
|
|
l2.start()
|
|
|
|
|
|
|
|
|
|
def measure_latency(node, stop_event):
|
|
|
|
|
latencies = []
|
|
|
|
|
|
|
|
|
|
while not stop_event.is_set():
|
|
|
|
|
time.sleep(0.1)
|
|
|
|
|
|
|
|
|
|
start = time.time()
|
|
|
|
|
node.rpc.help()
|
|
|
|
|
end = time.time()
|
|
|
|
|
|
|
|
|
|
latencies.append(end - start)
|
|
|
|
|
|
|
|
|
|
return latencies
|
|
|
|
|
|
|
|
|
|
stopme = threading.Event()
|
|
|
|
|
fut = executor.submit(measure_latency, l2, stopme)
|
|
|
|
|
|
|
|
|
|
# This makes bkpr parse it all.
|
|
|
|
|
benchmark(l2.rpc.bkpr_listbalances)
|
|
|
|
|
|
|
|
|
|
stopme.set()
|
|
|
|
|
latencies = fut.result(TIMEOUT)
|
|
|
|
|
|
|
|
|
|
# FIXME: Print this somewhere!
|
|
|
|
|
benchmark.extra_info = {"title": "Latency details:",
|
|
|
|
|
"min": min(latencies),
|
|
|
|
|
"median": statistics.median(latencies),
|
|
|
|
|
"max": max(latencies)}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_spam_commands(node_factory, bitcoind, benchmark):
|
|
|
|
|
plugin = os.path.join(os.getcwd(), "tests/plugins/test_libplugin")
|
|
|
|
|
l1 = get_bench_node(node_factory, extra_options={"plugin": plugin})
|
|
|
|
|
|
2025-11-20 12:07:16 +10:30
|
|
|
# This calls "batch" 1M times (which doesn't need a transaction)
|
2025-11-20 12:07:16 +10:30
|
|
|
benchmark(l1.rpc.spamcommand, 1_000_000)
|
2025-11-20 12:07:16 +10:30
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_spam_listcommands(node_factory, bitcoind, benchmark):
|
|
|
|
|
plugin = os.path.join(os.getcwd(), "tests/plugins/test_libplugin")
|
|
|
|
|
l1 = get_bench_node(node_factory, extra_options={"plugin": plugin})
|
|
|
|
|
|
|
|
|
|
# This calls "listinvoice" 100,000 times (which doesn't need a transaction commit)
|
|
|
|
|
benchmark(l1.rpc.spamlistcommand, 100_000)
|
2026-01-07 09:58:11 +10:30
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_payment_speed(node_factory, benchmark):
|
|
|
|
|
"""This makes sure we don't screw up nagle handling.
|
|
|
|
|
|
|
|
|
|
Normally:
|
|
|
|
|
Name (time in ms) Min Max Mean StdDev Median IQR Outliers OPS Rounds Iterations
|
|
|
|
|
test_payment_speed 16.3587 40.4925 27.4874 5.5512 27.7885 8.9291 9;0 36.3803 33 1
|
|
|
|
|
|
|
|
|
|
Without TCP_NODELAY:
|
|
|
|
|
Name (time in ms) Min Max Mean StdDev Median IQR Outliers OPS Rounds Iterations
|
|
|
|
|
test_payment_speed 153.7132 163.2027 158.6747 3.4059 158.5219 6.3745 3;0 6.3022 9 1
|
|
|
|
|
"""
|
|
|
|
|
l1 = get_bench_node(node_factory, extra_options={'commit-time': 0})
|
|
|
|
|
l2 = get_bench_node(node_factory, extra_options={'commit-time': 0})
|
|
|
|
|
|
|
|
|
|
node_factory.join_nodes([l1, l2])
|
|
|
|
|
|
|
|
|
|
scid = only_one(l1.rpc.listpeerchannels()['channels'])['short_channel_id']
|
|
|
|
|
routestep = {
|
|
|
|
|
'amount_msat': 100,
|
|
|
|
|
'id': l2.info['id'],
|
|
|
|
|
'delay': 5,
|
|
|
|
|
'channel': scid
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
def onepay(l1, routestep):
|
|
|
|
|
phash = random.randbytes(32).hex()
|
|
|
|
|
l1.rpc.sendpay([routestep], phash)
|
|
|
|
|
with pytest.raises(RpcError, match="WIRE_INCORRECT_OR_UNKNOWN_PAYMENT_DETAILS"):
|
|
|
|
|
l1.rpc.waitsendpay(phash)
|
|
|
|
|
|
|
|
|
|
benchmark(onepay, l1, routestep)
|