我们会在本章介绍 pipelining 技术的原理研究客户端如何通过pipelining 技术来加速自己的吞吐量。
pipelining 原理
pipelining 技术可以在不改变服务端实现的情况下加速客户端的性能,其原理见图4-1。
如图4-1所示,pipelining是一种网络技术,支持pipelining的客户端可以将多个请求通过同一个 TCP 连接连续不断地发送给服务端而不需要等待服务端的响应。
不使用 pipelining技术的客户端和服务端之间的互动是乒乓式的,客户端会等待服务端返回第一个请求的响应之后才发送第二个请求,有一部分时间被浪费在一来一回等待的网络开销上。令Ts
等于客户端发送请求到服务端的时间,Tr
等于服务端发送响应到客户端的时间,Tp
等于服务器处理请求的时间,那么客户端收到第N个请求响应需要NX(Ts+Tr+Tp)
,服务器真正用于处理请求的时间是 N * Tp
总共花费在网络传输上的时间是 NX(Ts+Tr)
,也就是N个请求和响应在网络上来一回的时间。
使用pipelining技术的客户端将会一次性发送多个请求给服务端,服务端集中处理和发回响应。客户端收到第N个请求响应需要 Ts+Tr+N*Tp
,服务器处理请求的时间还是 N*Tp
,总共花费在网络传输上的时间只有 Ts+Tr
。所以 N 越大pipelining 技术能带来的性能提升就越大。N 表示一个批次发送的请求数量,我们将N称为pipeline的长度。
小结
pipelining技术能给我们的客户端性能带来一定的提升,而且pipeline长度越高,性能提升的幅度越大。使用同步的 pipelining 技术,在测试中特意积攒请求,直到满足 pipeline 长度要求后才发出去,然后一一等待服务端的响应。
真实客户端在正常使用缓存的时候是不需要积攒请求的。只要上层应用有请求过来,客户端就可以发出,响应的接收通常会有其他 goroutine (或线程)负责。
无须发送方等待响应。这种行为是 pipelining 技术的异步实现,性能更好,更适用于生产环境。
在不改变服务端实现的前提下,pipelining 技术是客户端赖以提升性能的法宝。