丨容器磁盘限速我里读写不稳定_第1页
丨容器磁盘限速我里读写不稳定_第2页
丨容器磁盘限速我里读写不稳定_第3页
丨容器磁盘限速我里读写不稳定_第4页
丨容器磁盘限速我里读写不稳定_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

我们先用这里的代码,运行一下makeimage来做一个带fio的容器镜像,fio在我fiofio,就可以得到只有mkdir-pdockerstopfio_test1;dockerrmdockerrun--namefio_test1--volume/tmp/test1:/tmpregistery/fio:v1fio-Dockervolume"这个参数。之前我们讲过容器文件系统,比如OverlayFS。到"volume"中。这里的volume可以是一个本地的磁盘,也可以是一个网络磁盘。 作为挂载到容器的 然后在启动容器之后,我们直接运行fio令,这里的参数和我们第11讲最开始例 的volume可以看到,fioIOPS是18K,带宽(BW)是70MB/s个磁盘上写数据又是什么情况呢?我们可以再用下面的这个试一下:代代123456789mkdir-pmkdir-pdockerstopfio_test1;dockerrmfio_test1dockerstopfio_test2;dockerrmdockerrun--namefio_test1--volumeregistery/fio:v1fio-dockerrun--namefio_test2--volumeregistery/fio:v1fio-fio_test1IOPS15K之前,我们讨论过用Cgroups来保证容器的CPU使用率,以及控制Memroy的可用大小。那么你肯定想到了,我们是不是也可以用Cgroups来保证每个容器的磁盘读写性能?Cgroupv1blkioI/Oblkio于磁盘I/O的限制,并不像CPU,Memory那么直接,下面我会详细讲解。BlkioblkioCgroupIOPS吞吐量(Throughput)是什么意思,后面讲BlkioCgroup的参数配置时会用到。IOPSInput/OutputOperationsPerSecond吞吐量(Throughput)是指每秒钟磁盘中数据的量,一般以MB/s为单位。这个量可以叫作吞吐量,有时候也被称为带宽(Bandwidth)。刚才我们用到的fio显示结果IOPSIOPS那么吞吐量也越大,它们的关系大概是这样的:吞吐量=数据块大小*IOPS。blkioCgroupblkioCgroupCgroups子系统。在Cgroupsv1里,blkioCgroup的虚拟文件系统挂载点一般 作为控制组,再把需要做I/O限制的进程pid写到控制组的blkioCgroupI/OI/OIOPS没错,它们分别表示:磁盘IOPS限制,磁盘吞吐量限制,磁盘写入IOPS限制,对于每个参数写入值的格式,你可以参考内核blkio的文档。为了让你更好地理解,如果我们要对一个控制组做限制,限制它对磁盘/dev/vdb的写入吞吐量不超过10MB/s,那么我们对blkio.throttle.write_bps_device参数的配置就是下面这个命令。11echo 在这个命令中,"252:16"是/dev/vdb的主次设备号,你可以通过ls-l/dev/vdb看 "就是10MB的每秒钟带宽限制。#ls-l/dev/vdb-brw-rw1rootdisk252,16Nov208:02blkioCgroupblkio写磁盘吞吐量,然后在这个容器里运行一下fio,看看结果是什么。代代123456789mkdir-prm-fdockerstopfio_test1;dockerrmdockerrun-d--namefio_test1--volumeregistery/fio:v1sleepCONTAINER_ID=$(sudodockerps--format"{{.ID}}\t{{.Names}}"|grep-ifio_tesecho$CONTAINER_IDCGROUP_CONTAINER_PATH=$(find/sys/fs/cgroup/blkio/-nameecho#Togetthedevicemajorandminoridfrom/devforthedevicethatecho">echo">dockerexecfio_test1fio-direct=1-rw=write-ioengine=libaio-bs=4k-dockerexecfio_test1fio-direct=1-rw=read-ioengine=libaio-bs=4k-tmp/test1253:0”,你在自己运行这组命在我们后面的例子里,fio4KB。所以对于磁盘的性能限制,我们在blkioCgroup里就只设置吞吐量限制了。blkioCgroup10MB/sfio容器对磁盘无论是读还是写,它的最大值就不会再超过10MB/s了。blkioCgroup10MB/s代代123456789mkdir-p/tmp/test1rm-f/tmp/test1/*dockerstopfio_test1;dockerrmmkdir-p/tmp/test2rm-f/tmp/test2/*dockerstopfio_test2;dockerrmdockerrun-d--namefio_test1--volume/tmp/test1:/tmpregistery/fio:v1dockerrun-d--namefio_test2--volumeregistery/fio:v1sleepCONTAINER_ID1=$(sudodockerps--format"{{.ID}}\t{{.Names}}"|grep-ifio_teecho$CONTAINER_ID1CGROUP_CONTAINER_PATH1=$(find/sys/fs/cgroup/blkio/-name"*$CONTAINER_ID1*")echo$CGROUP_CONTAINER_PATH122#Togetthedevicemajorandminoridfrom/devforthedevicethat24echo ">26echo ">CONTAINER_ID2=$(sudodockerps--format"{{.ID}}\t{{.Names}}"|grep-iechoCGROUP_CONTAINER_PATH2=$(find/sys/fs/cgroup/blkio/-nameecho34#Togetthedevicemajorandminoridfrom/devforthedevicethat35echo ">37echo ">39dockerexecfio_test1fio-direct=1-rw=write-ioengine=libaio-bs=4k-41dockerexecfiotest2fio-direct=1-rw=write-ioengine=libaio-bs=4k-fiofio_test1fio_test2果都是10MB/s了。那么做到了这一步,我们是不是就可以认为,blkioCgroup可以完美地对磁盘I/O做限制你先别急,我们可以再做个试验,把前面里fio命令中的“-direct=1”给去掉,也就是不让fio运行在DirectI/O模式了,而是用BufferedI/O模式再运行一次,看看fio同时我们也可以运行iostat这时候你会发现,即使我们设置了blkioCgroupDirectI/O和BufferedLinuxI/ODirectI/OBufferedDirectI/O模式,用户进程如果要写磁盘文件,就会通过Linux内核的文件系统层(filesystemblocklayer)而如果是BufferedI/O模式,那么用户进程只是把文件数据写到内存中(PageCache)就返回了,而Linux内核自己有线程会把内存中的数据再写入到磁盘中。在Linux里,由于考虑到性能问题,绝大多数的应用都会使用BufferedI/O模式。DirectI/OblkioCgroupI/O,但是BufferedI/O不能被限制。Cgroupsv1我们已经学习过了v1的CPUCgroup,memoryCgroup和blkioCgroup,那么Cgroupv1就像下面图里的进程pid_y,它可以分别属于memoryCgroup和blkioCgroup。但是在blkioCgroup对进程pid_y做磁盘I/O做限制的时候,blkio子系统是不会去关心pid_y用了哪些内存,哪些内存是不是属于PageCache,而这些PageCache的页面在刷入磁盘的时候,产生的I/O也不会被计算到进程pid_y上面。blkio在Cgroupsv1BufferedI/OBufferedI/OCgroupV2LinuxCgroupV2CgroupCgroupv2Cgroupv1CgroupV2pid_ygroup2group2打开了io和memory子系统(CgroupV2里的io子系统就等同于Cgroupv1里的blkio子系统)。那么,Cgrouppid_yI/Opid_yPageCachebufferedI/O下面我们在Cgroupv2里,尝试一下设置了blkioCgroup+MemoryCgroup之后,是否可以对BufferedI/O进行磁盘限速。我们要做的第一步,就是在Linux系统里打开Cgroupv2的功能。因为目前即使版本的UbuntuLinux或者CentosLinux,仍然在使用Cgroupv1作为缺省的Cgroup。打开方法就是配置一个kernel参数"cgroup_no_v1=blkio,memory",这表示把Cgroupv1的blkio和Memory两个子系统给,这样Cgroupv2的io和Memory这两个子grubLinuxCgroupv2Cgroupv2然后,我们用下面的这个做Cgroupv2io的限速配置,并且运行fio,看看bufferedI/O是否可以被限速。1#Createanewcontrol223456789mkdir-p#enabletheioandmemorycontrollerecho"+io+memory">#Addcurrentbashpidiniotestcontrol#Thenallchildprocessesofthebashwillbeiniotestgrouptoo,#includingthefioecho$$#256:16aredevicemajorandminorids,/mntisontheecho"252:16cd">#RunthefioinnondirectI/Ofio-iodepth=1-rw=write-ioengine=libaio-bs=4k-size=1G--iotestioMemory两个控制子系统,对磁盘最大吞吐量的设置为10MB。运行fio的时候不加"-direct=1",也就是让fio运行在bufferedI/O模式下。运行fio写入1GB的数据后,你会发现fio马上就执行完了,因为系统上有足够的内存,fio”iostatxz10到磁盘vdb上稳定的写入速率是10240wkB/s,也就是我们在ioCgroup里限制的CgroupV1的blkiioIOPS这是因为BufferedI/O会把数据先写入到内存PageCache中,然后由内核线程把数据写入磁盘,而Cgroupv1blkio的子系立于memory子系统,无法统计到由PageCache刷入到磁盘的数据量。这个BufferedI/O无法被限速的问题,在Cgroupv2里被解决了。Cgroupv2从架构上允许一个控制组里有多个子系统协同运行,这样在一个控制组里只要同时有io和Memory子系统,就可以对BufferedI/O作磁盘读写的限速。虽然Cgroupv2解决了BufferedI/O磁盘读写限速的问题,但是在现实的容器平台上也不是能够立刻使用的,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论