栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

容器实战高手 · 存储

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

容器实战高手 · 存储

容器中读写的文件咋变慢了?

OverlayFS各层存储的关系:
OverlayFS 会 mount 两层目录,分别是 lower 层和 upper 层;
upper 层的文件会覆盖 lower 层的文件;

我们在 merged/ 目录里做文件操作,具体包括这三种。

    新建文件,这个文件会出现在 upper/ 目录中。删除文件,如果我们删除"in_upper.txt",那么这个文件会在 upper/ 目录中消失。如果删除"in_lower.txt", 在 lower/ 目录里的"in_lower.txt"文件不会有变化,只是在 upper/ 目录中增加了一个特殊文件来告诉 OverlayFS,"in_lower.txt’这个文件不能出现在 merged/ 里了,这就表示它已经被删除了。修改文件,类似如果修改"in_lower.txt",那么就会在 upper/ 目录中新建一个"in_lower.txt"文件,包含更新的内容,而在 lower/ 中的原来的实际文件"in_lower.txt"不会改变。

使用容器文件系统的作用:减少相同镜像文件在同一个节点上的数据冗余,可以节省磁盘空间,也可以减少镜像文件下载占用的网络资源。


容器为啥把宿主机的磁盘写满了?

XFS需要开启quota属性
对于根目录来说,这个参数必须作为一个内核启动的参数"rootflags=pquota",这样设置就可以保证根目录在启动挂载的时候,带上 XFS Quota 的特性并且支持 Project 模式。
查看内核是否开启对应参数:
饭粒:设置目录容量配额

    新建的目录 /tmp/xfs_prjquota,我们想对它做 Quota 限制。所以在这里要对它打上一个 Project ID。通过 xfs_quota 这条命令,我们给 /tmp/xfs_prjquota 打上 Project ID 值 101。使用 xfs_quota 命令,对 101(我们刚才建立的这个 Project ID)做 Quota 限制。尝试写入数据
    1. # mkdir -p  /tmp/xfs_prjquota
    2. # xfs_quota -x -c 'project -s -p /tmp/xfs_prjquota 101' /
    Setting up project 101 (path /tmp/xfs_prjquota)...
    Processed 1 (/etc/projects and cmdline) paths for project 101 with recursion depth infinite (-1).
    3. # xfs_quota -x -c 'limit -p bhard=10m 101' /
    4. # dd if=/dev/zero of=/tmp/xfs_prjquota/test.file bs=1024 count=20000
    dd: error writing '/tmp/xfs_prjquota/test.file': No space left on device
    10241+0 records in
    10240+0 records out
    10485760 bytes (10 MB, 10 MiB) copied, 0.0357122 s, 294 MB/s
    # ls -l /tmp/xfs_prjquota/test.file
    -rw-r--r-- 1 root root 10485760 Oct 31 10:00 /tmp/xfs_prjquota/test.file
    

对于容器来说:可以对 OverlayFS 的 upper 目录做 XFS Quota 的限流来防止节点磁盘写满。
在用 docker run 启动容器的时候,加上一个参数 –storage-opt size= ,就能限制住容器 OverlayFS 文件系统可写入的最大数据量了。(前提是节点包含xfs quota相关内核参数)进入启动的容器df -Th可以看到根只有参数设定的大小空间。
限制的容器目录是"/var/lib/docker/overlay2/"里面的diff目录。可以通过xfs_quota -x -c ‘report -h /tmp/xfs_prjquota’ 查询projectid。


磁盘限速:容器磁盘读写不稳定

磁盘性能两大指标:

    IOPS ( Input/Output Operations Per Second )是每秒钟磁盘读写的次数,这个数值越大性能越好。吞吐量(Throughput)是指每秒钟磁盘中数据的读取量,一般以 MB/s 为单位。这个读取量可以叫作吞吐量,有时候也被称为带宽(Bandwidth)。
    在 IOPS 固定的情况下,如果读写的每一个数据块越大,那么吞吐量也越大,它们的关系大概是这样的:吞吐量 = 数据块大小 *IOPS

blkio Cgroup 是 Cgroups 里的一个子系统。 在 Cgroups v1 里,blkio Cgroup 的虚拟文件系统挂载点一般在"/sys/fs/cgroup/blkio/"。在目录下创建子目录作为控制组,再把需要做 I/O 限制的进程 pid 写到控制组的 cgroup.procs 参数中就可以实现限制。
其中主要的参数:格式参考
blkio.throttle.read_iops_device:磁盘读取 IOPS 限制
blkio.throttle.read_bps_device:磁盘读取吞吐量限制
blkio.throttle.write_iops_device:磁盘写入 IOPS 限制
blkio.throttle.write_bps_device:磁盘写入吞吐量限制
饭粒:对磁盘 /dev/vdb 的写入吞吐量不超过 10MB/s
echo “252:16 10485760” > $CGROUP_CONTAINER_PATH/blkio.throttle.write_bps_device
其中"252:16"是 /dev/vdb 的主次设备号,可以通过 ls -l /dev/vdb 看到这两个值,而后面的"10485760"就是 10MB 的每秒钟带宽限制。

fio测试磁盘读写容器:docker pull mayadata/fio饭粒1:测试容器读写性能

# 单个容器
mkdir -p /tmp/test1
docker stop fio_test1;docker rm fio_test1
docker run --name fio_test1 --volume /tmp/test1:/tmp  mayadata/fio fio -direct=1 -rw=write -ioengine=libaio -bs=4k -size=1G -numjobs=1  -name=/tmp/fio_test1.log

# 2个容器
mkdir -p /tmp/test1
mkdir -p /tmp/test2
docker stop fio_test1;docker rm fio_test1
docker stop fio_test2;docker rm fio_test2
docker run --name fio_test1 --volume /tmp/test1:/tmp  mayadata/fio fio -direct=1 -rw=write -ioengine=libaio -bs=4k -size=1G -numjobs=1  -name=/tmp/fio_test1.log &
docker run --name fio_test2 --volume /tmp/test2:/tmp  mayadata/fio fio -direct=1 -rw=write -ioengine=libaio -bs=4k -size=1G -numjobs=1  -name=/tmp/fio_test2.log &
饭粒2:设置磁盘读写限速后的读写性能
# 单个容器
mkdir -p /tmp/test1
rm -f /tmp/test1/*
docker stop fio_test1;docker rm fio_test1
docker run -d --name fio_test1 --volume /tmp/test1:/tmp  mayadata/fio sleep 3600
sleep 2
CONTAINER_ID=$(sudo docker ps --format "{{.ID}}t{{.Names}}" | grep -i fio_test1 | awk '{print $1}')
echo $CONTAINER_ID
CGROUP_CONTAINER_PATH=$(find /sys/fs/cgroup/blkio/ -name "*$CONTAINER_ID*")
echo $CGROUP_CONTAINER_PATH
# To get the device major and minor id from /dev for the device that /tmp/test1 is on.
echo "253:0 10485760" > $CGROUP_CONTAINER_PATH/blkio.throttle.read_bps_device
echo "253:0 10485760" > $CGROUP_CONTAINER_PATH/blkio.throttle.write_bps_device
docker exec fio_test1 fio -direct=1 -rw=write -ioengine=libaio -bs=4k -size=100MB -numjobs=1  -name=/tmp/fio_test1.log
docker exec fio_test1 fio -direct=1 -rw=read -ioengine=libaio -bs=4k -size=100MB -numjobs=1  -name=/tmp/fio_test1.log

# 多个容器
#!/bin/bash
mkdir -p /tmp/test1
rm -f /tmp/test1/*
docker stop fio_test1;docker rm fio_test1
mkdir -p /tmp/test2
rm -f /tmp/test2/*
docker stop fio_test2;docker rm fio_test2
docker run -d --name fio_test1 --volume /tmp/test1:/tmp  mayadata/fio sleep 3600
docker run -d --name fio_test2 --volume /tmp/test2:/tmp  mayadata/fio sleep 3600
sleep 2
CONTAINER_ID1=$(sudo docker ps --format "{{.ID}}t{{.Names}}" | grep -i fio_test1 | awk '{print $1}')
echo $CONTAINER_ID1
CGROUP_CONTAINER_PATH1=$(find /sys/fs/cgroup/blkio/ -name "*$CONTAINER_ID1*")
echo $CGROUP_CONTAINER_PATH1
# To get the device major and minor id from /dev for the device that /tmp/test1 is on.
echo "253:0 10485760" > $CGROUP_CONTAINER_PATH1/blkio.throttle.read_bps_device
echo "253:0 10485760" > $CGROUP_CONTAINER_PATH1/blkio.throttle.write_bps_device
CONTAINER_ID2=$(sudo docker ps --format "{{.ID}}t{{.Names}}" | grep -i fio_test2 | awk '{print $1}')
echo $CONTAINER_ID2
CGROUP_CONTAINER_PATH2=$(find /sys/fs/cgroup/blkio/ -name "*$CONTAINER_ID2*")
echo $CGROUP_CONTAINER_PATH2
# To get the device major and minor id from /dev for the device that /tmp/test1 is on.
echo "253:0 10485760" > $CGROUP_CONTAINER_PATH2/blkio.throttle.read_bps_device
echo "253:0 10485760" > $CGROUP_CONTAINER_PATH2/blkio.throttle.write_bps_device
docker exec fio_test1 fio -direct=1 -rw=write -ioengine=libaio -bs=4k -size=100MB -numjobs=1  -name=/tmp/fio_test1.log &
docker exec fio_test2 fio -direct=1 -rw=write -ioengine=libaio -bs=4k -size=100MB -numjobs=1  -name=/tmp/fio_test2.log &
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/729561.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号