You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@apisix.apache.org by GitBox <gi...@apache.org> on 2022/08/29 07:35:55 UTC

[GitHub] [apisix] akalittle opened a new issue, #7811: help request: wrk qps test result is weird

akalittle opened a new issue, #7811:
URL: https://github.com/apache/apisix/issues/7811

   ### Description
   
   Compare to the  [qps page](https://apisix.apache.org/docs/apisix/benchmark/)
   the result of my test is extremely low.
   
   
   
   Use wrk to test.
   ```
   wrk -t4 -c3000 -d30s https://api.xxx.cc/hello/ping
   Running 30s test @ https://api.xxx.cc/hello/ping
     4 threads and 3000 connections
     Thread Stats   Avg      Stdev     Max   +/- Stdev
       Latency   869.55ms  428.65ms   2.00s    58.45%
       Req/Sec   416.93    283.06     1.43k    63.96%
     42106 requests in 30.09s, 7.92MB read
     Socket errors: connect 15, read 0, write 0, timeout 3531
   Requests/sec:   1399.17
   Transfer/sec:    269.60KB
   ```
   
   Config for  helm chart.
   ```
   #
   # Licensed to the Apache Software Foundation (ASF) under one or more
   # contributor license agreements.  See the NOTICE file distributed with
   # this work for additional information regarding copyright ownership.
   # The ASF licenses this file to You under the Apache License, Version 2.0
   # (the "License"); you may not use this file except in compliance with
   # the License.  You may obtain a copy of the License at
   #
   #     http://www.apache.org/licenses/LICENSE-2.0
   #
   # Unless required by applicable law or agreed to in writing, software
   # distributed under the License is distributed on an "AS IS" BASIS,
   # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   # See the License for the specific language governing permissions and
   # limitations under the License.
   
   global:
     imagePullSecrets: []
   
   apisix:
     # Enable or disable Apache APISIX itself
     # Set it to false and ingress-controller.enabled=true will deploy only ingress-controller
     enabled: true
   
     # Enable nginx IPv6 resolver
     enableIPv6: true
   
     # Use Pod metadata.uid as the APISIX id.
     setIDFromPodUID: false
   
     customLuaSharedDicts: []
       # - name: foo
       #   size: 10k
       # - name: bar
       #   size: 1m
     luaModuleHook:
       enabled: false
       # extend lua_package_path to load third party code
       luaPath: ""
       # the hook module which will be used to inject third party code into APISIX
       # use the lua require style like: "module.say_hello"
       hookPoint: ""
       # configmap that stores the codes
       configMapRef:
         name: ""
         # mounts decides how to mount the codes to the container.
         mounts:
         - key: ""
           path: ""
   
     enableCustomizedConfig: false
     customizedConfig: {}
   
     image:
       repository: apache/apisix
       pullPolicy: IfNotPresent
       # Overrides the image tag whose default is the chart appVersion.
       tag: 2.15.0-alpine
   
     # Use a `DaemonSet` or `Deployment`
     kind: Deployment
     # kind is DaemonSet,replicaCount not become effective
     replicaCount: 1
   
     podAnnotations: {}
     podSecurityContext: {}
       # fsGroup: 2000
     securityContext: {}
       # capabilities:
       #   drop:
       #   - ALL
       # readOnlyRootFilesystem: true
       # runAsNonRoot: true
       # runAsUser: 1000
   
     # See https://kubernetes.io/docs/tasks/run-application/configure-pdb/ for more details
     podDisruptionBudget:
       enabled: false
       minAvailable: 90%
       maxUnavailable: 1
   
     resources: {}
       # We usually recommend not to specify default resources and to leave this as a conscious
       # choice for the user. This also increases chances charts run on environments with little
       # resources, such as Minikube. If you do want to specify resources, uncomment the following
       # lines, adjust them as necessary, and remove the curly braces after 'resources:'.
       # limits:
       #   cpu: 100m
       #   memory: 128Mi
       # requests:
       #   cpu: 100m
       #   memory: 128Mi
   
     nodeSelector: {}
     tolerations: []
     affinity: {}
     # If true, it will sets the anti-affinity of the Pod.
     podAntiAffinity:
       enabled: false
   
     # timezone is the timezone where apisix uses.
     # For example: "UTC" or "Asia/Shanghai"
     # This value will be set on apisix container's environment variable TZ.
     # You may need to set the timezone to be consistent with your local time zone,
     # otherwise the apisix's logs may used to retrieve event maybe in wrong timezone.
     timezone: ""
   
     # extraEnvVars An array to add extra env vars
     # e.g:
     # extraEnvVars:
     #   - name: FOO
     #     value: "bar"
     #   - name: FOO2
     #     valueFrom:
     #       secretKeyRef:
     #         name: SECRET_NAME
     #         key: KEY
     extraEnvVars: []
   
   nameOverride: ""
   fullnameOverride: ""
   
   gateway:
     type: NodePort
     # If you want to keep the client source IP, you can set this to Local.
     # ref: https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-the-client-source-ip
     externalTrafficPolicy: Cluster
     # type: LoadBalancer
     # annotations:
     #   service.beta.kubernetes.io/aws-load-balancer-type: nlb
     externalIPs: []
     http:
       enabled: true
       servicePort: 80
       containerPort: 9080
     tls:
       enabled: false
       servicePort: 443
       containerPort: 9443
       existingCASecret: ""
       certCAFilename: ""
       http2:
         enabled: true
     stream:  # L4 proxy (TCP/UDP)
       enabled: false
       only: false
       tcp: []
       udp: []
     ingress:
       enabled: false
       annotations: {}
         # kubernetes.io/ingress.class: nginx
         # kubernetes.io/tls-acme: "true"
       hosts:
         - host: apisix.local
           paths: []
       tls: []
     #  - secretName: apisix-tls
     #    hosts:
     #      - chart-example.local
   
   admin:
     # Enable Admin API
     enabled: true
     # admin service type
     type: ClusterIP
     # loadBalancerIP: a.b.c.d
     # loadBalancerSourceRanges:
     #   - "143.231.0.0/16"
     externalIPs: []
     #
     port: 9180
     servicePort: 9180
     # Admin API support CORS response headers
     cors: true
     # Admin API credentials
     credentials:
       admin: edd1c9f034335f136f87ad84b625c8f1
       viewer: 4054f7cf07e344346cd3f287985e76a2
   
     allow:
       # The ip range for allowing access to Apache APISIX
       ipList:
         - 127.0.0.1/24
   
   nginx:
     workerRlimitNofile: "20480"
     workerConnections: "10620"
     workerProcesses: auto
     enableCPUAffinity: true
   
   # APISIX plugins to be enabled
   plugins:
     - api-breaker
     - authz-keycloak
     - basic-auth
     - batch-requests
     - consumer-restriction
     - cors
     - echo
     - fault-injection
     - grpc-transcode
     - hmac-auth
     - http-logger
     - ip-restriction
     - ua-restriction
     - jwt-auth
     - kafka-logger
     - key-auth
     - limit-conn
     - limit-count
     - limit-req
     - node-status
     - openid-connect
     - authz-casbin
     - prometheus
     - proxy-cache
     - proxy-mirror
     - proxy-rewrite
     - redirect
     - referer-restriction
     - request-id
     - request-validation
     - response-rewrite
     - serverless-post-function
     - serverless-pre-function
     - sls-logger
     - syslog
     - tcp-logger
     - udp-logger
     - uri-blocker
     - wolf-rbac
     - zipkin
     - traffic-split
     - gzip
     - real-ip
     - ext-plugin-pre-req
     - ext-plugin-post-req
     - opentelemetry
   stream_plugins:
     - mqtt-proxy
     - ip-restriction
     - limit-conn
   
   pluginAttrs:
     opentelemetry:
       trace_id_source: random
       resource:
         service.name: APISIX
   #      tenant.id: business_id
       collector:
         address: opentelemetry-deploy-opentelemetry-collector.apisix-istio.svc.cluster.local:4318
         request_timeout: 3
       batch_span_processor:
         drop_on_queue_full: false
         max_queue_size: 6
         batch_timeout: 2
         inactive_timeout: 1
         max_export_batch_size: 2
   
   extPlugin:
     enabled: false
     cmd: ["/path/to/apisix-plugin-runner/runner", "run"]
   
   # customPlugins allows you to mount your own HTTP plugins.
   customPlugins:
     enabled: false
     # the lua_path that tells APISIX where it can find plugins,
     # note the last ';' is required.
     luaPath: "/opts/custom_plugins/?.lua"
     plugins:
         # plugin name.
       - name: ""
         # plugin attrs
         attrs: {}
         # plugin codes can be saved inside configmap object.
         configMap:
           # name of configmap.
           name: ""
           # since keys in configmap is flat, mountPath allows to define the mount
           # path, so that plugin codes can be mounted hierarchically.
           mounts:
             - key: ""
               path: ""
             - key: ""
               path: ""
   
   updateStrategy: {}
     # type: RollingUpdate
   
   extraVolumes: []
   # - name: extras
   #   emptyDir: {}
   
   extraVolumeMounts: []
   # - name: extras
   #   mountPath: /usr/share/extras
   #   readOnly: true
   
   discovery:
     enabled: false
     registry:
         # Integration service discovery registry. E.g eureka\dns\nacos\consul_kv
         # reference:
         # https://apisix.apache.org/docs/apisix/discovery#configuration-for-eureka
         # https://apisix.apache.org/docs/apisix/discovery/dns#service-discovery-via-dns
         # https://apisix.apache.org/docs/apisix/discovery/consul_kv#configuration-for-consul-kv
         # https://apisix.apache.org/docs/apisix/discovery/nacos#configuration-for-nacos
         #
         # an eureka example:
         # eureka:
         #   host:
         #     - "http://${username}:${password}@${eureka_host1}:${eureka_port1}"
         #     - "http://${username}:${password}@${eureka_host2}:${eureka_port2}"
         #   prefix: "/eureka/"
         #   fetch_interval: 30
         #   weight: 100
         #   timeout:
         #     connect: 2000
         #     send: 2000
         #     read: 5000
   
   # access log and error log configuration
   logs:
     enableAccessLog: true
     accessLog: "/dev/stdout"
     accessLogFormat: '$remote_addr - $remote_user [$time_local] $http_host \"$request\" $status $body_bytes_sent $request_time \"$http_referer\" \"$http_user_agent\" $upstream_addr $upstream_status $upstream_response_time \"$upstream_scheme://$upstream_host$upstream_uri\"'
     accessLogFormatEscape: default
     errorLog: "/dev/stderr"
     errorLogLevel: "warn"
   
   dns:
     resolvers:
       - 127.0.0.1
       - 172.20.0.10
       - 114.114.114.114
       - 223.5.5.5
       - 1.1.1.1
       - 8.8.8.8
     validity: 30
     timeout: 5
   
   initContainer:
     image: busybox
     tag: 1.28
   
   autoscaling:
     enabled: false
     minReplicas: 1
     maxReplicas: 100
     targetCPUUtilizationPercentage: 80
     targetMemoryUtilizationPercentage: 80
   
   # Custom configuration snippet.
   configurationSnippet:
     main: |
   
     httpStart: |
   
     httpEnd: |
   
     httpSrv: |
   
     httpAdmin: |
   
     stream: |
   
   # Observability configuration.
   # ref: https://apisix.apache.org/docs/apisix/plugins/prometheus/
   serviceMonitor:
     enabled: true
     # namespace where the serviceMonitor is deployed, by default, it is the same as the namespace of the apisix
     namespace: ""
     # name of the serviceMonitor, by default, it is the same as the apisix fullname
     name: ""
     # interval at which metrics should be scraped
     interval: 15s
     # path of the metrics endpoint
     path: /apisix/prometheus/metrics
     # prefix of the metrics
     metricPrefix: apisix_
     # container port where the metrics are exposed
     containerPort: 9091
     # @param serviceMonitor.labels ServiceMonitor extra labels
     labels: {}
     # @param serviceMonitor.annotations ServiceMonitor annotations
     annotations: {}
   
   # etcd configuration
   # use the FQDN address or the IP of the etcd
   etcd:
     # install etcd(v3) by default, set false if do not want to install etcd(v3) together
     enabled: false
     host:
       - http://etcd-v3.etcd.svc.cluster.local:2379  # host or ip e.g. http://172.20.128.89:2379
     prefix: "/apisix"
     timeout: 30
   
     # if etcd.enabled is true, set more values of bitnami/etcd helm chart
     auth:
       rbac:
         # No authentication by default
         create: false
         user: ""
         password: ""
       tls:
         enabled: false
         existingSecret: ""
         certFilename: ""
         certKeyFilename: ""
         verify: true
         sni: ""
   
     service:
       port: 2379
   
     replicaCount: 3
   
   dashboard:
     enabled: true
     config:
       conf:
         listen:
           host: 0.0.0.0
           port: 9000
         etcd:
           # Supports defining multiple etcd host addresses for an etcd cluster
           endpoints:
             - etcd-v3.etcd.svc.cluster.local:2379
           # apisix configurations prefix
           prefix: "/apisix"
       authentication:
         secert: secert
         expire_time: 36000
         users:
           - username: admin
             password: admin
   
   ingress-controller:
     enabled: true
     fullname: apisix-istio
     config:
       apisix:
         name: apisix-istio
         serviceNamespace: apisix-istio
         serviceName: apisix-istio-admin
     serviceMonitor:
       enabled: true
       namespace: "apisix-istio"
       interval: 15s
       # @param serviceMonitor.labels ServiceMonitor extra labels
       labels: {}
       # @param serviceMonitor.annotations ServiceMonitor annotations
       annotations: {}
   
   
   ```
   
   
   
   ApisixRoute:
   
   ```
   apiVersion: apisix.apache.org/v2beta3
   kind: ApisixRoute
   metadata:
     name: http-hello
     namespace: launcher
   spec:
     http:
       - name: http-hello
         match:
           hosts:
             - api.xxx.cc
           paths:
             - /hello*
         plugins:
           - name: proxy-rewrite
             enable: gtrue
             config:
               regex_uri:
                 - ^/hello/(.*)
                 - /$1
         backends:
           - serviceName: http-hello
             servicePort: 8000
   
   ```
   
   http-hello server:
   
   ```
   func main() {
   	r := gin.Default()
   	r.GET("/ping", func(c *gin.Context) {
   		c.JSON(http.StatusOK, gin.H{
   			"message": "pong",
   		})
   	})
   	r.Run() // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
   }
   ```
   
   
   
   ### Environment
   
   apache/apisix:2.15.0-alpine
   apache/apisix-ingress-controller:1.4.1
   docker.io/bitnami/etcd:3.5.4-debian-11-r14
   
   Kubernetes cluster version:
   Client Version: v1.24.0
   Kustomize Version: v4.5.4
   Server Version: v1.21.12-gke.2200


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@apisix.apache.org.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [apisix] tzssangglass commented on issue #7811: help request: qps test result is wired

Posted by GitBox <gi...@apache.org>.
tzssangglass commented on issue #7811:
URL: https://github.com/apache/apisix/issues/7811#issuecomment-1231494694

   what is the maximum open file limit?


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@apisix.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [apisix] akalittle closed issue #7811: help request: qps test result is wired

Posted by GitBox <gi...@apache.org>.
akalittle closed issue #7811: help request:  qps test result is wired
URL: https://github.com/apache/apisix/issues/7811


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@apisix.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [apisix] juzhiyuan commented on issue #7811: help request: qps test result is wired

Posted by GitBox <gi...@apache.org>.
juzhiyuan commented on issue #7811:
URL: https://github.com/apache/apisix/issues/7811#issuecomment-1230073434

   Hi @bzp2010, could you please have a quick check and give some hints? I remember we have some related issues :) 


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@apisix.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [apisix] akalittle commented on issue #7811: help request: qps test result is wired

Posted by GitBox <gi...@apache.org>.
akalittle commented on issue #7811:
URL: https://github.com/apache/apisix/issues/7811#issuecomment-1231089341

   I've tried remove the `proxy-rewrite` plugin, and the result is the same.
   The virtual resource are 3 nodes of  n2-highcpu-8 (8 vCPUs) on Google Cloud
   
   ```
   apiVersion: apisix.apache.org/v2beta3
   kind: ApisixRoute
   metadata:
     name: http-hello
     namespace: launcher
   spec:
     http:
       - name: http-hello
         match:
           hosts:
             - api.xxx.cc
           paths:
             - /ping
         backends:
           - serviceName: http-hello
             servicePort: 8000
   
   ```


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@apisix.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [apisix] akalittle commented on issue #7811: help request: qps test result is wired

Posted by GitBox <gi...@apache.org>.
akalittle commented on issue #7811:
URL: https://github.com/apache/apisix/issues/7811#issuecomment-1230315412

   Maybe you can check this later.
   I'm considering this is because of the istio-ingress limits the qps.


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@apisix.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [apisix] tzssangglass commented on issue #7811: help request: qps test result is wired

Posted by GitBox <gi...@apache.org>.
tzssangglass commented on issue #7811:
URL: https://github.com/apache/apisix/issues/7811#issuecomment-1230107069

   How well does wrk test cozzz/http_hello directly?


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@apisix.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [apisix] tokers commented on issue #7811: help request: qps test result is wired

Posted by GitBox <gi...@apache.org>.
tokers commented on issue #7811:
URL: https://github.com/apache/apisix/issues/7811#issuecomment-1232361608

   I have some doubts:
   
   1. Where did you launch the stress test with wrk? Out of Kubernetes cluster?
   2. What about sending requests to the backend service directly?
   3. The `workerProcesses` field is `auto` so it will launch bunch of worker processes according to the number of CPU cores in your K8s node (not the CPU request for the Pod), and when you only assign 1 vCPU, I think the CPU throttle and context switch are obvious. Try to set `workerProcesses` to `1` to check the QPS for single worker.


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@apisix.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [apisix] soulbird commented on issue #7811: help request: qps test result is wired

Posted by GitBox <gi...@apache.org>.
soulbird commented on issue #7811:
URL: https://github.com/apache/apisix/issues/7811#issuecomment-1232355758

   Try to make wrk's `-c` parameter smaller, like: 
   ```shell
   wrk -t16 -c16 -d200s https://api.xx.cc/hello/ping
   ```


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@apisix.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [apisix] tzssangglass commented on issue #7811: help request: qps test result is wired

Posted by GitBox <gi...@apache.org>.
tzssangglass commented on issue #7811:
URL: https://github.com/apache/apisix/issues/7811#issuecomment-1231060665

   I don't understand how to troubleshoot issues like this in a virtualized environment. From the information you provided, I think again the possible performance bottlenecks are
   
   1. proxy-rewrite plugin
   2. environment information on virtual resources, such as ulimit, etc.


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@apisix.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [apisix] akalittle commented on issue #7811: help request: qps test result is wired

Posted by GitBox <gi...@apache.org>.
akalittle commented on issue #7811:
URL: https://github.com/apache/apisix/issues/7811#issuecomment-1230086039

   ```yaml
   apiVersion: core.kalm.dev/v1alpha1
   kind: Component
   metadata:
     labels:
     name: http-hello
     namespace: launcher
   spec:
     dnsPolicy: ClusterFirst
     image: cozzz/http_hello
     ports:
       - containerPort: 8080
         protocol: http
         servicePort: 8000
     replicas: 3
     restartStrategy: RollingUpdate
     schedule: '* * * * *'
     terminationGracePeriodSeconds: 30
     workloadType: server
   ```
   
   actually the http-server  is above `cozzz/http_hello`


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@apisix.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [apisix] akalittle commented on issue #7811: help request: qps test result is wired

Posted by GitBox <gi...@apache.org>.
akalittle commented on issue #7811:
URL: https://github.com/apache/apisix/issues/7811#issuecomment-1232467916

   Sorry.It's not a problem of apisix.
   I've tried a namespace without istio-injetced and the qps goes up rapidly.
   Thanks for help.
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@apisix.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org