-
Notifications
You must be signed in to change notification settings - Fork 24
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
TPS 那些事儿 #208
Comments
TPS 那些事儿网卡
TPS
RT(Response-time),响应时间
并发数
吞吐量
TPS/RT的关系
举例我们通过一个实例来把上面几个概念串起来理解。按二八定律来看,如果每天
例如:
NGINX 的连接数概念NGINX轻松管理10万长连接 --- 基于2GB内存的CentOS 6.5 x86-64
资源 |
C10K 是 1 万 TPS 吗C10K 就是 Client 10000 问题,即「在同时连接到服务器的客户端数量超过 10000 个的环境中,即便硬件性能足够, 依然无法正常提供服务」,简而言之,就是单机 1 万个并发连接问题。这个概念最早由 Dan Kegel 1999 年提出。C10K 就是单机同时处理 1 万个请求(并发 1 万连接)的问题。 现在我们早已经突破了 C10K 这个瓶颈,思路就是通过单个进程或线程服务于多个客户端请求,通过异步编程和事件触发机制替换轮训,IO 采用非阻塞的方式,减少不必要的性能损耗,等等。
实际上,在大多数场景中,我们并不需要单机并发 1000 万的请求。通过调整系统架构,把这些请求分发到多台服务器中来处理,通常是更简单和更容易扩展的方案。 问题是,一些同学就记住了 C10K,是并发处理 1 万请求,把括弧中的"并发 1 万连接"给忽略了,把 Client 的 C 当成了 Concurrence 的 C,然后就慢慢与并发 1 万 TPS 画上了等号。然后就经常下意识的问,你们的系统能支撑住 10 万 TPS 么?搞得 10 万 TPS 是标配,没有 10 万 TPS 那系统就是做得太烂了似的感觉。 |
空接口的意义
很多网络应用程序,都提供一个 package fastrest
type Status struct{ DummyService }
func (p *Status) Process(*Context) (interface{}, error) {
return &Rsp{Status: 200, Message: "成功"}, nil
} 我们使用 Berf 跑一下它的性能测试: root@bx-PC:~/bingoohuang# ./berf :14142/status -c 26 -v -d30s
Berf benchmarking http://127.0.0.1:14142/status for 30s using 26 goroutine(s), 96 GoMaxProcs.
@Real-time charts is on http://127.0.0.1:28888
Summary:
Elapsed 30s
Count/RPS 4489715 149652.214
200 4489715 149652.214
ReadWrite 208.316 196.345 Mbps
Connections 26
Statistics Min Mean StdDev Max
Latency 31µs 163µs 136µs 5.598ms
RPS 136749.48 149628.08 2858.46 153222.51
Latency Percentile:
P50 P75 P90 P95 P99 P99.9 P99.99
138µs 187µs 254µs 319µs 606µs 1.854ms 2.314ms
Latency Histogram:
158µs 4337178 96.60% ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
243µs 122233 2.72% ■
439µs 25696 0.57%
1.051ms 3179 0.07%
1.728ms 974 0.02%
2.087ms 373 0.01%
2.274ms 75 0.00%
2.689ms 7 0.00% 可以看到,这个空接口的 TPS 能达到 15万,平均延时 163µs, P99 延时 606µs。 这时候小明同学就问,我这个啥业务也没有,测量这个空接口的意义何在呢?其实,它的意义非常重要:
一个实际的问题是,明明同学在自己的环境(比如他自己的个人电脑中)验证同样的空接口,可能达不到这个 15 万(应该说99%的情况下都达不到),例如,测得的结果是 8 万,那也不要气馁,无论 8 万还是 15 万,只是特定环境下的一个特定值而已,基准 的意义,仍然会发挥作用。 |
一些常见中间件的直观 TPS 的测量在测量之前,我们先在脑中做一下预估:
以上只需要预估量级就行。 |
Nginx 代理一下,会损失多少性能 |
加大并发连接数,是否可以提升 TPS实验步骤:
直接使用 Berf 测试工具,我们可以看出:
因此,并发连接数不是越多越好,在一个合理值下,取得较大 TPS,以及较小延时,才是一个合理的压测并发连接数。 |
TPS 哪些事儿
TPS 具体是指什么?
TPS 的英文全称是 Transactions Per Second,即每秒事务数。例如,每秒钟签名数量,每秒钟加密数量,每秒钟生成订单的数量等。有时候,我们见到类似的 HPS (每秒点击数),QPS(每秒查询数),RPS(每秒请求数)等,我们可以理解成是 TPS 的事务映射成点击、查询、请求的更加具体的解释上,为了方便起见,以下我们都统称 TPS。
为了让大家有一个直观的概念,我这里从一篇 2019 年的博客Database Comparison - SQL vs. NoSQL (MySQL vs PostgreSQL vs Redis vs MongoDB)上,扒拉了一个图,如下:
从这张图中,我们可以看到,查询性能上,Redis 能达到 500 万左右 TPS ( 5000/0.001), MongoDB 达到 5000 万左右 TPS ,简直令人咂舌,而可怜的 MySQL/PostgreSQL,只有 500 TPS左右(5000/10)。那么问题来了,如果我们自己在本机压测一下,会达到类似效果吗?思考几秒钟先。对了,你就需要去仔细检查人家的测试环境,包括硬件环境、网络环境、软件环境、测试数据等等,可以说,我们几乎不可能测得类似的结果。
The text was updated successfully, but these errors were encountered: