Object-cache: enforce cache size to be less than RAM. (#2338)

master
Krishna Srinivas 8 years ago committed by Harshavardhana
parent 1494af485e
commit 69fd196471
  1. 27
      pkg/sys/stats.go
  2. 24
      pkg/sys/stats_bsd.go
  3. 51
      pkg/sys/stats_darwin.go
  4. 34
      pkg/sys/stats_linux.go
  5. 55
      pkg/sys/stats_windows.go
  6. 17
      server-rlimit-nix.go

@ -0,0 +1,27 @@
/*
* Minio Cloud Storage, (C) 2016 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"
// ErrNotImplemented - GetStats() is not implemented on bsds.
var ErrNotImplemented = errors.New("not implemented")
// Stats - system statistics.
type Stats struct {
TotalRAM uint64 // Physical RAM size in bytes,
}

@ -0,0 +1,24 @@
// +build !linux,!windows,!darwin
/*
* Minio Cloud Storage, (C) 2016 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
// GetStats - return system statistics for windows.
func GetStats() (stats Stats, err error) {
return Stats{}, ErrNotImplemented
}

@ -0,0 +1,51 @@
// +build darwin
/*
* Minio Cloud Storage, (C) 2016 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 (
"encoding/binary"
"syscall"
)
func getHwMemsize() (uint64, error) {
totalString, err := syscall.Sysctl("hw.memsize")
if err != nil {
return 0, err
}
// syscall.sysctl() helpfully assumes the result is a null-terminated string and
// removes the last byte of the result if it's 0 :/
totalString += "\x00"
total := uint64(binary.LittleEndian.Uint64([]byte(totalString)))
return total, nil
}
// GetStats - return system statistics for windows.
func GetStats() (stats Stats, err error) {
memSize, err := getHwMemsize()
if err != nil {
return Stats{}, err
}
stats = Stats{
TotalRAM: memSize,
}
return stats, nil
}

@ -0,0 +1,34 @@
// +build linux
/*
* Minio Cloud Storage, (C) 2016 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 "syscall"
// GetStats - return system statistics.
func GetStats() (stats Stats, err error) {
si := syscall.Sysinfo_t{}
err = syscall.Sysinfo(&si)
if err != nil {
return
}
stats = Stats{
TotalRAM: si.Totalram,
}
return stats, nil
}

@ -0,0 +1,55 @@
// +build windows
/*
* Minio Cloud Storage, (C) 2016 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 (
"syscall"
"unsafe"
)
var (
modkernel32 = syscall.NewLazyDLL("kernel32.dll")
procGlobalMemoryStatusEx = modkernel32.NewProc("GlobalMemoryStatusEx")
)
type memoryStatusEx struct {
cbSize uint32
dwMemoryLoad uint32
ullTotalPhys uint64 // in bytes
ullAvailPhys uint64
ullTotalPageFile uint64
ullAvailPageFile uint64
ullTotalVirtual uint64
ullAvailVirtual uint64
ullAvailExtendedVirtual uint64
}
// GetStats - return system statistics for windows.
func GetStats() (stats Stats, err error) {
var memInfo memoryStatusEx
memInfo.cbSize = uint32(unsafe.Sizeof(memInfo))
mem, _, _ := procGlobalMemoryStatusEx.Call(uintptr(unsafe.Pointer(&memInfo)))
if mem == 0 {
return Stats{}, syscall.GetLastError()
}
stats = Stats{
TotalRAM: memInfo.ullTotalPhys,
}
return stats, nil
}

@ -18,7 +18,11 @@
package main package main
import "syscall" import (
"syscall"
"github.com/minio/minio/pkg/sys"
)
// For all unixes we need to bump allowed number of open files to a // For all unixes we need to bump allowed number of open files to a
// higher value than its usual default of '1024'. The reasoning is // higher value than its usual default of '1024'. The reasoning is
@ -72,5 +76,16 @@ func setMaxMemory() error {
if rLimit.Cur < globalMaxCacheSize { if rLimit.Cur < globalMaxCacheSize {
globalMaxCacheSize = (80 / 100) * rLimit.Cur globalMaxCacheSize = (80 / 100) * rLimit.Cur
} }
// Make sure globalMaxCacheSize is less than RAM size.
stats, err := sys.GetStats()
if err != nil && err != sys.ErrNotImplemented {
// sys.GetStats() is implemented only on linux. Ignore errors
// from other OSes.
return err
}
if err == nil && stats.TotalRAM < globalMaxCacheSize {
globalMaxCacheSize = (80 / 100) * stats.TotalRAM
}
return nil return nil
} }

Loading…
Cancel
Save