存储 IO 性能调优
容器存储 IO 性能直接影响应用响应,下面介绍调优方法。
存储驱动优化
选择 overlay2
Bash
# 查看当前驱动
docker info | grep "Storage Driver"
# overlay2 是推荐的驱动
# 性能优于 aufs 和 devicemapper
Direct-LVM 模式
JSON
// /etc/docker/daemon.json (devicemapper)
{
"storage-driver": "devicemapper",
"storage-opts": [
"dm.thinpooldev=/dev/mapper/docker-thinpool",
"dm.use_deferred_removal=true",
"dm.use_deferred_deletion=true"
]
}
Direct-LVM 使用独立块设备,性能优于 loop-lvm。
IO 限制
BPS 限制
Bash
# 限制读取/写入 BPS
docker run -d \
--device-read-bps /dev/sda:10mb \
--device-write-bps /dev/sda:10mb \
my-app
IOPS 限制
Bash
# 限制读取/写入 IOPS
docker run -d \
--device-read-iops /dev/sda:1000 \
--device-write-iops /dev/sda:1000 \
my-app
Volume 优化
数据卷 vs 绑定挂载
| 类型 | 性能 | 适用场景 |
|---|---|---|
| Volume | 高 | 数据库、缓存 |
| Bind Mount | 中 | 开发、配置 |
Bash
# Volume 性能更优
docker run -d -v my-data:/var/lib/mysql mysql:8.0
# Bind Mount 性能略低
docker run -d -v /data/mysql:/var/lib/mysql mysql:8.0
tmpfs Volume
Bash
# 内存中存储(最高性能)
docker run -d --tmpfs /tmp:size=100m my-app
# 适合临时数据、缓存
文件系统优化
XFS vs EXT4
Bash
# XFS 适合大文件和高吞吐
mkfs.xfs /dev/sda1
# EXT4 适合小文件和高 IOPS
mkfs.ext4 /dev/sda1
挂载选项
Bash
# /etc/fstab
/dev/sda1 /var/lib/docker xfs noatime,nodiratime 0 0
# noatime: 不更新访问时间,减少写入
数据库 IO 优化
YAML
# Compose 配置
services:
mysql:
image: mysql:8.0
volumes:
- db-data:/var/lib/mysql # 使用 volume
deploy:
resources:
limits:
# IO 限制
blkio_weight: 500
Bash
# 数据库专用参数
docker run -d \
-v db-data:/var/lib/mysql \
--blkio-weight 500 \
mysql:8.0
监控 IO
Bash
# 查看容器 IO
docker stats my-app
# 查看底层 IO
cat /sys/fs/cgroup/blkio/docker/<id>/blkio.throttle.io_service_bytes
# iostat 查看宿主 IO
iostat -x 1
要点总结
- overlay2 是推荐存储驱动,性能优于 aufs 和 devicemapper
- Direct-LVM 模式使用独立块设备提升 devicemapper 性能
- Volume 性能优于 Bind Mount,数据库优先使用 Volume
- --device-read/write-bps 限制 BPS,--device-read/write-iops 限制 IOPS
- XFS 适合大文件,EXT4 适合小文件,noatime 减少写入
📝 发现内容有误?点击此处直接编辑