如何提高服务器并发能力


如何提高服务器并发能力,理论依据、方法是什么

呐,一台服务器,到底能处理多少并发?1万,10万,一百一千万?由什么决定呢?

不用说,最终肯定是由硬件决定!更强的cpu、更大的内存、更高的带宽、更高速的io设备……来一台IBM大型机,再菜的鸟也能整到百万并发

转载请注明原著:博客园老钟 https://www.cnblogs.com/littlecarry/

讨论硬件没有多大意义

我们要讨论的事,普通固定硬件条件下,如何提升单体服务器的并发能力。

并发,也就是单位时间里服务器处理的最大请求数,通常定义为1秒时间内。

首先明确一点,提高服务器并发能力,是一个系统性问题,不是一两个方法就能解决的。

1. 回归问题的本质

面对外部并发访问,服务器的行为描述为两点:连接请求、处理请求
并发

1.1 连接请求

成千上万的请求,同时连到服务器,如何高效管理?

1.2 处理请求

那么多的请求要处理,如何快速执行完,然后返回、释放资源?

一个请求执行的时间越短,服务器单位时间内能处理的请求就越多,并发能力就越强。

2. 什么制约处理速度

要提升服务器并发能力,就是要提升“连接请求”、“处理请求”的处理速度,

2.1 提升操作系统的IO连接管理能力

涉及面:阻塞、非阻塞、同步、异步IO,多路复用等。一个请求打到服务器,服务器要分配他内存、线程、cpu等资源,共享的方式,可以节约很多资源。

提升方法:基于NIO多路复用技术 ,可以让上亿的请求,同时连在一台服务器上高效管理

2.2 提升操作系统的IO读写能力

涉及面:网络IO、硬盘IO、内存等。io的读写是很慢的,非常重要的瓶颈,请求的执行,可能涉及网络IO、硬盘IO、内存的读写,缩短或屏蔽这些读写,将大大提升执行速度。

提升方法:零拷贝、DMA、缓存等

2.3 改善系统资源竞争

涉及面:线程数量、锁竞争、内存申请释放、系统参数配置等

提升方法:

  • 1)线程越多,操作系统切换线程上下文消耗越大,线程少,IO的阻塞可能导致系统空转。通过实际调试分配合适的线程数量

  • 2)锁的种类很多,悲观、乐观,重入等等,选择合适的锁,能提升资源的竞争率。所有的锁都是悲观锁,是不可取的。

  • 3)内存合理的申请、释放,能节约资源的消耗

  • 4)系统参数、jvm参数,很多根据实际情况分配

2.4 改善编写代码能力

涉及面:代码架构、代码逻辑、代码对内存的操作等

提升方法:多写代码,多看设计模式、架构,多了解内存模型

3. 小结:

以上四点,也可以认为是性能瓶颈

很多网上说nginx的并发量是2万、5万、6万……,都是不对的,一是nginx的代码架构,并没有对并发量的约束,二是脱离了硬件。nginx的架构没有约束“连接请求”,“处理请求”,就看你对性能瓶颈的改善,以及你的硬件,这两点提升了,并发佰亿可能不是问题

当然,这里还有一个“单机性能”的问题,不用切换线程的操作系统,执行当然最快。所以需要处理百万级别的并发,分布式处理效率才是最高的。还有灾备、高可用等等问题

本文只是提供基本的理论思路,很多具体的方法不细说,得自行查询

4. 相关概念

  1. 概念
  • 并发连接数-SBC(Simultaneous Browser Connections)

并发连接数指的是客户端向服务器发起请求,并建立了TCP连接。每秒钟服务器链接的总TCP数量,就是并发连接数。

  • 请求数-QPS(Query Per Second)/RPS(Request Per Second)

请求数有2个缩写,可以叫QPS也可以叫RPS。单位是每秒多少请求。Query=查询,也相当于请求。请求数指的是客户端在建立完连接后,向http服务发出GET/POST/HEAD数据包,服务器返回了请求结果后有两种情况:

· 1)http数据包头包含Close字样,关闭本次TCP连接;

· 2)http数据包头包含Keep-Alive字样,本次连接不关闭,可继续通过该连接继续向http服务发送请求,用于减少TCP并发连接数。

  1. 服务器性能怎么测?

通常情况下,我们测试的是QPS,也就是每秒请求数。不过为了衡量服务器的总体性能,测试时最好一起测试并发连接数和请求数。

  • 测试原理

测试并发连接数采用每个并发1请求,多个并发进行;

测试请求数采用多并发、每个并发多个请求进行,总的请求数将会=并发数*单并发请求数,需要注意的是不同的并发和单并发请求数得出来的结果会不同,因此最好测试多次取平均值。

参考:
https://www.51sjk.com/b19b329206/

猜你喜欢

转载自blog.csdn.net/craftsman2020/article/details/128023265