[#22] node: Add optional linters

Includes `block` and `mutex` profiles configuration.

Signed-off-by: Pavel Karpy <p.karpy@yadro.com>
This commit is contained in:
Pavel Karpy 2023-02-01 10:21:17 +03:00
parent 2540598779
commit 55da69adac
7 changed files with 82 additions and 6 deletions

View file

@ -1,6 +1,7 @@
package profilerconfig package profilerconfig
import ( import (
"runtime"
"time" "time"
"github.com/TrueCloudLab/frostfs-node/cmd/frostfs-node/config" "github.com/TrueCloudLab/frostfs-node/cmd/frostfs-node/config"
@ -51,3 +52,35 @@ func Address(c *config.Config) string {
return AddressDefault return AddressDefault
} }
const profilesSubsection = "profiles"
// Profiles returns structure that provides access to a "profiles"
// configuration subsection.
func Profiles(c *config.Config) ProfilesConfig {
runtime.SetBlockProfileRate()
runtime.SetMutexProfileFraction()
return ProfilesConfig{
c.Sub(subsection).Sub(profilesSubsection),
}
}
// ProfilesConfig is a wrapper over "pprof.profiles" config section
// which provides access to the configuration of the specific
// profiles.
type ProfilesConfig struct {
cfg *config.Config
}
// BlockRates returns the value of "block" config parameter
// from "pprof.profiles" section.
func (c ProfilesConfig) BlockRates() int {
return int(config.IntSafe(c.cfg, "block"))
}
// MutexRate returns the value of "mutex" config parameter
// from "pprof.profiles" section.
func (c ProfilesConfig) MutexRate() int {
return int(config.IntSafe(c.cfg, "mutex"))
}

View file

@ -18,6 +18,11 @@ func TestProfilerSection(t *testing.T) {
require.Equal(t, profilerconfig.ShutdownTimeoutDefault, to) require.Equal(t, profilerconfig.ShutdownTimeoutDefault, to)
require.Equal(t, profilerconfig.AddressDefault, addr) require.Equal(t, profilerconfig.AddressDefault, addr)
require.False(t, profilerconfig.Enabled(configtest.EmptyConfig())) require.False(t, profilerconfig.Enabled(configtest.EmptyConfig()))
pp := profilerconfig.Profiles(configtest.EmptyConfig())
require.Zero(t, pp.BlockRates())
require.Zero(t, pp.MutexRate())
}) })
const path = "../../../../config/example/node" const path = "../../../../config/example/node"
@ -29,6 +34,11 @@ func TestProfilerSection(t *testing.T) {
require.Equal(t, 15*time.Second, to) require.Equal(t, 15*time.Second, to)
require.Equal(t, "localhost:6060", addr) require.Equal(t, "localhost:6060", addr)
require.True(t, profilerconfig.Enabled(c)) require.True(t, profilerconfig.Enabled(c))
pp := profilerconfig.Profiles(c)
require.Equal(t, int(1), pp.BlockRates())
require.Equal(t, int(1), pp.MutexRate())
} }
configtest.ForEachFileType(path, fileConfigTest) configtest.ForEachFileType(path, fileConfigTest)

View file

@ -2,6 +2,7 @@ package main
import ( import (
"context" "context"
"runtime"
profilerconfig "github.com/TrueCloudLab/frostfs-node/cmd/frostfs-node/config/profiler" profilerconfig "github.com/TrueCloudLab/frostfs-node/cmd/frostfs-node/config/profiler"
httputil "github.com/TrueCloudLab/frostfs-node/pkg/util/http" httputil "github.com/TrueCloudLab/frostfs-node/pkg/util/http"
@ -14,6 +15,19 @@ func initProfiler(c *cfg) {
return return
} }
profiles := profilerconfig.Profiles(c.appCfg)
blockRate := profiles.BlockRates()
mutexRate := profiles.MutexRate()
if mutexRate == 0 {
// according to docs, setting mutex rate to "0" just
// returns current rate not disables it
mutexRate = -1
}
runtime.SetBlockProfileRate(blockRate)
runtime.SetMutexProfileFraction(mutexRate)
var prm httputil.Prm var prm httputil.Prm
prm.Address = profilerconfig.Address(c.appCfg) prm.Address = profilerconfig.Address(c.appCfg)

View file

@ -3,6 +3,8 @@ NEOFS_LOGGER_LEVEL=debug
NEOFS_PPROF_ENABLED=true NEOFS_PPROF_ENABLED=true
NEOFS_PPROF_ADDRESS=localhost:6060 NEOFS_PPROF_ADDRESS=localhost:6060
NEOFS_PPROF_SHUTDOWN_TIMEOUT=15s NEOFS_PPROF_SHUTDOWN_TIMEOUT=15s
NEOFS_PPROF_PROFILES_BLOCK=1
NEOFS_PPROF_PROFILES_MUTEX=1
NEOFS_PROMETHEUS_ENABLED=true NEOFS_PROMETHEUS_ENABLED=true
NEOFS_PROMETHEUS_ADDRESS=localhost:9090 NEOFS_PROMETHEUS_ADDRESS=localhost:9090

View file

@ -5,7 +5,11 @@
"pprof": { "pprof": {
"enabled": true, "enabled": true,
"address": "localhost:6060", "address": "localhost:6060",
"shutdown_timeout": "15s" "shutdown_timeout": "15s",
"profiles": {
"block": 1,
"mutex": 1
}
}, },
"prometheus": { "prometheus": {
"enabled": true, "enabled": true,

View file

@ -5,6 +5,9 @@ pprof:
enabled: true enabled: true
address: localhost:6060 # endpoint for Node profiling address: localhost:6060 # endpoint for Node profiling
shutdown_timeout: 15s # timeout for profiling HTTP server graceful shutdown shutdown_timeout: 15s # timeout for profiling HTTP server graceful shutdown
profiles:
block: 1 # sampling rate: an average of one blocking event per rate nanoseconds spent blocked is reported; "1" reports every blocking event; "0" disables profiler
mutex: 1 # sampling rate: on average 1/rate events are reported; "0" disables profiler
prometheus: prometheus:
enabled: true enabled: true

View file

@ -75,13 +75,23 @@ element.
Contains configuration for the `pprof` profiler. Contains configuration for the `pprof` profiler.
| Parameter | Type | Default value | Description | | Parameter | Type | Default value | Description |
|--------------------|------------|---------------|-----------------------------------------| |--------------------|-----------------------------------------|---------------|-----------------------------------------|
| `enabled` | `bool` | `false` | Flag to enable the service. | | `enabled` | `bool` | `false` | Flag to enable the service. |
| `address` | `string` | | Address that service listener binds to. | | `address` | `string` | | Address that service listener binds to. |
| `shutdown_timeout` | `duration` | `30s` | Time to wait for a graceful shutdown. | | `shutdown_timeout` | `duration` | `30s` | Time to wait for a graceful shutdown. |
| `profiles` | [Profiles config](#profiles-subsection) | | Optional profiles configuration |
## `profiles` subsection
Contains optional profiles configuration.
| Parameter | Type | Default value | Description |
|-----------|-------|---------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `block` | `int` | `0` | Controls the fraction of goroutine blocking events that are reported in the blocking profile. The profiler aims to sample an average of one blocking event per rate nanoseconds spent blocked. Non-positive values disable profiler reports. |
| `mutex` | `int` | `0` | Controls the fraction of mutex contention events that are reported in the mutex profile. On average 1/rate events are reported. The previous rate is returned. Non-positive values disable profiler reports. |
# `prometheus` section # `prometheus` section
Contains configuration for the `prometheus` metrics service. Contains configuration for the `prometheus` metrics service.