性能测试中解决服务器并发数最大数限制

因为AWS 服务很多都具有自动扩容的功能,所以为了保护服务器的安全,防止某些ip恶意高并发访问服务器,需要对ip并发和速度进行限制。

但这特别要说明一点,关于公网ip,实际测试中,如果将某个ip并发设置为1,公网ip下的所以设备均被认为是同一个ip的并发,就会造成公网ip下只能有一个设备可以访问成功的现象,所以不能将并发设置过小。(实际测试现象可能就是一个公司可能只有一个公网ip,下面很多电脑同时访问nginx均为被认为同一个ip的并发)。 
现在突然对这个有了深刻认识,某人游戏开挂整个网吧被封理解了。

在网上查到nginx提供了limit_zone及limit_rate模块用于处理这种问题。 
ngx_http_limit_conn_module模块文档: 
http://nginx.org/en/docs/http/ngx_http_limit_conn_module.html 
ngx_http_limit_req_module模块文档: 
http://nginx.org/en/docs/http/ngx_http_limit_conn_module.html

1 限制单IP并发访问数量
2 限制单IP访问速度
3 测试
3.1 未配置nginx时测试
3.2 配置参数
3.3 配置后测试结果
1 限制单IP并发访问数量
我们采用nginx提供的的ngx_http_limit_conn_module模块实现该功能。

ngx_http_limit_conn_module模块用于限制连接数量,特别是来自单个IP地址的连接数量。并非所有的连接都被计数。只有当服务器处理了请求并且已经读取了整个请求头时,连接才被计数。

示例配置:

http {
    limit_conn_zone $binary_remote_addr zone=addr:10m;
    ...
    server {
        ...
        location /download/ {
            limit_conn addr 1;
        }
}

 

limit_conn_zone $binary_remote_addr zone=addr:10m;


为共享内存区域设置参数,该区域将保留各种键的状态。特别是,该状态包含当前的连接数。该key可以包含文本,变量,他们的组合。 
语境用于http语法块

$binary_remote_addr对于IPv4地址,变量的大小始终为4个字节,对于IPv6地址则为16个字节。存储状态在32位平台上始终占用32或64个字节,在64位平台上占用64个字节。一个兆字节的区域可以保持大约32000个32字节的状态或大约16000个64字节的状态。如果区域存储耗尽,服务器会将错误返回 给所有其他请求。10M可存储160000个状态

 limit_conn addr 1 


设置给定键值的共享内存区域和最大允许连接数。超过此限制时,服务器将返回 错误以回复请求。 
语境用于http, server, location这些语法块内

2 限制单IP访问速度
ngx_http_limit_req_module模块(0.7.21)用于限制每一个请求的处理速率,特别是从一个单一的IP地址的请求的处理速率。

示例配置:

http {
    limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
    ...
    server {
        ...
        location /search/ {
            limit_req zone=one burst=5;
        }
}


平均每秒不超过1个请求,并且突发不超过5个请求。

 limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;


为共享内存区域设置参数,该区域将保留各种键的状态。特别是,存储当前的过多请求数。该key可以包含文本,变量,他们的组合。

 limit_req zone=one burst=5;


设置共享内存区域和请求的最大突发大小。如果请求速率超过为某个区域配置的速率,则它们的处理会延迟,从而使请求按指定速率处理。过多的请求被延迟,直到它们的数量超过最大突发大小,在这种情况下请求被终止并出现错误。

3 测试
3.1 未配置nginx时测试
首先 使用ab 工具模拟下并发访问API 
并发数测试:

ab -r -k -c 50 -n 100 http://172.28.28.4:3006/files/abtest

请求速度测试: 

ab -r -k -c 10 -n 100 http://172.28.28.4:3006/abtest 


3.2 配置参数
在http块下添加

http {
    limit_conn_zone $binary_remote_addr zone=addr:10m;#记录160000个请求 超过将返回失败 
    limit_req_zone $binary_remote_addr zone=one:10m rate=30r/s;#单个请求小于30r/s
    server {
               limit_conn addr 10;
                limit_req zone=one burst=50;
        }
}
  limit_conn addr 50;
  limit_req zone=one burst=150;


3.3 配置后测试结果
并发数测试 

ab -r -k -c 20 -n 100 http://172.28.28.4:3006/abtest 


并发数超过后出现了失败

请求速度测试 

ab -r -k -c 10 -n 100 http://172.28.28.4:3006/abtest 


可以看出100个请求在3.3秒完成符合30r/s

原文:https://blog.csdn.net/m0_37263637/article/details/80764896 
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
App最大并发的计算通常需要考虑以下几个方面: 1. 服务器并发处理能力:首先需要了解服务器的性能指标,例如处理器的核、内存容量和带宽等。根据服务器配置和性能测试据,可以推算出服务器能够同时处理的最大请求量。 2. 网络带宽和延迟:网络带宽和延迟也会对最大并发产生影响。如果服务器的网络带宽较小或者网络延迟较高,会导致服务器同时处理请求的能力下降。 3. 请求的处理时间:不同请求所需要的处理时间是不同的。一些请求可能需要较长的处理时间,而另一些请求可能只需要很短的处理时间。通过对每种请求的处理时间进行分析,可以计算出在给定时间内能够处理的最大请求量。 4. 据库和其他资源的并发性:如果App需要频繁地访问据库或其他共享资源,那么据库和共享资源的并发性也需要考虑。如果据库或其他资源的并发性有限,那么最大并发将受到限制。 5. 负载均衡和分布式架构:在面对高并发的情况下,如果采用负载均衡和分布式架构,可以将请求分散到多个服务器上进行并发处理,从而提高最大并发。 综上所述,计算App最大并发需要综合考虑服务器性能、网络状况、请求处理时间、资源并发性以及架构设计。根据具体情况进行性能测试和分析,可以得出可靠的最大并发
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值