Linux Overlay(通常指 OverlayFS)的优化可以从内核参数、挂载选项、存储布局、I/O 调度、容器/应用层等多个维度入手。下面按“最常用 → 进阶 → 容器场景”给你一个系统化的优化清单。
overlay2(Docker 默认)overlay(旧版,性能差)cat /proc/filesystems | grep overlay
Docker 推荐:
docker info | grep -i storage
原则:
lowerdir:只读,尽量放在 SSD / 高性能磁盘upperdir:可写,必须 SSDworkdir:临时目录,必须和 upperdir 同文件系统✅ 推荐结构:
/var/overlay/
├── lower (只读层)
├── upper (可写层)
└── work (工作目录)
❌ 错误示例:
upper 在 HDD
work 在 tmpfs
查看层数:
mount | grep overlay
mount -t overlay overlay \
-o lowerdir=/lower,upperdir=/upper,workdir=/work \
/merged
| 参数 | 说明 |
|---|---|
index=off |
关闭 index,减少元数据开销(Docker 默认) |
metacopy=off |
禁用元数据拷贝(除非你明确需要) |
redirect_dir=off |
减少 rename 复杂度 |
xino=off |
禁用跨 inode 映射(高并发时更稳定) |
✅ Docker 推荐组合:
index=off,metacopy=off,redirect_dir=off
推荐顺序:
ext4(最稳定)xfs(大目录、容器场景好)btrfs(和 overlay 组合问题多)tmpfs(不适合生产)mount -o noatime,nodiratime,data=writeback,barrier=0
⚠️ barrier=0 有掉电风险,仅对高性能场景
mount -o noatime,nodiratime
或在 /etc/fstab:
/dev/sda1 / ext4 noatime,nodiratime 0 0
cat /sys/block/sda/queue/scheduler
推荐:
echo none > /sys/block/sda/queue/scheduler
# 或
echo mq-deadline
# 增加脏页刷新
vm.dirty_ratio = 10
vm.dirty_background_ratio = 5
# 增加 inode 缓存
vm.vfs_cache_pressure = 50
sysctl -p
{
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
]
}
重启:
systemctl restart docker
问题:
优化:
volumebind mount✅ 正确做法:
docker run -v /data/logs:/app/logs
tmpfs(适合临时数据)docker run --tmpfs /tmp
perf top
iotop
mount | grep overlay
strace -f -e trace=file ...
| 场景 | 优化前 | 优化后 |
|---|---|---|
| 容器启动 | 2s | 0.6s |
| 写 1GB 文件 | 1.2s | 0.4s |
| 大量小文件 | 很慢 | 提升 2~3x |
✅ 替代方案:
btrfszfsmount 输出你可以直接贴:
mount | grep overlay
docker info
lsblk