关于TPS和响应时间的关系,对于大部分应用来说,响应时间一般由CPU执行时间,线程等待时间(IO等待,sleep和wait)组成,表面上看,TPS应该和RT是反比的关系,但是实际上则不是。
减少响应时间,并不能有效的提升TPS;
如果要提升服务器端的响应时间,减少IO时间能达到最佳效果;如果要提升TPS,采用优化CPU时间能达到最佳优化效果。
回到之前做应用服务优化的地方,改变了取数据的方式(注:从内存取,之前是从磁盘取),只是减少了IO时间,但是并没有使CPU的时间得到大规模减少,所以瓶颈依然存在,TPS并没有提升太多;但是改变了异步存消息的方式,使异步的线程的时间减少,在压测时,CPU的时间得到了成倍的释放,因此最佳并发线程数得到了提升,TPS得到大幅度提升,而由于是两个消息处理都是异步操作,对整体的响应时间,影响很小。
在软件测试中对并发如何处理和理解呢?受应用系统本身和网络延时的影响,绝对意义上的并发是没有的。 比如在实际应用中用户端向服务器同时发送相同的100个请求。由于网络传输延时的不等因素到底服务器时就不一定是100个请求同时落地。如果我们是想通过压力机模拟100个用户的请求,模拟器本身需要创建100个线程来实现100个并发请求。但目前的计算机还只能做到同步创建线程, 即使在客户端通过设置集合点的方式将100个请求同时提交,经过网络上的传输消耗,可能它们并不是同时到达,而即便100个请求同时到达服务器端,受到中间件和应用系统、数据库的各种连接池、缓冲区, CPU处理队列等的限制,也可能在服务器端产生等待。那么如何做到保证并发呢。这样看具体的业务或者操作了。如果是测试某个方法或者功能的是否存在并发性能问题,用模拟软件中的集合点可以满足需要。如果是涉及到业务的并发能了,那么集合点并不适用。只要对业务的场景设计合理就好了。另外,想知道某时刻的并发,可以通过压测工具进行实施监控,逐渐增加并发用户达到实时的并发。 如果是测试DB,可以通过监控DB的session得到并发数量。
进程同步用来实现程序并发执行时候的可再现性。
一.进程同步及异步的概念
1.进程同步:就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。也就是必须一件一件事做,等前一件做完了才能做下一件事.就像早上起床后,先洗涮,然后才能吃饭,不能在洗涮没有完成时,就开始吃饭.按照这个定义,其实绝大多数函数都是同步调用(例如sin,isdigit等)。但是一般而言,我们在说同步、异步的时候,特指那些需要其他部件协作或者需要一定时间完成的任务。最常见的例子就是
sendmessage。该函数发送一个消息给某个窗口,在对方处理完消息之前,这个函数不返回。当对方处理完毕以后,该函数才把消息处理函数所返回的lresult值返回给调用者。
2.异步
异步的概念和同步相对。当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。
以casycsocket类为例(注意,csocket从casyncsocket派生,但是其功能已经由异步转化为同步),当一个客户端通过调用connect函数发出一个连接请求后,调用者线程立刻可以朝下运行。当连接真正建立起来以后,socket底层会发送一个消息通知该对象。
这里提到执行部件和调用者通过三种途径返回结果:状态、通知和回调。可以使用哪一种依赖于执行部件的实现,除非执行部件提供多种选择,否则不受调用者控制。如果执行部件用状态来通知,那么调用者就需要每隔一定时间检查一次,效率就很低(有些初学多线程编程的人,总喜欢用一个循环去检查某个变量的值,这其实是一种很严重的错误)。如果是使用通知的方式,效率则很高,因为执行部件几乎不需要做额外的操作。至于回调函数,其实和通知没太多区别。