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

配置过程可查看 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 高可用,服务层是无状态的 容量不够横向扩展