记录一次网站并发访问量的踩坑历程

技术选型:django+nginx做网站配置

项目最初版本是使用的django+nginx,使用 http直接访问的配置:

#直接做web服务器时, 所监控地址
http = 0.0.0.0:8000

具体数量没测试,当时差不多达到1000左右的并发访问,项目就卡爆了

后续改成

django的socket连接+nginx

#使用nginx连接时, 监控地址,注,这里要写服务器内网地址
socket=127.0.0.1:8003
#设置socket的监听队列大小(默认:100)

具体数量没测试,依旧卡到爆

继续找问题,并发量性能可能由nginx控制,毕竟中间走了一层nginx

提升nginx处理:

events {
    worker_connections 65535;
}

还是卡到爆

修改项目socket监听

#使用nginx连接时, 监控地址,注,这里要写服务器内网地址
socket=127.0.0.1:8003
#设置socket的监听队列大小(默认:100)
listen = 1000

结果linux系统不支持这么多并发,查过知道linux内部也有个并发控制:

[root@localhost core]# sysctl -a | grep net.core.somaxconn
net.core.somaxconn = 128
[root@localhost core]# 

[root@localhost core]# sysctl -a | grep net.core.somaxconn
net.core.somaxconn = 128
[root@localhost core]# sysctl -w net.core.somaxconn=1024
net.core.somaxconn = 1024
[root@localhost core]# sysctl -a | grep net.core.somaxconn
net.core.somaxconn = 1024
[root@localhost core]# 

需要改高点,才能提升listen数量,改成1024,还是卡,最后改成10240,listen改为8000,依旧卡

linux除了改net.core.somaxconn这个参数外,还需要改net.ipv4.tcp_max_syn_backlog这个参数,都改成10240,卡顿现象解决

踩坑的过程中分析了下具体原理,查了TCP三次握手的原理,看到出现很多半连接异常,这些异常应该是之前连接数不够导致的服务器来不及处理

具体TCP半连接、全连接参见下文:

TCP 半连接队列和全连接队列满了,怎么破?_内核

nginx+django并发访问问题处理:
https://blog.csdn.net/qq_31851107/article/details/103497779
关于TCP队列信息溢出的排查和解释(SYNC溢出和accept queue溢出)
https://blog.csdn.net/weixin_34050427/article/details/92709382
https://www.jianshu.com/p/3ecc99ebf566
注:linux并发访问设置即时生效,重启需要重新设置

又卡了一次:

继续改:net.core.somaxconn,net.ipv4.tcp_max_syn_backlog都改成40960,卡顿现象解决

服务器并发访问:

查看服务器并发访问数 - 博客林

uwsgi+nginx提升并发量:

nginx+uwsgi提高并发量配置_uwsgi 高并发请求配置_皓阳当空的博客-CSDN博客

nginx+uwsgi高并发配置_芋圆萌萌哒的博客-CSDN博客

Nginx+uWSGI为Django提供高并发-腾讯云开发者社区-腾讯云

内核参数理解:

/proc/sys/net/ipv4/ 下网络参数的理解以及sysctl命令修改内核参数_li_101357的博客-CSDN博客

为了防止丢包,以下两个参数请设置为0:

echo 0 > /proc/sys/net/ipv4/tcp_tw_reuse
echo 0 > /proc/sys/net/ipv4/tcp_tw_recycle

服务器重启之后要做的并发性能提升!

redis连接的时候,出现大量的

Error 99 connecting to r-bp1askpyozdg8qfc7c.redis.rds.aliyuncs.com:6379. Cannot assign requested address.

解决方案:

出现Error 99 connecting to Redis服务器并报告"Cannot assign requested address"错误通常表示Redis服务器没有足够的资源来处理连接请求,或者是由于Redis服务器的最大连接数已经达到,导致进程打开新的套接字时无法为其分配地址。

下面是一些可能的解决方案:

1. 增加Redis服务器的最大连接数,可以通过配置Redis的maxclients参数来实现。这个参数的默认值是10000,在性能较好的服务器上可以适当地增加这个值。

2. 优化Redis服务器的系统参数,增加系统网络资源,例如打开足够数量的TCP端口等。 在Linux操作系统中,可以编辑 /etc/sysctl.conf 文件来修改内核参数,例如 net.ipv4.tcp_tw_reuse 、net.ipv4.ip_local_port_range 等参数。

3. 检查ECS服务器是否存在端口冲突或网络问题,如防火墙等是否阻止了连接请求。

4. 对于阿里云ECS服务器,可以检查是否设置了安全组并配置了相应的入站规则,以确保Redis服务器的端口是开放的。

重新配置之后,您可以试着重启 Redis 服务器来使其生效。

Error 99 connecting to Redis 服务器并报告 "Cannot assign requested address" 的问题通常是由于系统中可用的本地端口耗尽导致的,这时需要修改一些网络参数来解决问题。

以下是修改 net.ipv4.tcp_tw_reuse 和 net.ipv4.ip_local_port_range 网络参数的步骤:

1. 修改net.ipv4.tcp_tw_reuse参数:

首先,打开终端并使用以下命令编辑 /etc/sysctl.conf 文件:

sudo vi /etc/sysctl.conf

进入编辑界面后,找到以下行:

#net.ipv4.tcp_tw_reuse = 0

把注释去掉,并将值改为1:

net.ipv4.tcp_tw_reuse = 1

然后保存并关闭文件。

在命令行中运行以下命令来使更改生效:

sudo sysctl -p

2. 修改 net.ipv4.ip_local_port_range 参数:

同样使用以下命令编辑 /etc/sysctl.conf 文件:

sudo vi /etc/sysctl.conf

查找以下行:

#net.ipv4.ip_local_port_range = 32768 61000

取消该行的注释并将其后的值更改为:1024 65535

net.ipv4.ip_local_port_range = 1024 65535

保存并关闭文件,然后在命令行中运行以下命令使更改生效:

sudo sysctl -p

这些更改将增加系统中可用的本地端口数量,并解决“Cannot assign requested address”问题。



或者:
sysctl -a | grep net.ipv4.tcp_tw_reuse

sysctl -a |grep net.ipv4.ip_local_port_range

sysctl -w net.ipv4.tcp_tw_reuse=1

ss -ant dport=:6379 or sport=:6379


最后我用的以下解决方案:
https://help.aliyun.com/document_detail/202156.html?spm=5176.21213303.J_6704733920.7.31f253c9JEkJSA&scm=20140722.S_help@@%E6%96%87%E6%A1%A3@@202156._.ID_help@@%E6%96%87%E6%A1%A3@@202156-RL_Error%2099%20connecting%20to%20Cannot%20as-LOC_main-OR_ser-V_2-RK_rerank-P0_0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值