cmd/utils: allow file descriptor limit to be set via CLI (#24477)

This commit is contained in:
Daniel Liu 2024-07-10 10:27:49 +08:00 committed by Daniel Liu
parent 514b4ce7c5
commit 020fac603c
4 changed files with 32 additions and 13 deletions

View file

@ -93,6 +93,7 @@ var (
//utils.CacheDatabaseFlag, //utils.CacheDatabaseFlag,
//utils.CacheGCFlag, //utils.CacheGCFlag,
//utils.TrieCacheGenFlag, //utils.TrieCacheGenFlag,
utils.FDLimitFlag,
utils.ListenPortFlag, utils.ListenPortFlag,
utils.MaxPeersFlag, utils.MaxPeersFlag,
utils.MaxPendingPeersFlag, utils.MaxPendingPeersFlag,

View file

@ -123,15 +123,16 @@ var AppHelpFlagGroups = []flagGroup{
// utils.TxPoolLifetimeFlag, // utils.TxPoolLifetimeFlag,
// }, // },
//}, //},
//{ {
// Name: "PERFORMANCE TUNING", Name: "PERFORMANCE TUNING",
// Flags: []cli.Flag{ Flags: []cli.Flag{
// utils.CacheFlag, // utils.CacheFlag,
// utils.CacheDatabaseFlag, // utils.CacheDatabaseFlag,
// utils.CacheGCFlag, // utils.CacheGCFlag,
// utils.TrieCacheGenFlag, // utils.TrieCacheGenFlag,
// }, utils.FDLimitFlag,
//}, },
},
{ {
Name: "ACCOUNT", Name: "ACCOUNT",
Flags: []cli.Flag{ Flags: []cli.Flag{

View file

@ -52,7 +52,7 @@ type ResultProcessNode struct {
func main() { func main() {
flag.Parse() flag.Parse()
db, _ := leveldb.New(*dir, ethconfig.Defaults.DatabaseCache, utils.MakeDatabaseHandles(), "") db, _ := leveldb.New(*dir, ethconfig.Defaults.DatabaseCache, utils.MakeDatabaseHandles(0), "")
lddb := rawdb.NewDatabase(db) lddb := rawdb.NewDatabase(db)
head := core.GetHeadBlockHash(lddb) head := core.GetHeadBlockHash(lddb)
currentHeader := core.GetHeader(lddb, head, core.GetBlockNumber(lddb, head)) currentHeader := core.GetHeader(lddb, head, core.GetBlockNumber(lddb, head))

View file

@ -313,6 +313,10 @@ var (
Usage: "Percentage of cache memory allowance to use for trie pruning", Usage: "Percentage of cache memory allowance to use for trie pruning",
Value: 25, Value: 25,
} }
FDLimitFlag = cli.IntFlag{
Name: "fdlimit",
Usage: "Raise the open file descriptor resource limit (default = system fd limit)",
}
// Miner settings // Miner settings
StakingEnabledFlag = cli.BoolFlag{ StakingEnabledFlag = cli.BoolFlag{
Name: "mine", Name: "mine",
@ -817,11 +821,24 @@ func setPrefix(ctx *cli.Context, cfg *node.Config) {
// MakeDatabaseHandles raises out the number of allowed file handles per process // MakeDatabaseHandles raises out the number of allowed file handles per process
// for XDC and returns half of the allowance to assign to the database. // for XDC and returns half of the allowance to assign to the database.
func MakeDatabaseHandles() int { func MakeDatabaseHandles(max int) int {
limit, err := fdlimit.Maximum() limit, err := fdlimit.Maximum()
if err != nil { if err != nil {
Fatalf("Failed to retrieve file descriptor allowance: %v", err) Fatalf("Failed to retrieve file descriptor allowance: %v", err)
} }
switch {
case max == 0:
// User didn't specify a meaningful value, use system limits
case max < 128:
// User specified something unhealthy, just use system defaults
log.Error("File descriptor limit invalid (<128)", "had", max, "updated", limit)
case max > limit:
// User requested more than the OS allows, notify that we can't allocate it
log.Warn("Requested file descriptors denied by OS", "req", max, "limit", limit)
default:
// User limit is meaningful and within allowed range, use that
limit = max
}
raised, err := fdlimit.Raise(uint64(limit)) raised, err := fdlimit.Raise(uint64(limit))
if err != nil { if err != nil {
Fatalf("Failed to raise file descriptor allowance: %v", err) Fatalf("Failed to raise file descriptor allowance: %v", err)
@ -1179,7 +1196,7 @@ func SetEthConfig(ctx *cli.Context, stack *node.Node, cfg *ethconfig.Config) {
if ctx.GlobalIsSet(CacheFlag.Name) || ctx.GlobalIsSet(CacheDatabaseFlag.Name) { if ctx.GlobalIsSet(CacheFlag.Name) || ctx.GlobalIsSet(CacheDatabaseFlag.Name) {
cfg.DatabaseCache = ctx.GlobalInt(CacheFlag.Name) * ctx.GlobalInt(CacheDatabaseFlag.Name) / 100 cfg.DatabaseCache = ctx.GlobalInt(CacheFlag.Name) * ctx.GlobalInt(CacheDatabaseFlag.Name) / 100
} }
cfg.DatabaseHandles = MakeDatabaseHandles() cfg.DatabaseHandles = MakeDatabaseHandles(ctx.GlobalInt(FDLimitFlag.Name))
if gcmode := ctx.GlobalString(GCModeFlag.Name); gcmode != "full" && gcmode != "archive" { if gcmode := ctx.GlobalString(GCModeFlag.Name); gcmode != "full" && gcmode != "archive" {
Fatalf("--%s must be either 'full' or 'archive'", GCModeFlag.Name) Fatalf("--%s must be either 'full' or 'archive'", GCModeFlag.Name)
@ -1268,7 +1285,7 @@ func SetupNetwork(ctx *cli.Context) {
func MakeChainDatabase(ctx *cli.Context, stack *node.Node) ethdb.Database { func MakeChainDatabase(ctx *cli.Context, stack *node.Node) ethdb.Database {
var ( var (
cache = ctx.GlobalInt(CacheFlag.Name) * ctx.GlobalInt(CacheDatabaseFlag.Name) / 100 cache = ctx.GlobalInt(CacheFlag.Name) * ctx.GlobalInt(CacheDatabaseFlag.Name) / 100
handles = MakeDatabaseHandles() handles = MakeDatabaseHandles(ctx.GlobalInt(FDLimitFlag.Name))
) )
name := "chaindata" name := "chaindata"
if ctx.GlobalBool(LightModeFlag.Name) { if ctx.GlobalBool(LightModeFlag.Name) {