From 53f3d2fd65b47dbcd25b5c75600d1fc078e16bae Mon Sep 17 00:00:00 2001 From: "A. Elleuch" Date: Tue, 3 Oct 2017 18:37:45 +0100 Subject: [PATCH] Push max threads to little less than kernel limit (#5001) Let Minio server use more threads than allowed by golang runtime. This is important to better deal with high load. --- cmd/server-rlimit.go | 17 ++++++++++++++++- pkg/sys/threads.go | 38 ++++++++++++++++++++++++++++++++++++++ pkg/sys/threads_other.go | 26 ++++++++++++++++++++++++++ 3 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 pkg/sys/threads.go create mode 100644 pkg/sys/threads_other.go diff --git a/cmd/server-rlimit.go b/cmd/server-rlimit.go index 16a1db4f7..1d4d2d030 100644 --- a/cmd/server-rlimit.go +++ b/cmd/server-rlimit.go @@ -16,9 +16,24 @@ package cmd -import "github.com/minio/minio/pkg/sys" +import ( + "runtime/debug" + + "github.com/minio/minio/pkg/sys" +) func setMaxResources() (err error) { + // Set the Go runtime max threads threshold to 90% of kernel setting. + // Do not return when an error when encountered since it is not a crucial task. + sysMaxThreads, mErr := sys.GetMaxThreads() + if mErr == nil { + minioMaxThreads := (sysMaxThreads * 90) / 100 + // Only set max threads if it is greater than the default one + if minioMaxThreads > 10000 { + debug.SetMaxThreads(minioMaxThreads) + } + } + var maxLimit uint64 // Set open files limit to maximum. diff --git a/pkg/sys/threads.go b/pkg/sys/threads.go new file mode 100644 index 000000000..18a94238e --- /dev/null +++ b/pkg/sys/threads.go @@ -0,0 +1,38 @@ +// +build linux + +/* + * Minio Cloud Storage, (C) 2017 Minio, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package sys + +import ( + "io/ioutil" + "strconv" + "strings" +) + +// GetMaxThreads returns the maximum number of threads that the system can create. +func GetMaxThreads() (int, error) { + sysMaxThreadsStr, err := ioutil.ReadFile("/proc/sys/kernel/threads-max") + if err != nil { + return 0, err + } + sysMaxThreads, err := strconv.Atoi(strings.TrimSpace(string(sysMaxThreadsStr))) + if err != nil { + return 0, err + } + return sysMaxThreads, nil +} diff --git a/pkg/sys/threads_other.go b/pkg/sys/threads_other.go new file mode 100644 index 000000000..051b07876 --- /dev/null +++ b/pkg/sys/threads_other.go @@ -0,0 +1,26 @@ +// +build !linux + +/* + * Minio Cloud Storage, (C) 2017 Minio, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package sys + +import "errors" + +// GetMaxThreads returns the maximum number of threads that the system can create. +func GetMaxThreads() (int, error) { + return 0, errors.New("getting max threads is not supported") +}