这里所说的程序是指对外提供tcp/ip交互协议的服务性程序。网络程序性能分析很重要,比如随着网络请求流量越来越大,我们需要知道已部署的服务能不能满足需求。这里采用对网络服务程序进行建模的方法分析影响程序性能的各要素,并计算相关性能值,它不够精确,但对我们使用其它工具对网络程序进行性能测试提供很好的理论指导。
1.网络请求
图1
什么是网络请求?如图1是《UNIX 网络编程》一书中表示网络交互过程的一幅图,整个请求是指从客户端到服务端 write->read->write->read的一个过程。对于服务端需要关心的是read-处理-write的过程。
connect相关操作在此是忽略的,因为其对服务端性能并没有什么影响。
一个请求中,在服务端read可能进行多次,如http协议中,我们可能先要读取头部信息,然后再读取一次数据实体,对于一个请求更为精确的定义是:
把相邻的操作都合并,如多次连续read合并为一个,从一个read开始到下一个read开始的过程即为一个请求。
在一个长连接里就可以发生多个请求,因为有多个read-处理-write过程
服务端的请求处理过程总结如下:
1.从网络接口读取数据
2.处理请求
3.将处理结果发送至网络接口
2.性能指标
这里参考<<High Performance MySQL>> 一书 38页对于相关性能值的解释说明,本人即看此书看到这里时想到要写本文。
吞吐量:每秒处理的请求数(事务数),请求定义见上节
响应时间(延迟):请求处理响应时间,对于服务端来说即一个read-处理-write流程的时间。下面会使用响应时间和延迟两种说法,意义一样。
并发度:某一刻处于请求处理过程的请求数。如图2所示,不同请求处于不同的处理过程,竖着的红线表示当前时刻的时间线,与时间线相交的请求数目即为并发度。
可伸缩性:作者的意思应该是别把系统的所有资源用到极限,要留有一定余地,以使整个系统具有可伸缩性,预防可能突然增大的请求流量。接下来的性能值计算都以极限值为标准,但实际使用过程中,不能让服务的性能值处于极限值上。
图2
3.性能函数表达式
吞吐量 = f1(CPU能力,CPU个数,磁盘IO能力,网络带宽能力,请求处理模型,网络流量,CPU计算时间,磁盘IO量,进程数)
响应时间 = f2(CPU能力,CPU个数,磁盘IO能力,网络带宽能力,请求处理模型,网络流量,CPU计算时间,磁盘IO量)
并发度 = f3(客户请求量,请求处理模型, 吞吐量,响应时间)
红色:正相关
绿色:负相关
硬件变量: CPU能力,CPU个数,磁盘IO能力,网络带宽能力(难以控制)
软件变量:请求处理模型,网络流量,CPU计算时间,磁盘IO量(控制难度中等)
参数变量:进程数,系统软件参数(较易控制)
对于任一单一变量来说,在其它变量值固定的情况下,它都有一个最大(小)值,超过这个最大(小)值,性能计算指示的值不随它的值变大(小)而变化,这是其它某个变量达到了瓶颈值,例如I/O能力有限的情况下,再怎么提高进程数对吞吐量也没用,我们将这种情况称为软限制。另外一些变量有一些限制值,该变量的值不可能超过该值,比如同时运行的进程数受限于CPU的个数,我们将这种情况称为硬限制。软限制由硬限制引起,当然对于某一组变量来说不存在如上限制的情况。
网络延时及连接队列长度不会影响性能量度,因为这两个变量从逻辑上讲跟网络服务程序的处理过程无关。网络延时是请求开始及完成后中间的信息传输过程,连接队列只是请求正式开始前一个暂存的机制。
4.硬件建模
相关硬件一个时刻只能给一个进程使用,除非有多个硬件设计如CPU才能实现同一时刻的并发,资源不够时需要等待。
CPU:每一个进程顺序执行指令,多个CPU可以并发。CPU使用率达到100%,进程可能有等待。
磁盘I/O : 多个进程I/O需要进行排队。假设需要的时间只根据读取或写入的数据量有关,不考虑寻道时间等。有可能出现IO等待
网络I/O: 多个进程I/O需要进行排队,也假设网络I/O的时间只跟要读取或发送的数据量有关。有可能出现IO等待
内存: 对于性能影响较小,往往只是作为磁盘的缓存来使用,加速磁盘I/O,对性能分析无益,可以忽略。
5.软件数据