香港服务器上Docker运行MySQL的IO限制配置指南

1. 背景介绍

在香港服务器上运行 MySQL 时,很多人知道可以限制 CPU 和内存,但往往忽略了 Docker 还可以对实例的 IOPS(每秒输入/输出操作数)进行限制。本文将深入探讨如何在香港服务器上限制 Docker 容器的 IOPS,并通过实验进行测试。


2. 模拟测试

2.1 限制 IOPS 的相关命令

通过 echo 方式动态限制 Docker 实例的 IOPS。

步骤 1:获取磁盘设备 ID

  1. 通过 ps aux 获取当前实例运行的数据盘,例如数据盘为 /data1
  2. 通过 df -Th | grep data1 获取磁盘盘符,例如 /dev/nvme0n1
  3. 通过 lsblk /dev/nvme0n1 获取设备 ID(MAJ:MIN),例如 259:1

步骤 2:设置 IOPS 限制

${docker_name} 替换为真实的 Docker 名称,并执行以下命令将 Docker 实例的最大读写 IOPS 分别设置为 5000。

echo "259:1 rbps=max wbps=max riops=5000 wiops=5000" > $(find /sys/fs/cgroup/ -name "$(docker inspect -f '{{.Id}}' ${docker_name})" | grep -E "docker|machine.slice")/io.max

2.2 进行压测对比

使用 sysbench 进行压力测试:

  • 修改前 IOPS 约 2000
  • 修改后 IOPS 提升至 5000,读写 QPS 提升 1.5 倍

3. 获取容器 IOPS

3.1 通过监控工具

如果该实例是服务器上唯一的磁盘用户,可以直接通过服务器的磁盘 IOPS 监控来查看 Docker 实例的 IO 负载。

3.2 通过脚本方式获取

2.1 步骤获取设备 ID 并替换 DEVICE_MAJOR_MINOR,然后执行以下脚本来监测 IOPS:

#!/bin/sh
PID=$1
CONTAINER_ID=$(docker inspect -f '{{.Id}}' $PID)
CGROUP_PATH=$(find /sys/fs/cgroup/ -name "*${CONTAINER_ID}*" | grep -E "docker|machine.slice")
echo ${CGROUP_PATH}
DEVICE_MAJOR_MINOR="259:1"  # 通过 `lsblk` 确认设备号
INTERVAL=1

prev_read=$(grep "$DEVICE_MAJOR_MINOR" "$CGROUP_PATH/io.stat" | awk '{print $4}' | cut -d= -f2)
prev_write=$(grep "$DEVICE_MAJOR_MINOR" "$CGROUP_PATH/io.stat" | awk '{print $5}' | cut -d= -f2)

while true; do
  sleep $INTERVAL
  curr_read=$(grep "$DEVICE_MAJOR_MINOR" "$CGROUP_PATH/io.stat" | awk '{print $4}' | cut -d= -f2)
  curr_write=$(grep "$DEVICE_MAJOR_MINOR" "$CGROUP_PATH/io.stat" | awk '{print $5}' | cut -d= -f2)
  write_iops=$((curr_write - prev_write))
  read_iops=$((curr_read - prev_read))
  sum_iops=$(( write_iops + read_iops))
  echo "Write IOPS: $write_iops, Read IOPS: $read_iops, Total IOPS: $sum_iops"
  prev_write=$curr_write
  prev_read=$curr_read
done

4. 相关概念解释

4.1 MySQL 实例 IOPS vs Docker IOPS

  • MySQL 实例 IOPS:逻辑 IOPS,统计 MySQL 内部操作,例如:
    • InnoDB 缓冲池未命中时的物理读请求
    • 事务提交时的 Redo Log 写入次数
    • 直接 I/O 请求
  • Docker IOPS:物理 IOPS,统计磁盘的实际读写次数

4.2 I/O 合并机制

  • 文件系统或磁盘控制器可能将多个小 I/O 请求合并成更大的块。
    • 例如:MySQL 发送 4 次 4KB 写操作 → 合并为 1 次 16KB 写操作 → cgroup 统计 1 次 IOPS。

5. 相关性能指标分析

香港服务器上进行实例压测时,得到以下数据:

  • TPS(事务吞吐量): 1400
  • 写 QPS: 6000 左右
  • 总 QPS: 2.9 万
  • 实例 IOPS 达到 10 万
  • Docker 限制的 IOPS 为 8000(整盘 IO 利用率 10%)
  • 磁盘最高承受 MySQL 实例 IOPS 为 100 万 / 8 万物理 IOPS

6. 结论

在香港服务器上运行 MySQL 容器时,合理限制 Docker IOPS 可以有效控制资源使用,提高服务器的稳定性和性能。通过以上方法,我们可以:

  1. 获取并分析 Docker IOPS 负载
  2. 动态调整 Docker 容器 IOPS 限制
  3. 监控性能变化,优化服务器资源分配

希望本篇文章能帮助你更好地管理香港服务器上的 Docker IOPS!

THE END