Docker使用所有内存并使系统崩溃

时间:2015-11-09 23:58:14

标签: mysql apache nginx amazon-ec2 docker

我有一个带有docker的AWS t2.micro EC2实例,我提出了以下实例;

这导致类似docker stats;

的结果
CONTAINER   MEM USAGE/LIMIT     MEM % 
wordpress   331.9 MB/1.045 GB   31.77%
nginx       18.32 MB/1.045 GB   1.75% 
mysql       172.1 MB/1.045 GB   16.48%

然后,我运行siege's默认的15个并发连接,它产生多个apache进程,达到EC2实例的内存限制,由于没有更多内存而崩溃docker和bash,需要我干预才能获得它全部再次运行。

我对此有几个问题。

  1. 我期待太多了吗?此设置是否应该能够处理15个并发连接?如果是这样,需要做出哪些改变?
  2. 如何从此自动恢复?有没有办法检测内存是否达到容量并执行某些操作(如拒绝请求或类似内容),直到内存使用量减少?有没有办法在高请求量期间保持系统稳定,所以一旦它超过它就不需要我的介入来恢复它?
  3. *我已经完成this将mysql内存从22%降至15%。

3 个答案:

答案 0 :(得分:4)

鉴于t2.micro总共只有1GB,并且每个容器本身都有1GB限制,您是否尝试限制每个容器上的最大内存使用量(按http://docs.docker.com/engine/reference/run/#user-memory-constraints),以便总计内存限制不超过1GB?

答案 1 :(得分:2)

阻止EC2实例崩溃的最大影响是限制了一个docker容器可以使用@ palfrey的答案使用-m选项的内存。

需要进行一些额外的调整以减少内存占用并使服务响应15个并发用户,尽管速度有些慢。这包括;

的MySQL

的WordPress

  • 停用KeepAlive
  • 限制服务器:

    <IfModule mpm_prefork_module>
        StartServers            1
        MinSpareServers         1
        MaxSpareServers         3
        MaxRequestWorkers       10
        MaxConnectionsPerChild  3000
    </IfModule>
    

泊坞

我创建了一些扩展默认图像的docker图像,以包含这些优化;

blog post中的详细信息。

答案 2 :(得分:0)

  1. 可能微型只有1GB的内存。您可以在没有docker的情况下运行此配置,但您必须调整内存限制。 Docker可能会增加一些开销。是否有理由同时运行nginx和apache?

  2. 通常,您测试并限制线程到系统可以处理的内容,您可以使用缓存来帮助提高性能。 Apache,nginx,php-fpm都有可以控制允许创建的线程数的设置。