From f28b47bd87855f2c59786f2f6ac4401e3ef3681d Mon Sep 17 00:00:00 2001 From: Nishant Das Date: Fri, 20 May 2022 16:12:52 +0800 Subject: [PATCH] Raise Soft File Descriptor Limit Up To The Hard Limit (#10650) * add changes * comment * kasey's review Co-authored-by: prylabs-bulldozer[bot] <58059840+prylabs-bulldozer[bot]@users.noreply.github.com> --- cmd/beacon-chain/BUILD.bazel | 1 + cmd/beacon-chain/main.go | 4 ++++ runtime/fdlimits/BUILD.bazel | 22 ++++++++++++++++++++++ runtime/fdlimits/fdlimits.go | 25 +++++++++++++++++++++++++ runtime/fdlimits/fdlimits_test.go | 22 ++++++++++++++++++++++ 5 files changed, 74 insertions(+) create mode 100644 runtime/fdlimits/BUILD.bazel create mode 100644 runtime/fdlimits/fdlimits.go create mode 100644 runtime/fdlimits/fdlimits_test.go diff --git a/cmd/beacon-chain/BUILD.bazel b/cmd/beacon-chain/BUILD.bazel index 0a459e3f1..9696d754a 100644 --- a/cmd/beacon-chain/BUILD.bazel +++ b/cmd/beacon-chain/BUILD.bazel @@ -28,6 +28,7 @@ go_library( "//io/logs:go_default_library", "//monitoring/journald:go_default_library", "//runtime/debug:go_default_library", + "//runtime/fdlimits:go_default_library", "//runtime/maxprocs:go_default_library", "//runtime/tos:go_default_library", "//runtime/version:go_default_library", diff --git a/cmd/beacon-chain/main.go b/cmd/beacon-chain/main.go index 0bad5b33c..60fabd72a 100644 --- a/cmd/beacon-chain/main.go +++ b/cmd/beacon-chain/main.go @@ -24,6 +24,7 @@ import ( "github.com/prysmaticlabs/prysm/io/logs" "github.com/prysmaticlabs/prysm/monitoring/journald" "github.com/prysmaticlabs/prysm/runtime/debug" + "github.com/prysmaticlabs/prysm/runtime/fdlimits" _ "github.com/prysmaticlabs/prysm/runtime/maxprocs" "github.com/prysmaticlabs/prysm/runtime/tos" "github.com/prysmaticlabs/prysm/runtime/version" @@ -193,6 +194,9 @@ func main() { if err := debug.Setup(ctx); err != nil { return err } + if err := fdlimits.SetMaxFdLimits(); err != nil { + return err + } return cmd.ValidateNoArgs(ctx) } diff --git a/runtime/fdlimits/BUILD.bazel b/runtime/fdlimits/BUILD.bazel new file mode 100644 index 000000000..87350dde1 --- /dev/null +++ b/runtime/fdlimits/BUILD.bazel @@ -0,0 +1,22 @@ +load("@prysm//tools/go:def.bzl", "go_library", "go_test") + +go_library( + name = "go_default_library", + srcs = ["fdlimits.go"], + importpath = "github.com/prysmaticlabs/prysm/runtime/fdlimits", + visibility = ["//visibility:public"], + deps = [ + "@com_github_ethereum_go_ethereum//common/fdlimit:go_default_library", + "@com_github_sirupsen_logrus//:go_default_library", + ], +) + +go_test( + name = "go_default_test", + srcs = ["fdlimits_test.go"], + deps = [ + ":go_default_library", + "//testing/assert:go_default_library", + "@com_github_ethereum_go_ethereum//common/fdlimit:go_default_library", + ], +) diff --git a/runtime/fdlimits/fdlimits.go b/runtime/fdlimits/fdlimits.go new file mode 100644 index 000000000..ea2289c3b --- /dev/null +++ b/runtime/fdlimits/fdlimits.go @@ -0,0 +1,25 @@ +package fdlimits + +import ( + "github.com/ethereum/go-ethereum/common/fdlimit" + log "github.com/sirupsen/logrus" +) + +// SetMaxFdLimits is a wrapper around a few go-ethereum methods to allow prysm to +// set its file descriptor limits at the maximum possible value. +func SetMaxFdLimits() error { + curr, err := fdlimit.Current() + if err != nil { + return err + } + max, err := fdlimit.Maximum() + if err != nil { + return err + } + raisedVal, err := fdlimit.Raise(uint64(max)) + if err != nil { + return err + } + log.Infof("Raised fd limit to %d from %d", raisedVal, curr) + return nil +} diff --git a/runtime/fdlimits/fdlimits_test.go b/runtime/fdlimits/fdlimits_test.go new file mode 100644 index 000000000..d608a0d81 --- /dev/null +++ b/runtime/fdlimits/fdlimits_test.go @@ -0,0 +1,22 @@ +package fdlimits_test + +import ( + "testing" + + gethLimit "github.com/ethereum/go-ethereum/common/fdlimit" + "github.com/prysmaticlabs/prysm/runtime/fdlimits" + "github.com/prysmaticlabs/prysm/testing/assert" +) + +func TestSetMaxFdLimits(t *testing.T) { + assert.NoError(t, fdlimits.SetMaxFdLimits()) + + curr, err := gethLimit.Current() + assert.NoError(t, err) + + max, err := gethLimit.Maximum() + assert.NoError(t, err) + + assert.Equal(t, max, curr, "current and maximum file descriptor limits do not match up.") + +}