如何提高服务器并发处理能力
什么是服务器并发处理能力
一台服务器在单位时间里能处理的请求越多,服务器的能力越高,也就是服务器并发处理能力越强。
服务器的本质工作就是,争取以最快的速度将内核缓冲区中的用户请求数据一个不剩地都拿出来,然后尽快处理,再将响应数据放到一块又能够与发送数据的缓冲区中,接着处理下一拨请求。
而服务器并发处理能力,可以通过吞吐率来观察,吞吐率,单位时间里服务器处理的最大请求数,单位req/s。可以利用Jmeter工具进行测试服务器服务器并发处理能力。
例如服务器的性能,web程序的并发能力,代码,数据库等等,这里以一个Web程序为例,说明一下提高服务器处理并发能力的
服务性能提高
服务器之所以可以同时处理多个请求,在于操作系统通过多执行流体系设计使得多个任务可以轮流使用系统资源,这些资源包括CPU,内存以及I/O. 这里的I/O主要指磁盘I/O, 和网络I/O。
服务器的性能也可能是性能的瓶颈,这个时候,就需要更好的服务器。比如单核CPU提高到多核,内存也需要增加。
web程序的并发能力
web程序员并发能力,web在相同时间内处理更多的请求,多线程处理最为关键。比如SpringBoot默认使用Tomcat,而tomcat的默认线程为200,即在同一时刻,只能处理200个请求,而其他需要排队等待,在服务器性能足够好的情况,就需要将Tomcat的处理线程增加到合适的大小。
线程的增加,需要经过性能测试,才能知道多少合适,线程的切换也是需要资源和时间的,因此不能无限扩大。
多个web同时处理。通过对web的集群,让web处理的并发增加。如图:
使用nginx作为转发,web服务器集群是的处理的请求数增加。
代码
1. 优化代码处理的速度,一空间换时间,对于执行的慢的程序,可以通过消耗内存(即构造新的数据结构)来进行优化。
2. 利用池化技术复用,池化技术能够减少资源对象的创建次数,提高程序的性能,特别是在高并发下这种提高更加明显。简单点来说,就是提前保存大量的资源,以备不时之需。线程的创建是非常耗时和消耗资源的,通过池化池化技术解决这一点。
3. 减少使用不必要的锁。服务器处理大量并发请求时,多个请求处理任务时存在一些资源抢占竞争,这时一般采用“锁”机制来控制资源的占用,当一个任务占用资源时,我们锁住资源,这时其它任务都在等待锁的释放,这个现象称为锁竞争。
通过锁竞争的本质,我们要意识到尽量减少并发请求对于共享资源的竞争。比如在允许情况下关闭服务器访问日志,这可以大大减少在锁等待时的延迟时间。要最大程度减少无辜的等待时间。
数据库
数据库往往成为程序的瓶颈,程序多数都需要查询数据库,而数据库的查询插入都是有一定性质,特别是在数据量特别大的时候。
1. SQL优化以提升SQL执行效率;优化那些查询慢的语句,并通过创建索引等手段来优化。
2. 数据库读写分离避免读、写锁带来的性能开销;Mysql实现主动,主插入操作,而查询使用从数据库。