如何提高服务器并发能力


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

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

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

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

讨论硬件没有多大意义

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

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

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

1. 回归问题的本质

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

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. 服务器性能怎么测?

Usually, what we test is QPS, which is the number of requests per second. However, in order to measure the overall performance of the server, it is best to test the number of concurrent connections and the number of requests together during the test.

  • Test Principle

To test the number of concurrent connections, each concurrent 1 request is used, and multiple concurrent connections are performed;

The number of test requests is multi-concurrent and each concurrent multiple requests are carried out. The total number of requests will be = the number of concurrent requests * the number of single concurrent requests. It should be noted that the results obtained by different concurrent and single concurrent requests will be different, so It is best to test multiple times and take the average.

Reference:
https://www.51sjk.com/b19b329206/

Guess you like

Origin blog.csdn.net/craftsman2020/article/details/128023265