mirror of
https://github.com/containerd/containerd.git
synced 2026-08-08 09:01:21 +00:00
Enabling the IMMUTABLE_FL file attribute causes dirty data to be flushed synchronously at least on EXT4, which can greatly impact container launch performance. In contrast, the overlayfs snapshotter does not use syncfs by default. Most users may not need IMMUTABLE_FL, let's make IMMUTABLE_FL optional to align with the behavior of the overlayfs snapshotter and recover the original performance. 1. tensorflow Test commands: $ nerdctl image pull --snapshotter=X --unpack="false" tensorflow/tensorflow:2.19.0 $ time nerdctl container --snapshotter=X run -d tensorflow/tensorflow:2.19.0 /bin/sh Results: overlayfs | 0m18.748s erofs (no IMMUTABLE_FL) | 0m10.090s erofs (with IMMUTABLE_FL) | 0m21.074s 2. ubuntu 22.04 Test commands: $ nerdctl image pull --snapshotter=X --unpack="false" ubuntu:22.04 $ time nerdctl container --snapshotter=X run -d ubuntu:22.04 /bin/sh Results: overlayfs | 0m1.147s erofs (no IMMUTABLE_FL) | 0m0.795s erofs (with IMMUTABLE_FL) | 0m1.094s Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
80 lines
2.2 KiB
Go
80 lines
2.2 KiB
Go
/*
|
|
Copyright The containerd 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.
|
|
*/
|
|
|
|
package plugin
|
|
|
|
import (
|
|
"errors"
|
|
|
|
"github.com/containerd/containerd/v2/plugins"
|
|
"github.com/containerd/containerd/v2/plugins/snapshots/erofs"
|
|
"github.com/containerd/platforms"
|
|
"github.com/containerd/plugin"
|
|
"github.com/containerd/plugin/registry"
|
|
)
|
|
|
|
// Config represents configuration for the native plugin.
|
|
type Config struct {
|
|
// Root directory for the plugin
|
|
RootPath string `toml:"root_path"`
|
|
|
|
// MountOptions are options used for the EROFS overlayfs mount
|
|
OvlOptions []string `toml:"ovl_mount_options"`
|
|
|
|
// EnableFsverity enables fsverity for EROFS layers
|
|
EnableFsverity bool `toml:"enable_fsverity"`
|
|
|
|
// If `SetImmutable` is enabled, IMMUTABLE_FL will be set on layer blobs.
|
|
SetImmutable bool `toml:"set_immutable"`
|
|
}
|
|
|
|
func init() {
|
|
registry.Register(&plugin.Registration{
|
|
Type: plugins.SnapshotPlugin,
|
|
ID: "erofs",
|
|
Config: &Config{},
|
|
InitFn: func(ic *plugin.InitContext) (interface{}, error) {
|
|
ic.Meta.Platforms = append(ic.Meta.Platforms, platforms.DefaultSpec())
|
|
|
|
config, ok := ic.Config.(*Config)
|
|
if !ok {
|
|
return nil, errors.New("invalid erofs configuration")
|
|
}
|
|
|
|
var opts []erofs.Opt
|
|
root := ic.Properties[plugins.PropertyRootDir]
|
|
if len(config.RootPath) != 0 {
|
|
root = config.RootPath
|
|
}
|
|
|
|
if len(config.OvlOptions) > 0 {
|
|
opts = append(opts, erofs.WithOvlOptions(config.OvlOptions))
|
|
}
|
|
|
|
if config.EnableFsverity {
|
|
opts = append(opts, erofs.WithFsverity())
|
|
}
|
|
|
|
if config.SetImmutable {
|
|
opts = append(opts, erofs.WithImmutable())
|
|
}
|
|
|
|
ic.Meta.Exports[plugins.SnapshotterRootDir] = root
|
|
return erofs.NewSnapshotter(root, opts...)
|
|
},
|
|
})
|
|
}
|