性能测试是性能优化的前提,也是性能优化结果的检查和度量标准。不同视角下的性能优化有不同的标准,也有不同的优化手段。
响应时间是指应用系统从发出请求开始到收到最后响应数据所需要的时间。
并发数是指系统能够同时处理请求的数目,这个数字也反映了系统的负载特性。处理并发用户数,还存在着在线用户数和系统用户数。
吞吐量是指单位时间内系统处理的请求的数量,体现系统的处理能力。对于网站,可以用“请求数/秒”或是“页面数/秒”来衡量,也可以用“访问人数/天”或是“处理的业务数/小时”等来衡量。
吞吐量=(1000/响应时间ms)*并发数
性能计数器是描述服务器或操作系统性能的一些数据指标。包括System Load(使用top指令查看)、对象与线程数、内存使用、CPU使用、磁盘与网络I/O等指标。
性能测试是一个总称,具体可以分为性能测试、负载测试、压力测试、稳定性测试。
性能测试是指以系统设计初期的性能指标为预期目标,对系统不断施加压力,验证系统在资源可接受范围内,是否达到性能预期。
负载测试是指对系统不断增加并发数,使服务器的某项或多项性能指标达到安全临界值,这时候再增加压力,服务器的处理能力不会提升反而下降。
压力测试是指超过安全负载的情况下,对系统继续施加压力,直到系统崩溃或不能处理任何情况,以获得系统最大压力承受能力。
稳定性测试是指被测试系统在特定的硬件、软件、网络环境条件下,给系统一定的业务压力,是系统运行较长一段时间,依此检测系统是否稳定。
在生产环境下,业务请求是不均匀的,呈波浪形的,稳定性测试也应该是不均匀的对系统施加压力。
看下图可以得知:
在b点时,可以发挥系统最佳性能(不会浪费系统资源,同时又有一定的负载能力)。可以根据项目情况选择在b点的左右浮动
看下图可以得知:
使用更优的CPU、磁盘、内存、网卡,对软件的性能优化可能是数量级的,有时候远超代码和架构的性能优化。
网络传输能力不足时,可以选择提升网卡;核数核线程数
transparent huge page
介绍:http://blog.itpub.net/26736162/viewspace-2214374/
GC优化
软件架构优化三板斧:缓存、异步、集群
增加资源,提升并发
进程分时执行,能够在CPU有限的核数下,处理更多数量级的任务。
不同进程轮流在CPU上执行,每次都要进行进程间CPU切换,代价非常大。因此服务器应用通常是单进程多线程。
进程从操作系统获取基本的内存空间,所有的线程共享进程的内存地址空间。而每个线程也会拥有自己私有的内存地址范围,其它线程不能访问。
// TODO 专题学习
当执行函数时,会分配线程(开辟虚拟机栈-线程独有),函数中的基础类型变量会存放在栈中。引用类型的变量(也就是实例化对象)存放在堆中(线程共享)。当多个线程同时修改堆中的数据时,可能会存在有些修改动作失效。
多个线程间共享资源的这段代码被称为临界区,解决线程安全的主要方式就是加锁,将临界区的代码进行加锁,只有获得锁的线程才能执行临界区的代码。
CAS(V,E,N):V表示要更新的变量,E表示预期值,N表示最新值。在执行时,如果V等于E,则将V的值改成N,如果不相等则什么都不做。
CAS是一种系统原语,原语的执行过程必须是连续的,不允许被中断。
// 视频,01:30
当当前线程已经获得该锁,可以再次或多次获取相同的锁,避免造成死锁。
该锁只能被一个线程持有
该锁可以被多个线程持有
读不需要锁,写需要锁
认为每次操作都会发生修改,所以都会加锁。先加锁后修改
认为每次操作都可以修改成功,如果发生数据修改失败(类似CAS),则放弃。
分段锁
尝试获取锁的线程不会立即阻塞,而是采取循环的方式去尝试获取锁,可以减少线程切换,但是会消耗CPU。
synchronized轻量级锁就是自旋锁