From 5888ff60f9d6c6f7232e019836e67f4ed592724b Mon Sep 17 00:00:00 2001 From: achingbrain Date: Mon, 3 Mar 2025 13:16:50 +0100 Subject: [PATCH 1/2] fix: decrease default routing table size Reduces the default routing table size to 1280. This improves CPU/memory/network usage as we don't need to sort as many peers when finding the closest ones to a given key, nor do we need to contact as many to ensure only live peers are still in the table. --- packages/kad-dht/src/index.ts | 25 ++++++++++++-- packages/kad-dht/test/routing-table.spec.ts | 36 +++++++++++++++++++++ 2 files changed, 59 insertions(+), 2 deletions(-) diff --git a/packages/kad-dht/src/index.ts b/packages/kad-dht/src/index.ts index c77f6d13e2..1671750bf2 100644 --- a/packages/kad-dht/src/index.ts +++ b/packages/kad-dht/src/index.ts @@ -428,9 +428,23 @@ export interface KadDHTInit { * can be stored. * * Storing more peers means fewer lookups (and network operations) are needed - * to locate a certain peer, but also that more memory is consumed. + * to locate a certain peer, but also that more memory is consumed and more + * CPU while responding to queries (e.g. with more peers in the table sorting + * the closest peers becomes more expensive) and CPU/network during table + * maintenance (e.g. checking peers are still online). * - * @default 32 + * The larger this value, the more prefix bits must be the same for a peer to + * be stored in a KAD bucket, so the fewer nodes that bucket is likely to + * contain. + * + * The total number of peers in the table is a factor of `prefixLength` and + * `kBucketSize`: + * + * ``` + * (2 ^ prefixLength) * kBucketSize + * ``` + * + * @default 8 */ prefixLength?: number @@ -438,6 +452,13 @@ export interface KadDHTInit { * If true, only ever be a DHT client. If false, be a DHT client until told * to be a DHT server via `setMode`. * + * In general this should be left as the default because server mode will be + * selected automatically when libp2p establishes that the current node has + * a publicly dialable address. + * + * The exception to this is LAN-only DHT (e.g. for testing purposes) where it + * is safe to assume that the current node is dialable. + * * @default false */ clientMode?: boolean diff --git a/packages/kad-dht/test/routing-table.spec.ts b/packages/kad-dht/test/routing-table.spec.ts index 2657f3dda0..3311c2e0bf 100644 --- a/packages/kad-dht/test/routing-table.spec.ts +++ b/packages/kad-dht/test/routing-table.spec.ts @@ -484,4 +484,40 @@ describe('Routing Table', () => { await expect(table.find(peer.id)).to.eventually.be.ok() }) + + describe('max size', () => { + it('should constrain size to 10', async () => { + const prefixLength = 8 + const kBucketSize = 20 + const maxSize = Math.pow(2, prefixLength) * kBucketSize + + table = new RoutingTable(components, { + logPrefix: '', + metricsPrefix: '', + protocol: PROTOCOL, + network, + prefixLength, + kBucketSize + }) + await start(table) + + // reset network stub so we can have specific behavior + table.network = network = stubInterface() + + // all old peers answer pings, no peers should be evicted + network.sendRequest.callsFake(async function * (from: PeerId) { + yield peerResponseEvent({ + from, + messageType: MessageType.PING + }) + }) + + for (let i = 0; i < 2 * maxSize; i++) { + const remotePeer = await createPeerId() + await table.add(remotePeer) + } + + expect(table.size).to.be.lessThanOrEqual(maxSize) + }) + }) }) From 3493f06a5635c586170189acab2566232c1e1880 Mon Sep 17 00:00:00 2001 From: achingbrain Date: Mon, 3 Mar 2025 13:56:30 +0100 Subject: [PATCH 2/2] chore: update prefix length --- packages/kad-dht/src/index.ts | 2 +- packages/kad-dht/src/routing-table/index.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/kad-dht/src/index.ts b/packages/kad-dht/src/index.ts index 1671750bf2..596ce07e9b 100644 --- a/packages/kad-dht/src/index.ts +++ b/packages/kad-dht/src/index.ts @@ -444,7 +444,7 @@ export interface KadDHTInit { * (2 ^ prefixLength) * kBucketSize * ``` * - * @default 8 + * @default 6 */ prefixLength?: number diff --git a/packages/kad-dht/src/routing-table/index.ts b/packages/kad-dht/src/routing-table/index.ts index 25d1a649e9..4c95a368b9 100644 --- a/packages/kad-dht/src/routing-table/index.ts +++ b/packages/kad-dht/src/routing-table/index.ts @@ -14,7 +14,7 @@ import type { AbortOptions, ComponentLogger, CounterGroup, Logger, Metric, Metri import type { AdaptiveTimeoutInit } from '@libp2p/utils/adaptive-timeout' export const KBUCKET_SIZE = 20 -export const PREFIX_LENGTH = 8 +export const PREFIX_LENGTH = 6 export const PING_NEW_CONTACT_TIMEOUT = 2000 export const PING_NEW_CONTACT_CONCURRENCY = 20 export const PING_NEW_CONTACT_MAX_QUEUE_SIZE = 100