Что на самом деле означает max_connections в Envoy?

У меня вопрос о том, что на самом деле означает «cluster.CircuitBreakers.Thresholds.max_connections» в Envoy.

cluster.CircuitBreakers.Thresholds.max_connections в envoy doc объясняется следующим образом:

Максимальное количество подключений Envoy к вышестоящему кластеру. Если не указано, значение по умолчанию - 1024.

Istio использует envoy в качестве вспомогательного средства. Недавно мы попробовали образец отключения цепи, но всегда обнаруживали, что подключений больше, чем мы настроили.

Итак, мы проводим еще один тест, показанный ниже:

  1. Добавьте в istio две службы:

    • echo client: 1 pod, downstream, will send HTTP request to echo server
    • эхо-сервер: 2 модуля, восходящий поток.

служебные модули:

[root@k8s-master istio-1.0.3]# kubectl get pod -o wide
NAME                          READY   STATUS    RESTARTS   AGE     IP            NODE     NOMINATED NODE
echoclient-84485fbc5c-zxlv8   2/2     Running   0          8s      10.244.2.79   node02   <none>
echoserver-5655768fb9-smsvb   2/2     Running   0          23h     10.244.2.65   node02   <none>
echoserver-5655768fb9-srsq2   2/2     Running   0          7h52m   10.244.2.73   node02   <none>
  1. Настроенное правило назначения для эхо-сервера, ниже показана соответствующая информация в посланнике. (maxConnections равно 2)

Вывод istio proxy-config:

[root@k8s-master istio-1.0.3]# istioctl proxy-config clusters echoclient-84485fbc5c-zxlv8 --fqdn echoserver.default.svc.cluster.local -o json
[
    {
        "name": "outbound|8080||echoserver.default.svc.cluster.local",
        "type": "EDS",
        "edsClusterConfig": {
            "edsConfig": {
                "ads": {}
            },
            "serviceName": "outbound|8080||echoserver.default.svc.cluster.local"
        },
        "connectTimeout": "1.000s",
        "circuitBreakers": {
            "thresholds": [
                {
                    "maxConnections": 2
                }
            ]
        }
    }
]
  1. Выполняйте несколько запросов одновременно (40 запросов на поток) от клиента эхо к каждому серверу.

полученные результаты:

[root@k8s-master istio-1.0.3]# kubectl exec -it echoclient-84485fbc5c-zxlv8 /bin/bash
Defaulting container name to echoclient.
Use 'kubectl describe pod/echoclient-84485fbc5c-zxlv8 -n default' to see all of the containers in this pod.
[root@echoclient-84485fbc5c-zxlv8 /]# /opt/jre/bin/java -cp /opt/echoclient-1.0-SNAPSHOT-jar-with-dependencies.jar hello.HttpSender "http://echoserver:8080/echo?name=peter" 10 40 0
using num threads: 10
Starting pool-1-thread-1 with numCalls=40 parallelSends=false delayBetweenCalls=0 url=http://echoserver:8080/echo?name=peter mixedRespTimes=false
Starting pool-1-thread-2 with numCalls=40 parallelSends=false delayBetweenCalls=0 url=http://echoserver:8080/echo?name=peter mixedRespTimes=false
Starting pool-1-thread-3 with numCalls=40 parallelSends=false delayBetweenCalls=0 url=http://echoserver:8080/echo?name=peter mixedRespTimes=false
Starting pool-1-thread-4 with numCalls=40 parallelSends=false delayBetweenCalls=0 url=http://echoserver:8080/echo?name=peter mixedRespTimes=false
Starting pool-1-thread-5 with numCalls=40 parallelSends=false delayBetweenCalls=0 url=http://echoserver:8080/echo?name=peter mixedRespTimes=false
Starting pool-1-thread-6 with numCalls=40 parallelSends=false delayBetweenCalls=0 url=http://echoserver:8080/echo?name=peter mixedRespTimes=false
Starting pool-1-thread-7 with numCalls=40 parallelSends=false delayBetweenCalls=0 url=http://echoserver:8080/echo?name=peter mixedRespTimes=false
Starting pool-1-thread-8 with numCalls=40 parallelSends=false delayBetweenCalls=0 url=http://echoserver:8080/echo?name=peter mixedRespTimes=false
Starting pool-1-thread-9 with numCalls=40 parallelSends=false delayBetweenCalls=0 url=http://echoserver:8080/echo?name=peter mixedRespTimes=false
Starting pool-1-thread-10 with numCalls=40 parallelSends=false delayBetweenCalls=0 url=http://echoserver:8080/echo?name=peter mixedRespTimes=false
pool-1-thread-7: successes=[40], failures=[0], duration=[481ms]
pool-1-thread-6: successes=[40], failures=[0], duration=[485ms]
pool-1-thread-4: successes=[40], failures=[0], duration=[504ms]
pool-1-thread-1: successes=[40], failures=[0], duration=[542ms]
pool-1-thread-9: successes=[40], failures=[0], duration=[626ms]
pool-1-thread-8: successes=[40], failures=[0], duration=[652ms]
pool-1-thread-2: successes=[40], failures=[0], duration=[684ms]
pool-1-thread-10: successes=[40], failures=[0], duration=[657ms]
pool-1-thread-5: successes=[40], failures=[0], duration=[678ms]
pool-1-thread-3: successes=[40], failures=[0], duration=[696ms]
  1. Проверьте HTTP-соединение от эхо-клиента к эхо-серверу

информация о подключении из netstat:

[root@echoclient-84485fbc5c-zxlv8 /]# netstat -ano | grep 8080 | grep ESTABLISHED
tcp        0      0 10.244.2.79:58074       10.244.2.65:8080        ESTABLISHED off (0.00/0/0)
tcp        0      0 10.244.2.79:38076       10.244.2.73:8080        ESTABLISHED off (0.00/0/0)
tcp        0      0 10.244.2.79:58088       10.244.2.65:8080        ESTABLISHED off (0.00/0/0)
tcp        0      0 10.244.2.79:38080       10.244.2.73:8080        ESTABLISHED off (0.00/0/0)
tcp        0      0 10.244.2.79:58056       10.244.2.65:8080        ESTABLISHED off (0.00/0/0)
tcp        0      0 10.244.2.79:38094       10.244.2.73:8080        ESTABLISHED off (0.00/0/0)
tcp        0      0 10.244.2.79:38110       10.244.2.73:8080        ESTABLISHED off (0.00/0/0)
tcp        0      0 10.244.2.79:58076       10.244.2.65:8080        ESTABLISHED off (0.00/0/0)

информация о подключении из кластера посланников:

[root@echoclient-84485fbc5c-zxlv8 /]# curl -s http://localhost:15000/clusters | grep echoserver
outbound|8080||echoserver.default.svc.cluster.local::default_priority::max_connections::2
outbound|8080||echoserver.default.svc.cluster.local::default_priority::max_pending_requests::1024
outbound|8080||echoserver.default.svc.cluster.local::default_priority::max_requests::1024
outbound|8080||echoserver.default.svc.cluster.local::default_priority::max_retries::3
outbound|8080||echoserver.default.svc.cluster.local::high_priority::max_connections::1024
outbound|8080||echoserver.default.svc.cluster.local::high_priority::max_pending_requests::1024
outbound|8080||echoserver.default.svc.cluster.local::high_priority::max_requests::1024
outbound|8080||echoserver.default.svc.cluster.local::high_priority::max_retries::3
outbound|8080||echoserver.default.svc.cluster.local::added_via_api::true
outbound|8080||echoserver.default.svc.cluster.local::10.244.2.65:8080::cx_active::4
outbound|8080||echoserver.default.svc.cluster.local::10.244.2.65:8080::cx_connect_fail::0
outbound|8080||echoserver.default.svc.cluster.local::10.244.2.65:8080::cx_total::4
outbound|8080||echoserver.default.svc.cluster.local::10.244.2.65:8080::rq_active::0
outbound|8080||echoserver.default.svc.cluster.local::10.244.2.65:8080::rq_error::0
outbound|8080||echoserver.default.svc.cluster.local::10.244.2.65:8080::rq_success::200
outbound|8080||echoserver.default.svc.cluster.local::10.244.2.65:8080::rq_timeout::0
outbound|8080||echoserver.default.svc.cluster.local::10.244.2.65:8080::rq_total::200
outbound|8080||echoserver.default.svc.cluster.local::10.244.2.65:8080::health_flags::healthy
outbound|8080||echoserver.default.svc.cluster.local::10.244.2.65:8080::weight::1
outbound|8080||echoserver.default.svc.cluster.local::10.244.2.65:8080::region::
outbound|8080||echoserver.default.svc.cluster.local::10.244.2.65:8080::zone::
outbound|8080||echoserver.default.svc.cluster.local::10.244.2.65:8080::sub_zone::
outbound|8080||echoserver.default.svc.cluster.local::10.244.2.65:8080::canary::false
outbound|8080||echoserver.default.svc.cluster.local::10.244.2.65:8080::success_rate::-1
outbound|8080||echoserver.default.svc.cluster.local::10.244.2.73:8080::cx_active::4
outbound|8080||echoserver.default.svc.cluster.local::10.244.2.73:8080::cx_connect_fail::0
outbound|8080||echoserver.default.svc.cluster.local::10.244.2.73:8080::cx_total::4
outbound|8080||echoserver.default.svc.cluster.local::10.244.2.73:8080::rq_active::0
outbound|8080||echoserver.default.svc.cluster.local::10.244.2.73:8080::rq_error::0
outbound|8080||echoserver.default.svc.cluster.local::10.244.2.73:8080::rq_success::200
outbound|8080||echoserver.default.svc.cluster.local::10.244.2.73:8080::rq_timeout::0
outbound|8080||echoserver.default.svc.cluster.local::10.244.2.73:8080::rq_total::200
outbound|8080||echoserver.default.svc.cluster.local::10.244.2.73:8080::health_flags::healthy
outbound|8080||echoserver.default.svc.cluster.local::10.244.2.73:8080::weight::1
outbound|8080||echoserver.default.svc.cluster.local::10.244.2.73:8080::region::
outbound|8080||echoserver.default.svc.cluster.local::10.244.2.73:8080::zone::
outbound|8080||echoserver.default.svc.cluster.local::10.244.2.73:8080::sub_zone::
outbound|8080||echoserver.default.svc.cluster.local::10.244.2.73:8080::canary::false
outbound|8080||echoserver.default.svc.cluster.local::10.244.2.73:8080::success_rate::-1

Мы видим, что существует 8 подключений от echoclient к echoserver (10.244.2.65,10.244.2.73), но не настроено maxConnections 2.

Почему 8 подключений, а не 2? Есть ли недопонимание по поводу maxConnections посланника?


person pxchen    schedule 27.11.2018    source источник
comment
max_connections или max_requests относится к количеству подключений, которые может принять каждый children пул php перед его возрождением и обычно может быть найден в /etc/etc/php/{version}/fpm/pool.d/www.conf max_children основан на памяти машины, некоторые примеры руководств, которые мне помогли понять, были Максимальное количество запросов / детей   -  person Garrett    schedule 27.11.2018


Ответы (3)


Как упоминает Гарретт в комментариях:

max_connections или max_requests относится к количеству подключений, которые может принять каждый children пул php перед его возрождением, и обычно его можно найти в /etc/etc/php/{version}/fpm/pool.d/www.conf max_children основан на памяти машины, некоторые примеры руководств, которые мне помогли понять, были Максимальное количество запросов / детей

person Community    schedule 28.11.2018

Я думаю, вы вызвали клиента с 1 потоком (то есть с 1 HTTP-соединением), но он отправляет запросы параллельно (по умолчанию партиями по 10).

В envoy max_connections применяются к соединениям http1, и в вашем случае у вас есть только одно соединение http.

Попробуйте взглянуть на max_request, которые потенциально применимы к потокам, имеющим тесное отношение к http2.

Надеюсь это поможет!!

person ANDUI    schedule 29.11.2018

SSH к узлу клиентского модуля и exec в контейнер istio-proxy

docker exec --privileged --user root -it <istio-proxy-container-id> bash

Используйте следующую команду, чтобы найти посланник TCP-соединений для восходящего потока

ss -pe | grep 8080 | grep envoy

person Tong    schedule 25.04.2019