存储性能优化

存储性能优化

容器的存储挑战

容器相比传统虚拟机在存储方面有以下特点:

  • 容器层是临时的,容器删除后数据丢失
  • 写入层(Writable Layer)使用 Copy-on-Write(写时复制)机制
  • 默认存储驱动(overlay2)的 I/O 性能不如直接使用宿主机文件系统

存储驱动选择

overlay2(推荐)

{
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.override_kernel_check=true"
  ]
}

优势
– 比 aufs 和 devicemapper 性能更好
– 支持 page cache 共享
– 内核原生支持(Linux 4.0+)

检查当前驱动

docker info | grep "Storage Driver"

性能对比

存储驱动 性能 内核要求 生产推荐
overlay2 ⭐⭐⭐⭐⭐ 4.0+ ✅ 首选
aufs ⭐⭐⭐ 3.x ❌ 已过时
devicemapper ⭐⭐ 任何 ❌ 不推荐
btrfs/zfs ⭐⭐⭐⭐ 特殊 ⚠️ 特定场景

数据卷性能优化

使用 Volume 而非 Bind Mount

# Volume:由 Docker 管理,性能更好
docker volume create mydata
docker run -v mydata:/data ...

# Bind Mount:直接挂载宿主机目录,有额外的权限检查
docker run -v /host/path:/container/path ...

Volume 驱动选择

# 本地 volume -> 默认使用宿主机文件系统
# NFS volume   -> 网络存储,I/O 有网络延迟
# 推荐:SSD 宿主机的本地 volume

设置文件系统类型

# 使用 XFS 而非 ext4(对 Docker volume 性能更好)
mkfs.xfs /dev/sdb
mount /dev/sdb /var/lib/docker

多阶段构建优化

减少最终镜像大小可以间接提升存储性能:

# ❌ 大镜像
FROM node:18
WORKDIR /app
COPY . .
RUN npm install
RUN npm run build
CMD ["node", "dist/server.js"]

# ✅ 小镜像
FROM node:18 AS builder
WORKDIR /app
COPY . .
RUN npm ci && npm run build

FROM node:18-slim
WORKDIR /app
COPY --from=builder /app/dist ./dist
CMD ["node", "dist/server.js"]

I/O 密集应用优化

1. 数据库容器

# 数据库(MySQL/PostgreSQL)使用 Volume 而非容器内文件系统
docker run -d \
  --name mysql \
  -v mysql-data:/var/lib/mysql \
  --mount type=volume,source=mysql-conf,target=/etc/mysql/conf.d \
  mysql:8.0

# 使用 tmpfs 存储临时数据
docker run -d \
  --tmpfs /tmp:rw,noexec,nosuid,size=1g \
  mysql:8.0

2. 日志和临时文件

version: '3'
services:
  app:
    image: myapp
    tmpfs:
      - /tmp:size=500m
      - /var/log/app:size=200m
    volumes:
      - app-data:/data

使用 tmpfs 将临时文件存在内存中可以显著提升 I/O 性能。

I/O 监控

# 容器级别 I/O
docker stats --no-stream

# 查看容器的 I/O 限制
docker inspect  | jq '.[].HostConfig.BlkioWeight'

# 系统级别 I/O
iostat -x 1
iotop

# Docker 级别的磁盘使用
docker system df

调优参数

daemon.json 调优

{
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.override_kernel_check=true"
  ],
  "default-shm-size": "128M"
}

容器级别调优

# 限制 I/O
docker run \
  --device-read-bps /dev/sda:100mb \
  --device-write-bps /dev/sda:50mb \
  --device-read-iops /dev/sda:1000 \
  --device-write-iops /dev/sda:500 \
  mysql:8.0

面试要点

  1. overlay2 是目前推荐的存储驱动,性能和稳定性最好
  2. Volume 优于 Bind Mount,Docker 管理的 volume 性能更好
  3. 多阶段构建减少镜像体积间接提升存储效率
  4. tmpfs 适合临时文件和缓存,显著提升 I/O 性能
  5. 数据库容器务必使用 Volume 存储数据文件

面试官常问:数据库容器化时如何优化 I/O 性能?tmpfs 用在什么场景?

© 版权声明
THE END
喜欢就支持一下吧
点赞13 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容