devmapper: Switch to xfs as default filesystem if supported
If platform supports xfs filesystem then use xfs as default filesystem for container rootfs instead of ext4. Reason being that ext4 is pre-allcating lot of metadata (around 1.8GB on 100G thin volume) and that can take long enough on AWS storage that systemd times out and docker fails to start. If one disables pre-allocation of ext4 metadata, then it will be allocated when containers are mounted and we will have multiple copies of metadata per container. For a 100G thin device, it was around 1.5GB of metadata per container. ext4 has an optimization to skip zeroing if discards are issued and underlying device guarantees that zero will be returned when discarded blocks are read back. devicemapper thin devices don't offer that guarantee so ext4 optimization does not kick in. In fact given discards are optional and can be dropped on the floor if need be, it looks like it might not be possible to guarantee that all the blocks got discarded and if read back zero will be returned. Signed-off-by: Anusha Ragunathan <anusha@docker.com> Signed-off-by: Vivek Goyal <vgoyal@redhat.com>
This commit is contained in:
parent
83a34e000b
commit
07ff17fb85
1 changed files with 36 additions and 0 deletions
|
@ -3,6 +3,7 @@
|
|||
package devmapper
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
|
@ -532,7 +533,42 @@ func (devices *DeviceSet) activateDeviceIfNeeded(info *devInfo, ignoreDeleted bo
|
|||
return devicemapper.ActivateDevice(devices.getPoolDevName(), info.Name(), info.DeviceID, info.Size)
|
||||
}
|
||||
|
||||
// Return true only if kernel supports xfs and mkfs.xfs is available
|
||||
func xfsSupported() bool {
|
||||
// Make sure mkfs.xfs is available
|
||||
if _, err := exec.LookPath("mkfs.xfs"); err != nil {
|
||||
return false
|
||||
}
|
||||
|
||||
// Check if kernel supports xfs filesystem or not.
|
||||
exec.Command("modprobe", "xfs").Run()
|
||||
|
||||
f, err := os.Open("/proc/filesystems")
|
||||
if err != nil {
|
||||
logrus.Warnf("Could not check if xfs is supported: %v", err)
|
||||
return false
|
||||
}
|
||||
defer f.Close()
|
||||
|
||||
s := bufio.NewScanner(f)
|
||||
for s.Scan() {
|
||||
if strings.HasSuffix(s.Text(), "\txfs") {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
if err := s.Err(); err != nil {
|
||||
logrus.Warnf("Could not check if xfs is supported: %v", err)
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func determineDefaultFS() string {
|
||||
if xfsSupported() {
|
||||
return "xfs"
|
||||
}
|
||||
|
||||
logrus.Warn("XFS is not supported in your system. Either the kernel doesnt support it or mkfs.xfs is not in your PATH. Defaulting to ext4 filesystem")
|
||||
return "ext4"
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue