mirror of
https://github.com/ipfs/kubo.git
synced 2025-08-26 04:26:07 +08:00
feat: enable Resource Manager by default
This commit is contained in:

committed by
Adin Schmahmann

parent
0f8a1a35d2
commit
3d527753ff
@ -138,7 +138,7 @@ type ConnMgr struct {
|
||||
// ResourceMgr defines configuration options for the libp2p Network Resource Manager
|
||||
// <https://github.com/libp2p/go-libp2p-resource-manager#readme>
|
||||
type ResourceMgr struct {
|
||||
// Enables the Network Resource Manager feature
|
||||
// Enables the Network Resource Manager feature, default to on.
|
||||
Enabled Flag `json:",omitempty"`
|
||||
Limits *rcmgr.BasicLimiterConfig `json:",omitempty"`
|
||||
}
|
||||
|
@ -29,8 +29,7 @@ func ResourceManager(cfg config.SwarmConfig) func(fx.Lifecycle, repo.Repo) (netw
|
||||
var manager network.ResourceManager
|
||||
var opts Libp2pOpts
|
||||
|
||||
// Config Swarm.ResourceMgr.Enabled decides if we run a real manager
|
||||
enabled := cfg.ResourceMgr.Enabled.WithDefault(false)
|
||||
enabled := cfg.ResourceMgr.Enabled.WithDefault(true)
|
||||
|
||||
/// ENV overrides Config (if present)
|
||||
switch os.Getenv("LIBP2P_RCMGR") {
|
||||
|
@ -1,6 +1,7 @@
|
||||
package libp2p
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"strconv"
|
||||
|
||||
"github.com/libp2p/go-libp2p-core/network"
|
||||
@ -11,6 +12,17 @@ import (
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
)
|
||||
|
||||
func mustRegister(c prometheus.Collector) {
|
||||
err := prometheus.Register(c)
|
||||
are := prometheus.AlreadyRegisteredError{}
|
||||
if errors.As(err, &are) {
|
||||
return
|
||||
}
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
|
||||
func createRcmgrMetrics() rcmgr.MetricsReporter {
|
||||
const (
|
||||
direction = "direction"
|
||||
@ -26,7 +38,7 @@ func createRcmgrMetrics() rcmgr.MetricsReporter {
|
||||
},
|
||||
[]string{direction, usesFD},
|
||||
)
|
||||
prometheus.MustRegister(connAllowed)
|
||||
mustRegister(connAllowed)
|
||||
|
||||
connBlocked := prometheus.NewCounterVec(
|
||||
prometheus.CounterOpts{
|
||||
@ -35,7 +47,7 @@ func createRcmgrMetrics() rcmgr.MetricsReporter {
|
||||
},
|
||||
[]string{direction, usesFD},
|
||||
)
|
||||
prometheus.MustRegister(connBlocked)
|
||||
mustRegister(connBlocked)
|
||||
|
||||
streamAllowed := prometheus.NewCounterVec(
|
||||
prometheus.CounterOpts{
|
||||
@ -44,7 +56,7 @@ func createRcmgrMetrics() rcmgr.MetricsReporter {
|
||||
},
|
||||
[]string{direction},
|
||||
)
|
||||
prometheus.MustRegister(streamAllowed)
|
||||
mustRegister(streamAllowed)
|
||||
|
||||
streamBlocked := prometheus.NewCounterVec(
|
||||
prometheus.CounterOpts{
|
||||
@ -53,19 +65,19 @@ func createRcmgrMetrics() rcmgr.MetricsReporter {
|
||||
},
|
||||
[]string{direction},
|
||||
)
|
||||
prometheus.MustRegister(streamBlocked)
|
||||
mustRegister(streamBlocked)
|
||||
|
||||
peerAllowed := prometheus.NewCounter(prometheus.CounterOpts{
|
||||
Name: "libp2p_rcmgr_peers_allowed_total",
|
||||
Help: "allowed peers",
|
||||
})
|
||||
prometheus.MustRegister(peerAllowed)
|
||||
mustRegister(peerAllowed)
|
||||
|
||||
peerBlocked := prometheus.NewCounter(prometheus.CounterOpts{
|
||||
Name: "libp2p_rcmgr_peer_blocked_total",
|
||||
Help: "blocked peers",
|
||||
})
|
||||
prometheus.MustRegister(peerBlocked)
|
||||
mustRegister(peerBlocked)
|
||||
|
||||
protocolAllowed := prometheus.NewCounterVec(
|
||||
prometheus.CounterOpts{
|
||||
@ -74,7 +86,7 @@ func createRcmgrMetrics() rcmgr.MetricsReporter {
|
||||
},
|
||||
[]string{protocol},
|
||||
)
|
||||
prometheus.MustRegister(protocolAllowed)
|
||||
mustRegister(protocolAllowed)
|
||||
|
||||
protocolBlocked := prometheus.NewCounterVec(
|
||||
prometheus.CounterOpts{
|
||||
@ -83,7 +95,7 @@ func createRcmgrMetrics() rcmgr.MetricsReporter {
|
||||
},
|
||||
[]string{protocol},
|
||||
)
|
||||
prometheus.MustRegister(protocolBlocked)
|
||||
mustRegister(protocolBlocked)
|
||||
|
||||
protocolPeerBlocked := prometheus.NewCounterVec(
|
||||
prometheus.CounterOpts{
|
||||
@ -92,7 +104,7 @@ func createRcmgrMetrics() rcmgr.MetricsReporter {
|
||||
},
|
||||
[]string{protocol},
|
||||
)
|
||||
prometheus.MustRegister(protocolPeerBlocked)
|
||||
mustRegister(protocolPeerBlocked)
|
||||
|
||||
serviceAllowed := prometheus.NewCounterVec(
|
||||
prometheus.CounterOpts{
|
||||
@ -101,7 +113,7 @@ func createRcmgrMetrics() rcmgr.MetricsReporter {
|
||||
},
|
||||
[]string{service},
|
||||
)
|
||||
prometheus.MustRegister(serviceAllowed)
|
||||
mustRegister(serviceAllowed)
|
||||
|
||||
serviceBlocked := prometheus.NewCounterVec(
|
||||
prometheus.CounterOpts{
|
||||
@ -110,7 +122,7 @@ func createRcmgrMetrics() rcmgr.MetricsReporter {
|
||||
},
|
||||
[]string{service},
|
||||
)
|
||||
prometheus.MustRegister(serviceBlocked)
|
||||
mustRegister(serviceBlocked)
|
||||
|
||||
servicePeerBlocked := prometheus.NewCounterVec(
|
||||
prometheus.CounterOpts{
|
||||
@ -119,19 +131,19 @@ func createRcmgrMetrics() rcmgr.MetricsReporter {
|
||||
},
|
||||
[]string{service},
|
||||
)
|
||||
prometheus.MustRegister(servicePeerBlocked)
|
||||
mustRegister(servicePeerBlocked)
|
||||
|
||||
memoryAllowed := prometheus.NewCounter(prometheus.CounterOpts{
|
||||
Name: "libp2p_rcmgr_memory_allocations_allowed_total",
|
||||
Help: "allowed memory allocations",
|
||||
})
|
||||
prometheus.MustRegister(memoryAllowed)
|
||||
mustRegister(memoryAllowed)
|
||||
|
||||
memoryBlocked := prometheus.NewCounter(prometheus.CounterOpts{
|
||||
Name: "libp2p_rcmgr_memory_allocations_blocked_total",
|
||||
Help: "blocked memory allocations",
|
||||
})
|
||||
prometheus.MustRegister(memoryBlocked)
|
||||
mustRegister(memoryBlocked)
|
||||
|
||||
return rcmgrMetrics{
|
||||
connAllowed,
|
||||
|
@ -1632,13 +1632,10 @@ The [libp2p Network Resource Manager](https://github.com/libp2p/go-libp2p-resour
|
||||
and tracking recource usage over time.
|
||||
|
||||
#### `Swarm.ResourceMgr.Enabled`
|
||||
|
||||
**EXPERIMENTAL**: this feature is disabled by default, use with caution.
|
||||
|
||||
Enables the libp2p Network Resource Manager and auguments the default limits
|
||||
using user-defined ones in `Swarm.ResourceMgr.Limits` (if present).
|
||||
|
||||
Default: `false`
|
||||
Default: `true`
|
||||
|
||||
Type: `flag`
|
||||
|
||||
|
@ -656,6 +656,10 @@ leveldb_datastore_sync_latency_seconds_bucket
|
||||
leveldb_datastore_sync_latency_seconds_count
|
||||
leveldb_datastore_sync_latency_seconds_sum
|
||||
leveldb_datastore_sync_total
|
||||
libp2p_rcmgr_memory_allocations_allowed_total
|
||||
libp2p_rcmgr_memory_allocations_blocked_total
|
||||
libp2p_rcmgr_peer_blocked_total
|
||||
libp2p_rcmgr_peers_allowed_total
|
||||
process_cpu_seconds_total
|
||||
process_max_fds
|
||||
process_open_fds
|
||||
|
@ -17,40 +17,10 @@ test_expect_success 'disconnected: swarm stats requires running daemon' '
|
||||
test_should_contain "missing ResourceMgr" actual
|
||||
'
|
||||
|
||||
# swarm limit|stats should fail in online mode by default
|
||||
# because Resource Manager is opt-in
|
||||
# swarm limit|stats should succeed in online mode by default
|
||||
# because Resource Manager is opt-out
|
||||
test_launch_ipfs_daemon
|
||||
|
||||
test_expect_success 'ResourceMgr disabled by default: swarm limit requires Swarm.ResourceMgr.Enabled' '
|
||||
test_expect_code 1 ipfs swarm limit system 2> actual &&
|
||||
test_should_contain "missing ResourceMgr" actual
|
||||
'
|
||||
test_expect_success 'ResourceMgr disabled by default: swarm stats requires Swarm.ResourceMgr.Enabled' '
|
||||
test_expect_code 1 ipfs swarm stats all 2> actual &&
|
||||
test_should_contain "missing ResourceMgr" actual
|
||||
'
|
||||
|
||||
test_kill_ipfs_daemon
|
||||
|
||||
test_expect_success "setting an invalid limit should result in a failure" "
|
||||
test_expect_code 1 ipfs config --json Swarm.ResourceMgr.Limits.System.Conns 'asdf' 2> actual &&
|
||||
test_should_contain 'failed to unmarshal' actual
|
||||
"
|
||||
|
||||
# swarm limit|stat should work when Swarm.ResourceMgr.Enabled
|
||||
test_expect_success "test enabling resource manager" "
|
||||
ipfs config --json Swarm.ResourceMgr.Enabled true &&
|
||||
ipfs config --json Swarm.ResourceMgr &&
|
||||
jq -e '.Swarm.ResourceMgr.Enabled == true' < \"$IPFS_PATH/config\"
|
||||
"
|
||||
|
||||
test_launch_ipfs_daemon
|
||||
|
||||
test_expect_success "test setting system conns limit" "
|
||||
ipfs config --json Swarm.ResourceMgr.Enabled true &&
|
||||
ipfs config --json Swarm.ResourceMgr.Limits.System.Conns 99999
|
||||
"
|
||||
|
||||
# every scope has the same fields, so we only inspect System
|
||||
test_expect_success 'ResourceMgr enabled: swarm limit' '
|
||||
ipfs swarm limit system --enc=json | tee json &&
|
||||
@ -79,13 +49,18 @@ test_expect_success 'ResourceMgr enabled: swarm stats' '
|
||||
# shut down the daemon, set a limit in the config, and verify that it's applied
|
||||
test_kill_ipfs_daemon
|
||||
|
||||
test_expect_success "set system conn limit" "
|
||||
test_expect_success "Set system conns limit while daemon is not running" "
|
||||
ipfs config --json Swarm.ResourceMgr.Limits.System.Conns 99999
|
||||
"
|
||||
|
||||
test_expect_success "Set an invalid limit, which should result in a failure" "
|
||||
test_expect_code 1 ipfs config --json Swarm.ResourceMgr.Limits.System.Conns 'asdf' 2> actual &&
|
||||
test_should_contain 'failed to unmarshal' actual
|
||||
"
|
||||
|
||||
test_launch_ipfs_daemon
|
||||
|
||||
test_expect_success 'ResourceMgr enabled: swarm limit' '
|
||||
test_expect_success 'Ensure the new system conns limit is applied' '
|
||||
ipfs swarm limit system --enc=json | tee json &&
|
||||
jq -e ".Conns == 99999" < json
|
||||
'
|
||||
@ -152,4 +127,23 @@ test_expect_success 'Set limit for peer scope with an invalid peer ID' '
|
||||
|
||||
test_kill_ipfs_daemon
|
||||
|
||||
# test correct behavior when resource manager is disabled
|
||||
test_expect_success 'Disable resource manager' '
|
||||
ipfs config --bool Swarm.ResourceMgr.Enabled false
|
||||
'
|
||||
|
||||
test_launch_ipfs_daemon
|
||||
|
||||
test_expect_success 'Swarm limit should fail since RM is disabled' '
|
||||
test_expect_code 1 ipfs swarm limit system 2> actual &&
|
||||
test_should_contain "missing ResourceMgr" actual
|
||||
'
|
||||
|
||||
test_expect_success 'Swarm stats should fail since RM is disabled' '
|
||||
test_expect_code 1 ipfs swarm stats all 2> actual &&
|
||||
test_should_contain "missing ResourceMgr" actual
|
||||
'
|
||||
|
||||
test_kill_ipfs_daemon
|
||||
|
||||
test_done
|
||||
|
Reference in New Issue
Block a user