1、最大QPS推算及验证
(1)、RT
公式一:RT = Thread CPU Time + Thread Wait Time
RT(Response Time,响应时间)可以简单地理解为系统从输入到输出的时间间隔,系统是指一个网站或者一个其他类型的软件应用,或者指某个设备,比如手机,手机界面也有响应时间。所以RT是一个比较广泛的概念,不过在接下来的场景中,RT都特指互联网应用。服务器端RT的含义是指从服务器接受请求到该请求响应的全部数据被发往客户端的时间间隔。客户端的RT和含义是指从客户端(比如浏览器)发起请求到服务端(比如服务器)接收该请求的响应的全部数据的时间间隔。需要注意的是,服务端RT + 网络开销约等于客户端RT。也就是说,一个差的网络环境会导致两个RT差距悬殊。
(2)、单线程QPS
RT由两部分组成,一个是CPU Time,另一个是Wait Time。如果系统里只有一个线程或者一个进程(该进程中只有一个线程),那么最大的QPS的公式如下:
单线程QPS = 1000ms / RT
(3)、最佳线程数
最佳线程数的公式如下:
最佳线程数 = (RT/CPU Time) * CPU核数 * CPU利用率
(4)、最大QPS
QPS = 1000ms / CPU Time * CPU核数 * CPU利用率
CPU Time
CPU Time是由以下因素来决定的:
均摊问题
Hash问题
排序和查找问题
状态机问题
序列化问题
CPU利用率
CPU利用率是由以下因素来决定的:
(1)、I/O能力
磁盘IO
网络IO
(2)、数据库连接池(并发能力 = PoolWaitTime / RT * Pool Size)
(3)、内存不足:GC大量占用CPU,导致给业务逻辑使用的CPU利用率下降
(4)、共享资源竞争,比如各种锁策略,各种阻塞队列等等。
(5)、所依赖的其他后端QPS低造成瓶颈
(6)、线程数或者进程数,乃至线程模型
2、TCP传输原理
TCP通过“发送-应答(ACK确认)-重传机制”来确保传输的可靠性,它是端到端进行传输的。对于大型网站,响应报文从服务器端给客户端浏览器进行报文的传输,所以在服务器端,可以通过优化来降低响应给客户端的网络耗时。传统的TCP底层实现,在很多时候会导致TCP传输效率变低,特别是网络带宽的扩充和整体网络硬件技术的提升,使得网络传输速度有了很大的变化。
2.1、TCP传输的简要说明
TCP传输是分段的,一个HTTP响应报文会被操作系统切成多个MSS大小(一般为1460B)的段,发送端每次只会发送若干段。能够发送多少个数据包,由拥塞窗口和接收端窗口共同决定,直到接收端接收到完整的报文为止。在此过程中,报文分段按照顺序进行发送,每个报文段在发送时,会做顺序编号,以便能够完整正确地组装,所以当HTTP请求响应模型将请求发送给服务器时,服务器响应都需要多个RTT的传输,物理距离越远,总体网络耗时越长。
2.2、滑动窗口-接收端流量控制
滑动窗口本质上是接收方的TCP数据报缓冲区大小的数据的,发送方根据这个数据来计算自己最多能发送多长的数据。如果发送方收到接收方的窗口大小为0的TCP数据报,那么发送方会停止发送数据,等到接收方发送的窗口大小不为0的数据报的到来。
TCP就是用这个窗口,满满地从数据的左边缘移动到右边缘,把处于窗口范围内的数据发送出去,这就是窗口的意义。
2.3、拥塞窗口-发送端流量控制
接收端流量控制在局域网内做流量控制是可行的,但是在公网上就会出现问题。网络数据包在传输过程中,要经过很多路由器转发,而这些路由器的带宽和缓冲区大小是不确定的。路由器的缓冲区太小,会造成数据包大量堆积甚至拥塞,而接收端的缓冲区一般很大,此时会造成大量的网络拥塞,从而加剧整个网络的拥塞,甚至造成整个互联网不可用。为了解决这个问题,TCP发送方需要确认连接双方线路的数据最大的QPS是多少,这就是所谓的网络拥塞窗口。
拥塞窗口的原理:TCP发送端首先发送一个(或者数个)数据报文段,然后等待对方的回应,ACK回应后就把这个窗口的大小加倍,然后连续发送两个数据报,对方回应以后,再把这个窗口加倍,这个机制就是发送端拥塞控制的慢启动算法。
对慢启动算法的简单理解:先发送少量的数据报文段,得到确认后,再将发送报文段的个数增加,直到出现超时错误或者丢包;发送端因此了解到网络的承受能力,也就确定了拥塞窗口的大小,发送方就根据这个拥塞窗口的大小发送数据。