Docker容器HTTP请求限制

rmcc

我是Docker的新手,所以很可能我缺少一些东西。

我正在使用Elasticimage使用此图像运行容器

我能够正确设置所有内容。之后,我使用的是一个由同事开发的脚本,用于插入一些数据,基本上是查询MySQL数据库并发出HTTP请求。

问题是,这些请求中的许多请求都会阻塞,直到失败。如果netstat -tn | grep 9200我知道了:

tcp6       0      0 ::1:58436               ::1:9200                TIME_WAIT  
tcp6       0      0 ::1:59274               ::1:9200                TIME_WAIT 

...
tcp6       0      0 ::1:58436               ::1:9200                TIME_WAIT  
tcp6       0      0 ::1:59274               ::1:9200                TIME_WAIT 

有很多要求。在这一点上,我不确定这是否与弹性搜索或泊坞窗有关。如果在我的计算机上安装了Elasticsearch,则不会发生这种情况。

一些信息:

$ docker version
Client version: 1.6.2
Client API version: 1.18
Go version (client): go1.4.2
Git commit (client): 7c8fca2
OS/Arch (client): linux/amd64
Server version: 1.6.2
Server API version: 1.18
Go version (server): go1.4.2
Git commit (server): 7c8fca2
OS/Arch (server): linux/amd64

$ docker info
Containers: 6
Images: 103
Storage Driver: devicemapper
 Pool Name: docker-252:1-9188072-pool
 Pool Blocksize: 65.54 kB
 Backing Filesystem: extfs
 Data file: /dev/loop0
 Metadata file: /dev/loop1
 Data Space Used: 4.255 GB
 Data Space Total: 107.4 GB
 Data Space Available: 103.1 GB
 Metadata Space Used: 6.758 MB
 Metadata Space Total: 2.147 GB
 Metadata Space Available: 2.141 GB
 Udev Sync Supported: false
 Data loop file: /var/lib/docker/devicemapper/devicemapper/data
 Metadata loop file: /var/lib/docker/devicemapper/devicemapper/metadata
 Library Version: 1.02.82-git (2013-10-04)
Execution Driver: native-0.2
Kernel Version: 3.14.22-031422-generic
Operating System: Ubuntu 14.04.2 LTS
CPUs: 4
Total Memory: 15.37 GiB

$ docker logs elasticsearch
[2015-06-15 09:10:33,761][INFO ][node                     ] [Energizer] version[1.6.0], pid[1], build[cdd3ac4/2015-06-09T13:36:34Z]
[2015-06-15 09:10:33,762][INFO ][node                     ] [Energizer] initializing ...
[2015-06-15 09:10:33,766][INFO ][plugins                  ] [Energizer] loaded [], sites []
[2015-06-15 09:10:33,792][INFO ][env                      ] [Energizer] using [1] data paths, mounts [[/usr/share/elasticsearch/data (/dev/mapper/ubuntu--vg-root)]], net usable_space [145.3gb], net total_space [204.3gb], types [ext4]
[2015-06-15 09:10:35,516][INFO ][node                     ] [Energizer] initialized
[2015-06-15 09:10:35,516][INFO ][node                     ] [Energizer] starting ...
[2015-06-15 09:10:35,642][INFO ][transport                ] [Energizer] bound_address {inet[/0:0:0:0:0:0:0:0:9300]}, publish_address {inet[/172.17.0.5:9300]}
[2015-06-15 09:10:35,657][INFO ][discovery                ] [Energizer] elasticsearch/Y1zfiri4QO21zRhcI-bTXA
[2015-06-15 09:10:39,426][INFO ][cluster.service          ] [Energizer] new_master [Energizer][Y1zfiri4QO21zRhcI-bTXA][76dea3e6d424][inet[/172.17.0.5:9300]], reason: zen-disco-join (elected_as_master)
[2015-06-15 09:10:39,446][INFO ][http                     ] [Energizer] bound_address {inet[/0:0:0:0:0:0:0:0:9200]}, publish_address {inet[/172.17.0.5:9200]}
[2015-06-15 09:10:39,446][INFO ][node                     ] [Energizer] started
[2015-06-15 09:10:39,479][INFO ][gateway                  ] [Energizer] recovered [0] indices into cluster_state

脚本的重要部分:

for package in c.fetchall():
    id_package, tracking_number, order_number, payment_info, shipment_provider_name, package_status_name=package
    el['tracking_number'] = tracking_number
    el['order_number'] = order_number
    el['payment_info'] = payment_info
    el['shipment_provider_name'] = shipment_provider_name
    el['package_status_name'] = package_status_name

    requests.put("http://localhost:9200/packages/package/%s/_create"%(id_package), json=el)
rmcc

因此,Docker或Elastic都不是问题。回顾一下,在本地通过Elasticsearch设置抛出PUT请求的相同脚本可以正常工作,但是在使用数千个文档(20k)后,使用Elasticsearch向容器抛出PUT请求失败。请注意,文件总数大约为80万。

那么,发生了什么事?当您设置在本地主机上运行的somethig并向其发出请求(在本例中为PUT请求)时,该请求将通过回送接口。实际上,这意味着不会建立任何TCP连接,从而使速度大大提高。

设置Docker容器时,端口已绑定到主机。尽管脚本仍在所需端口上向localhost发出请求,但仍通过docker0接口在主机和Docker容器之间创建了TCP连接。这是以两件事为代价的:

  • 建立TCP连接的时间
  • TIME_WAIT状态

这实际上是一个更现实的情况。我们在另一台机器上安装了Elasticsearch,并进行了完全相同的测试,并得到了预期的相同结果。

问题是我们正在发送请求,并为每个请求创建一个新的连接。由于TCP的工作方式,无法立即关闭连接。这意味着我们将使用所有可用的连接,直到没有连接可用为止,因为创建速率高于实际的关闭速率。

解决此问题的三个建议:

  1. 偶尔暂停一次请求。也许每X个请求都会休眠,以使TIME_WAIT通过并关闭连接
  2. 发送Connection: close标头:选项,以使发送方在完成响应后发出将关闭连接的信号。
  3. 重用连接。

我最终选择了选项3),并重写了我的同事的脚本并重新使用了相同的TCP连接。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

容器之间的Docker HTTP请求

来自分类Dev

无法在 docker 容器之间发出 HTTP 请求

来自分类Dev

Docker容器通讯限制

来自分类Dev

跨链接的Docker容器发出HTTP请求时出错

来自分类Dev

使用 HTTPURLConnection 的 Docker 容器之间的 400 错误 HTTP GET 请求

来自分类Dev

Docker:从容器到其他停止的 http 请求

来自分类Dev

HTTP PUT请求限制

来自分类Dev

为什么 docker 主机上的 Jenkins 响应来自容器内部的 HTTP 请求?

来自分类Dev

docker compose jest 集成测试无法进行容器内 http 请求 RequestError: Error: getaddrinfo ENOTFOUND

来自分类Dev

如何从一个Docker容器向另一个链接的容器发出HTTP请求?

来自分类Dev

为Docker容器设置CPU的绝对限制

来自分类Dev

限制Docker容器中的JVM内存消耗

来自分类Dev

限制在Docker容器内启动的进程数

来自分类Dev

Docker:将VPN限制为单个容器

来自分类Dev

Docker 容器通过 http 通信

来自分类Dev

在Docker容器中请求特定的ubuntu版本

来自分类Dev

从Docker容器记录PHP API请求信息

来自分类Dev

如何在angularjs中限制$ http请求?

来自分类Dev

是否有默认的内存请求和/或k8s \ openshift中的容器\容器的限制?

来自分类Dev

如何限制从主机到Docker容器的CPU使用率

来自分类Dev

限制Docker容器上的内存不起作用

来自分类Dev

将Docker容器限制为单个cpu内核

来自分类Dev

更新Docker中现有容器的内存/ CPU限制

来自分类Dev

如何增加Docker容器中Corda节点的内存限制

来自分类Dev

限制Docker容器上的内存不起作用

来自分类Dev

如何在 dockerfile 本身中限制 docker 容器的内存

来自分类Dev

docker 容器启动后是否可以增加内存限制?

来自分类Dev

Docker容器中的节点http-proxy

来自分类Dev

Docker容器中的SSH导致HTTP 404

Related 相关文章

  1. 1

    容器之间的Docker HTTP请求

  2. 2

    无法在 docker 容器之间发出 HTTP 请求

  3. 3

    Docker容器通讯限制

  4. 4

    跨链接的Docker容器发出HTTP请求时出错

  5. 5

    使用 HTTPURLConnection 的 Docker 容器之间的 400 错误 HTTP GET 请求

  6. 6

    Docker:从容器到其他停止的 http 请求

  7. 7

    HTTP PUT请求限制

  8. 8

    为什么 docker 主机上的 Jenkins 响应来自容器内部的 HTTP 请求?

  9. 9

    docker compose jest 集成测试无法进行容器内 http 请求 RequestError: Error: getaddrinfo ENOTFOUND

  10. 10

    如何从一个Docker容器向另一个链接的容器发出HTTP请求?

  11. 11

    为Docker容器设置CPU的绝对限制

  12. 12

    限制Docker容器中的JVM内存消耗

  13. 13

    限制在Docker容器内启动的进程数

  14. 14

    Docker:将VPN限制为单个容器

  15. 15

    Docker 容器通过 http 通信

  16. 16

    在Docker容器中请求特定的ubuntu版本

  17. 17

    从Docker容器记录PHP API请求信息

  18. 18

    如何在angularjs中限制$ http请求?

  19. 19

    是否有默认的内存请求和/或k8s \ openshift中的容器\容器的限制?

  20. 20

    如何限制从主机到Docker容器的CPU使用率

  21. 21

    限制Docker容器上的内存不起作用

  22. 22

    将Docker容器限制为单个cpu内核

  23. 23

    更新Docker中现有容器的内存/ CPU限制

  24. 24

    如何增加Docker容器中Corda节点的内存限制

  25. 25

    限制Docker容器上的内存不起作用

  26. 26

    如何在 dockerfile 本身中限制 docker 容器的内存

  27. 27

    docker 容器启动后是否可以增加内存限制?

  28. 28

    Docker容器中的节点http-proxy

  29. 29

    Docker容器中的SSH导致HTTP 404

热门标签

归档