PPHC 测试

PPHC

作者姓名:吕文翰
原始网站地址:https://pphc.lvwenhan.com

nginx 和 apache 静态图片

文中看到一张静态图片 “Nginx 的性能是 Apache 的四倍”

nginx 和 apache 均未更改配置,直接使用容器启动 根目录替换为一张图片。

$ docker run --rm -dit --name pphc-nginx -v /Downloads/jovan-vasiljevic-l6qGo5zKswU-unsplash.jpg:/usr/share/nginx/html/jovan.jpg:ro -d nginx:stable
$ oha -n 10000 -c 4 --connect-to 'pphc-nginx.orb.local:80:192.168.215.2:80' --latency-correction --disable-keepalive http://pphc-nginx.orb.local/jovan.jpg
Summary:
  Success rate:	100.00%
  Total:	5859.5672 ms
  Slowest:	21.9470 ms
  Fastest:	1.2468 ms
  Average:	2.3418 ms
  Requests/sec:	1706.6107

  Total data:	23.88 GiB
  Size/request:	2.45 MiB
  Size/sec:	4.08 GiB

Response time histogram:
   1.247 ms [1]    |
   3.317 ms [9547] |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
   5.387 ms [433]  |■
   7.457 ms [9]    |
   9.527 ms [2]    |
  11.597 ms [2]    |
  13.667 ms [2]    |
  15.737 ms [1]    |
  17.807 ms [0]    |
  19.877 ms [1]    |
  21.947 ms [2]    |

Response time distribution:
  10.00% in 1.8269 ms
  25.00% in 1.9920 ms
  50.00% in 2.2289 ms
  75.00% in 2.5561 ms
  90.00% in 2.9806 ms
  95.00% in 3.2815 ms
  99.00% in 3.9765 ms
  99.90% in 7.9387 ms
  99.99% in 21.8587 ms


Details (average, fastest, slowest):
  DNS+dialup:	0.1799 ms, 0.0535 ms, 3.3844 ms
  DNS-lookup:	0.0029 ms, 0.0010 ms, 0.4548 ms

Status code distribution:
  [200] 10000 responses
$ docker run --rm -dit --name pphc-apache -v /Downloads/jovan-vasiljevic-l6qGo5zKswU-unsplash.jpg:/usr/local/apache2/htdocs/jovan.jpg:ro httpd
oha -n 10000 -c 4 --connect-to 'pphc-apache.orb.local:80:192.168.215.3:80' --latency-correction --disable-keepalive http://pphc-apache.orb.local/jovan.jpg
Summary:
  Success rate:	100.00%
  Total:	6991.0027 ms
  Slowest:	22.5767 ms
  Fastest:	1.4700 ms
  Average:	2.7935 ms
  Requests/sec:	1430.4100

  Total data:	23.88 GiB
  Size/request:	2.45 MiB
  Size/sec:	3.42 GiB

Response time histogram:
   1.470 ms [1]    |
   3.581 ms [9035] |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
   5.691 ms [904]  |■■■
   7.802 ms [43]   |
   9.913 ms [7]    |
  12.023 ms [3]    |
  14.134 ms [3]    |
  16.245 ms [0]    |
  18.355 ms [0]    |
  20.466 ms [0]    |
  22.577 ms [4]    |

Response time distribution:
  10.00% in 2.1455 ms
  25.00% in 2.3568 ms
  50.00% in 2.6547 ms
  75.00% in 3.0646 ms
  90.00% in 3.5604 ms
  95.00% in 3.9060 ms
  99.00% in 4.9914 ms
  99.90% in 9.9304 ms
  99.99% in 22.5364 ms


Details (average, fastest, slowest):
  DNS+dialup:	0.2219 ms, 0.0607 ms, 2.7639 ms
  DNS-lookup:	0.0044 ms, 0.0010 ms, 0.4934 ms

Status code distribution:
  [200] 10000 responses

能看到实际 nginx 和 apache 差别没那么大,或许是在特定年代的特殊情况,不过两次请求都有一个问题 “总会有几个请求处理时间过长,尽管大部分请求会很快完成”

apisix + nomad + consul 架构测试

文中说到 api 网关能玩出花来,本地弄了个 apisix,顺便结合 nomad 和 consul 测试下。

先测试下 apisix,根据官方文档配置了个 route,通过 api 看看结果

$ curl -s http://127.0.0.1:9180/apisix/admin/routes\?api_key\=edd1c9f034335f136f87ad84b625c8f1 | jq
{
  "total": 1,
  "list": [
    {
      "key": "/apisix/routes/00000000000000000015",
      "value": {
        "status": 1,
        "id": "00000000000000000015",
        "enable_websocket": false,
        "update_time": 1772193933,
        "priority": 0,
        "name": "getting-started-ip",
        "upstream": {
          "pass_host": "pass",
          "tls": {
            "verify": false
          },
          "nodes": [
            {
              "priority": 0,
              "host": "httpbin.org",
              "port": 80,
              "weight": 0
            }
          ],
          "type": "roundrobin",
          "hash_on": "vars",
          "checks": {
            "active": {
              "host": "httpbin.org",
              "type": "http",
              "healthy": {
                "http_statuses": [
                  200
                ],
                "interval": 1,
                "successes": 200
              },
              "https_verify_certificate": false,
              "port": 80,
              "timeout": 2
            }
          },
          "scheme": "http"
        },
        "methods": [
          "GET"
        ],
        "uri": "/ip",
        "create_time": 1772193933
      },
      "modifiedIndex": 16,
      "createdIndex": 16
    }
  ]
}

直接将请求转发到 httpbin.org 了

$ curl http://127.0.0.1:9080/ip
{
  "origin": "192.168.117.1, 185.220.238.225"
}

nomad 也是很有趣的服务管理部署应用,和 terraform 是同公司,它只是做服务管理 像服务发现这类就交给 consul 测试的话配置起来不复杂,我的想法是这样:用 consul 将 nomad 和 apisix 连通,consul 也能给 nomad 管理的容器做健康检查 服务发现,apisix 找上游服务器通过 consul。

最简单的架构,此状态下最基础是 consul

design-1

配置过程可查看 consul + nomad + apisix

最后结果如下

$ curl -s 127.0.0.1:9080
<h1>Hello, Nomad!</h1>
<ul>
  <li>Task: web</li>
  <li>Group: servers</li>
  <li>Job: hello-world</li>
  <li>Metadata value for foo: bar</li>
  <li>Currently running on port: 8001</li>
</ul>

如果要作为生产环境需要考虑的有很多,上面仅是测试

  • consul 高可用,单独部署还是让 nomad 管理部署
  • consul acl 策略,访问更安全
  • nomad 的多机器
  • nomad 网络,除了服务发现还有服务暴露,即使有 api 网关作为转发,要考虑各个容器间是二层转发还是三层 flannel/calico
  • apisix 高可用,前提是 etcd 高可用,服务层是无状态的 容量不够横向扩展