From 3bf935af35bf6d2ac16910e75c83d76860aade55 Mon Sep 17 00:00:00 2001 From: Arne Juul Date: Mon, 31 Oct 2022 14:55:14 +0000 Subject: use common tuning code --- client/go/script-utils/startcbinary/tuning.go | 41 +--------------- client/go/util/setrlimit.go | 13 ++++- client/go/util/tuning.go | 69 +++++++++++++++++++++++++++ 3 files changed, 82 insertions(+), 41 deletions(-) create mode 100644 client/go/util/tuning.go (limited to 'client') diff --git a/client/go/script-utils/startcbinary/tuning.go b/client/go/script-utils/startcbinary/tuning.go index dbe4d34dabe..950842babd6 100644 --- a/client/go/script-utils/startcbinary/tuning.go +++ b/client/go/script-utils/startcbinary/tuning.go @@ -4,47 +4,10 @@ package startcbinary import ( - "os" - "strconv" - "strings" - - "github.com/vespa-engine/vespa/client/go/trace" "github.com/vespa-engine/vespa/client/go/util" ) -func (spec *ProgSpec) optionallyReduceBaseFrequency() { - if spec.getenv(ENV_VESPA_TIMER_HZ) == "" { - backticks := util.BackTicksIgnoreStderr - out, _ := backticks.Run("uname", "-r") - if strings.Contains(out, "linuxkit") { - trace.Trace("Running docker on macos. Reducing base frequency from 1000hz to 100hz due to high cost of sampling time. This will reduce timeout accuracy.") - spec.setenv(ENV_VESPA_TIMER_HZ, "100") - } - } -} - -func getThpSizeMb() int { - const fn = "/sys/kernel/mm/transparent_hugepage/hpage_pmd_size" - thp_size := 2 - line, err := os.ReadFile(fn) - if err == nil { - chomped := strings.TrimSuffix(string(line), "\n") - number, err := strconv.Atoi(chomped) - if err == nil { - thp_size = number / (1024 * 1024) - trace.Trace("thp_size", chomped, "=>", thp_size) - } else { - trace.Trace("no thp_size:", err) - } - } else { - trace.Trace("no thp_size:", err) - } - return thp_size -} - func (spec *ProgSpec) configureTuning() { - spec.optionallyReduceBaseFrequency() - util.SetResourceLimit(util.RLIMIT_CORE, util.NO_RLIMIT) - util.SetResourceLimit(util.RLIMIT_NOFILE, 262144) - util.SetResourceLimit(util.RLIMIT_NPROC, 409600) + util.OptionallyReduceTimerFrequency() + util.TuneResourceLimits() } diff --git a/client/go/util/setrlimit.go b/client/go/util/setrlimit.go index 4ec1ea60a3c..6a78e47d35b 100644 --- a/client/go/util/setrlimit.go +++ b/client/go/util/setrlimit.go @@ -5,9 +5,11 @@ package util import ( + "os" + "strconv" + "github.com/vespa-engine/vespa/client/go/trace" "golang.org/x/sys/unix" - "os" ) type ResourceId int @@ -31,6 +33,13 @@ func (rid ResourceId) String() string { return "unknown resource id" } +func readableLimit(val uint64) string { + if val == NO_RLIMIT { + return "unlimited" + } + return strconv.FormatUint(val, 10) +} + func SetResourceLimit(resource ResourceId, newVal uint64) { var current unix.Rlimit err := unix.Getrlimit(int(resource), ¤t) @@ -57,6 +66,6 @@ func SetResourceLimit(resource ResourceId, newVal uint64) { if err != nil { trace.Trace("Failed setting resource limit:", err) } else { - trace.Trace("Resource limit", resource, "adjusted OK:", wanted.Cur, "/", wanted.Max) + trace.Trace("Resource limit", resource, "adjusted OK:", readableLimit(wanted.Cur), "/", readableLimit(wanted.Max)) } } diff --git a/client/go/util/tuning.go b/client/go/util/tuning.go new file mode 100644 index 00000000000..a8f6eab286a --- /dev/null +++ b/client/go/util/tuning.go @@ -0,0 +1,69 @@ +// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +// Author: arnej + +package util + +import ( + "os" + "strconv" + "strings" + + "github.com/vespa-engine/vespa/client/go/trace" +) + +const ( + ENV_VESPA_TIMER_HZ = "VESPA_TIMER_HZ" +) + +func OptionallyReduceTimerFrequency() { + if os.Getenv(ENV_VESPA_TIMER_HZ) == "" { + backticks := BackTicksIgnoreStderr + out, _ := backticks.Run("uname", "-r") + if strings.Contains(out, "linuxkit") { + trace.Trace( + "Running docker on macos.", + "Reducing base frequency from 1000hz to 100hz due to high cost of sampling time.", + "This will reduce timeout accuracy.") + os.Setenv(ENV_VESPA_TIMER_HZ, "100") + } + } +} + +func TuneResourceLimits() { + var numfiles uint64 = 262144 + var numprocs uint64 = 409600 + if env := os.Getenv("file_descriptor_limit"); env != "" { + n, err := strconv.Atoi(env) + if err != nil { + numfiles = uint64(n) + } + } + if env := os.Getenv("num_processes_limit"); env != "" { + n, err := strconv.Atoi(env) + if err != nil { + numprocs = uint64(n) + } + } + SetResourceLimit(RLIMIT_CORE, NO_RLIMIT) + SetResourceLimit(RLIMIT_NOFILE, numfiles) + SetResourceLimit(RLIMIT_NPROC, numprocs) +} + +func GetThpSizeMb() int { + const fn = "/sys/kernel/mm/transparent_hugepage/hpage_pmd_size" + thp_size := 2 + line, err := os.ReadFile(fn) + if err == nil { + chomped := strings.TrimSuffix(string(line), "\n") + number, err := strconv.Atoi(chomped) + if err == nil { + thp_size = number / (1024 * 1024) + trace.Trace("thp_size", chomped, "=>", thp_size) + } else { + trace.Trace("no thp_size:", err) + } + } else { + trace.Trace("no thp_size:", err) + } + return thp_size +} -- cgit v1.2.3