1.TPS和QPS
tps:每秒处理的事务数
qps:每秒处理的请求数
请求一个页面,只是一个事务(tps+1),可是可能有n个请求(qps+n)。
2.NIO
用户-系统内核-硬件,每次数据交互会有对此数据拷贝,
可以采用derectBuffer(非jvm的物理内存)实现用户数据零拷贝。
nio进一步减少用户和系统内核的数据拷贝,MappedByteBuffer将文件数据直接拷贝到用户空间。
channel,selector
串行io -> 多线程io -> 多路复用nio
nio基于块处理,同时处理多个channel,每个channel处理io
channel是双向的,可以同时读写
selector是基于事件监听的,不断轮询channel,如果channel有时间更新就处理
3.jvm锁-synchronize
synchronize基于操作系统metux实现的,metuxenter-metuxexit。
锁级别:无锁-轻量级锁-偏向锁-自旋锁-重量级锁
优化锁的方式:
JIT优化(锁消除,编译时候发现锁对象只会被一个线程使用就撤销这个锁;
锁粗化,几个锁代码块合并,减少不必要的申请释放锁);
减少锁粒度,锁住的范围尽量小;
尽量使用将锁处于轻量级。
4.上下文切换(context swith cs)
什么是上下文切换:一个线程被暂停使用剥夺使用权,另一个线程被操作系统选中开始或重新执行。
线程并不是越多越好,过少导致资源浪费,过多导致资源竞争激烈上下文切换过多性能差。
多线程的上下文切换是由线程的两个运行状态切换导致的。
上下文切换性能差:操作系统要给保存和恢复上下文。
在多线程中锁不是性能开销分根源,锁竞争才是。
减少上下文切换:减小锁粒度,减少锁持有时间,不使用notifyall,合理设置线程数。