如何调整/排除/优化AWS上的Docker块I / O

我有以下docker容器,我已经设置了testing我的Web应用程序:

  1. jenkins
  2. Apache 1(服务laravel应用程序)
  3. Apache 2(服务遗留代码的应用程序)
  4. MySQL(由Apache 1和Apache 2访问)
  5. seleniumHUB
  6. selenium节点 – ChromeDriver

jenkins作业在Apache 1上运行behat命令,后者又连接到Selenium Hub,Selenium Hub有一个ChromeDriver节点,实际上可以击中两个应用程序: Apache 1Apache 2

整个系统使用AWS linux在EC2 t2.small实例(1核,2GB RAM)上运行。

问题

我现在遇到的问题是,如果我多次运行pipe道,前几次运行得很好(这个阶段大约需要20秒),但是在第三次和连续的运行中,behat阶段开始减速(以1分30秒)然后在3米或10米之后失败,或者每当我失去耐心的时候。

如果我重新启动docker集装箱,它再次工作,但只有另外2-4运行。

线索

每次运行jenkinspipe道时监控docker docker stats ,我注意到block I / O,特别是'I'在前几次运行后呈指数级增长。

例如,运行1之后

詹金斯跑1

运行2之后

詹金斯跑2

运行3后

詹金斯跑3

运行4后

对于chromedriver容器的块I / O是21GB和驱动程序挂起。 虽然我可能期望块I / O增长,但我不希望它看起来像指数增长 。 这就像是爆炸。

相同的dockerconfiguration(使用docker-compose )每次在我的个人MacBook Pro上运行完美。 块I / O不会“爆炸”。 我限制Docker只使用1个内核和2GB的RAM。

我试过了

这种情况使我了解了更多关于docker,文件系统和内存pipe理的知识,但是我仍然没有解决这个问题。 我尝试过的一些事情:

记忆

我在所有容器上设置了mem_limit选项,并对它们进行了调整,以便在任何给定的运行过程中,内存不会达到100%。 内存使用现在看起来相当稳定,永远不会“爆炸”。

存储驱动程序

AWS Linux Docker的默认设置是loop-lvm模式下的devicemapper。 阅读这份文件后

https://docs.docker.com/engine/userguide/storagedriver/device-mapper-driver/#configure-docker-with-devicemapper

我切换到build议的direct-lvm模式。

docker-compose restart

这确实“重置”了这个问题,让我可以多跑几次,但是这并不能持久。 2-4次运行后,事情就会发生,testing开始失败。

iotop

在主机上运行iotop显示读取正在通过屋顶。

在这里输入图像说明

我的问题…

  1. 发生什么事情导致块I / O呈指数增长? 我不清楚是否是造成问题的docker工人,jenkins,selenium或者镀铬的人。 我的第一个猜测是镀铬金属,尽pipe其他容器也显示出“爆炸”的迹象。
  2. 使用多个移动部件来调整像这样的系统的好方法是什么?

其他信息

我的chromedriver容器在Docker-compose中设置了以下环境:

- SE_OPTS=-maxSession 6 -browser browserName=chrome,maxInstances=3

docker info

 $ docker info Containers: 6 Running: 6 Paused: 0 Stopped: 0 Images: 5 Server Version: 1.12.6 Storage Driver: devicemapper Pool Name: docker-thinpool Pool Blocksize: 524.3 kB Base Device Size: 10.74 GB Backing Filesystem: xfs Data file: Metadata file: Data Space Used: 4.862 GB Data Space Total: 20.4 GB Data Space Available: 15.53 GB Metadata Space Used: 2.54 MB Metadata Space Total: 213.9 MB Metadata Space Available: 211.4 MB Thin Pool Minimum Free Space: 2.039 GB Udev Sync Supported: true Deferred Removal Enabled: true Deferred Deletion Enabled: false Deferred Deleted Device Count: 0 Library Version: 1.02.135-RHEL7 (2016-11-16) Logging Driver: json-file Cgroup Driver: cgroupfs Plugins: Volume: local Network: overlay null host bridge Swarm: inactive Runtimes: runc Default Runtime: runc Security Options: Kernel Version: 4.4.51-40.60.amzn1.x86_64 Operating System: Amazon Linux AMI 2017.03 OSType: linux Architecture: x86_64 CPUs: 1 Total Memory: 1.956 GiB Docker Root Dir: /var/lib/docker Debug Mode (client): false Debug Mode (server): false Registry: https://index.docker.io/v1/