Merge pull request #12750 from ptabor/20210306-mlock

--experimental-memory-mlock support
This commit is contained in:
Gyuho Lee
2021-03-09 09:13:40 -08:00
committed by GitHub
18 changed files with 104 additions and 16 deletions

View File

@@ -169,6 +169,14 @@ type ServerConfig struct {
UnsafeNoFsync bool `json:"unsafe-no-fsync"`
DowngradeCheckTime time.Duration
// ExperimentalMemoryMlock enables mlocking of etcd owned memory pages.
// The setting improves etcd tail latency in environments were:
// - memory pressure might lead to swapping pages to disk
// - disk latency might be unstable
// Currently all etcd memory gets mlocked, but in future the flag can
// be refined to mlock in-use area of bbolt only.
ExperimentalMemoryMlock bool `json:"experimental-memory-mlock"`
}
// VerifyBootstrap sanity-checks the initial config for bootstrap case

View File

@@ -0,0 +1,27 @@
// Copyright 2021 The etcd Authors
//
// 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.
//go:build windows
// +build windows
package etcdserver
import (
"errors"
)
// MlockAll prevents current and future mmaped memory areas from being swapped out.
func MlockAll() error {
return errors.New("Mlockall is supported only on UNIX systems.")
}

View File

@@ -0,0 +1,33 @@
// Copyright 2021 The etcd Authors
//
// 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.
//go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || zos
// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris zos
package etcdserver
import (
"fmt"
"golang.org/x/sys/unix"
)
// MlockAll prevents current and future mmaped memory areas from being swapped out.
func MlockAll() error {
err := unix.Mlockall(unix.MCL_FUTURE | unix.MCL_CURRENT)
if err != nil {
return fmt.Errorf("cannot mlockAll: %v", err)
}
return nil
}

View File

@@ -316,6 +316,14 @@ func NewServer(cfg ServerConfig) (srv *EtcdServer, err error) {
)
}
if cfg.ExperimentalMemoryMlock {
cfg.Logger.Info("mlocking memory")
err := MlockAll()
if err != nil {
return nil, err
}
}
if terr := fileutil.TouchDirAll(cfg.DataDir); terr != nil {
return nil, fmt.Errorf("cannot access data directory: %v", terr)
}