mirror of
https://github.com/minio/minio.git
synced 2025-01-25 21:53:16 -05:00
3bf67668b6
This is necessary where in certain environments where cgroup is used to limit memory usage of a container or a particular process. GetStats() is used by caching module to figure out the optimal cacheable size in memory with cgroup limits what sysinfo reports might not be the right value set for a given process. Fixes #4001
83 lines
2.2 KiB
Go
83 lines
2.2 KiB
Go
// +build linux
|
|
|
|
/*
|
|
* Minio Cloud Storage, (C) 2016,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 (
|
|
"os"
|
|
"syscall"
|
|
|
|
"github.com/minio/minio/pkg/cgroup"
|
|
)
|
|
|
|
// Get the final system memory limit chosen by the user.
|
|
// by default without any configuration on a vanilla Linux
|
|
// system you would see physical RAM limit. If cgroup
|
|
// is configured at some point in time this function
|
|
// would return the memory limit chosen for the given pid.
|
|
func getMemoryLimit() (sysLimit uint64, err error) {
|
|
if sysLimit, err = getSysinfoMemoryLimit(); err != nil {
|
|
// Physical memory info is not accessible, just exit here.
|
|
return 0, err
|
|
}
|
|
|
|
// Following code is deliberately ignoring the error.
|
|
cGroupLimit, gerr := cgroup.GetMemoryLimit(os.Getpid())
|
|
if gerr != nil {
|
|
// Upon error just return system limit.
|
|
return sysLimit, nil
|
|
}
|
|
|
|
// cgroup limit is lesser than system limit means
|
|
// user wants to limit the memory usage further
|
|
// treat cgroup limit as the system limit.
|
|
if cGroupLimit <= sysLimit {
|
|
sysLimit = cGroupLimit
|
|
}
|
|
|
|
// Final system limit.
|
|
return sysLimit, nil
|
|
|
|
}
|
|
|
|
// Get physical RAM size of the node.
|
|
func getSysinfoMemoryLimit() (limit uint64, err error) {
|
|
var si syscall.Sysinfo_t
|
|
if err = syscall.Sysinfo(&si); err != nil {
|
|
return 0, err
|
|
}
|
|
|
|
// Total RAM is always the multiplicative value
|
|
// of unit size and total ram.
|
|
limit = uint64(si.Unit) * si.Totalram
|
|
return limit, nil
|
|
}
|
|
|
|
// GetStats - return system statistics, currently only
|
|
// supported value is TotalRAM.
|
|
func GetStats() (stats Stats, err error) {
|
|
var limit uint64
|
|
limit, err = getMemoryLimit()
|
|
if err != nil {
|
|
return Stats{}, err
|
|
}
|
|
|
|
stats.TotalRAM = limit
|
|
return stats, nil
|
|
}
|