Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 392|回复: 1

后台服务高并发

[复制链接]

695

主题

1139

帖子

4064

积分

认证用户组

Rank: 5Rank: 5

积分
4064
发表于 2018-11-9 11:00:30 | 显示全部楼层 |阅读模式
本帖最后由 java 于 2018-11-9 12:15 编辑

后台服务高并发
操作系统层面调优
////////模式///////
1.单节点、顺序
2.单节点、并发
受主机资源限制:CPU、内存、网络
3.多节点、代理
受代理主机资源限制:CPU、内存、网络
4.多代理、集群
可平行扩展

////瓶颈 - 代理入口////////
1.文件数限制

每个socket本质是一个文件(分配一个文件描述符FD)

每accept创建一个socket

进程能创建的socket数量有限制

1.1 nofile
每个进程能打开的文件数
用户级限制
临时修改
ulimit -n 655350
永久修改
echo '*           soft   nofile        655350' >> /etc/security/limits.conf
echo '*           hard   nofile        655350' >> /etc/security/limits.conf
上限受nr_open限制
1.2 nr_open
每个进程能打开的文件数
系统级限制
临时修改
sysctl -w fs.nr_open=1048576
永久修改
echo 'fs.nr_open = 1048576' >> /etc/sysctl.conf
sysctl -p
1.3 file-max
整个系统能打开的文件数
临时修改
sysctl -w fs.file-max=655350
永久修改
echo 'fs.file-max = 655350' >> /etc/sysctl.conf
sysctl -p

////////瓶颈 - 代理出口////////////
1.端口数限制

与后端建立连接需要占用端口

操作系统端口个数有限制

操作系统端口释放有延时
1.1 ip_local_port_range
可用端口范围
临时修改
sysctl -w net.ipv4.ip_local_port_range=1024 65535
永久修改
echo 'fs.net.ipv4.ip_local_port_range = 1024 65535' >> /etc/sysctl.conf
sysctl -p
1.2 TIME_WAIT/CLOSE_WAIT/FIN_WAIT_2
socket.png

CLOSE_WAIT/FIN_WAIT_2一般是代码问题
tcp_fin_timeout设置FIN_WAIT_2状态超时时间
TIME_WAIT等待2MSL(Maximum Segment Lifetime)

1.3 tcp_tw_reuse
重用TIME_WAIT状态的连接
1秒后重用
临时修改
sysctl -w net.ipv4.tcp_tw_reuse=1
永久修改
echo 'fs.net.ipv4.tcp_tw_reuse = 1' >> /etc/sysctl.conf
sysctl -p
需要同时开启代理和后端的tcp_timestamps
解决延迟包产生的混淆问题

1.4 tcp_timestamps
TCP头增加时间戳
消除序列号重复引发的问题
计算RTT(Round Trip Time)
计算RTO(Retransmission Timeout)
tcp_tw_recycle
回收TIME_WAIT状态的连接
n * RTO后回收
不适用NAT环境
很难保证不在NAT环境
不建议使用

1.5 长连接
与后端使用长连接
tcp_keepalive_*
tcp_keepalive_time/tcp_keepalive_probes/tcp_keepalive_intvl
系统级参数
定期发送检测报文
超时重传
程序需主动使用SO_KEEPALIVE
//////////////瓶颈 - 代理资源////////////////////1.CPU
代理是非CPU密集型
CPU一般不是瓶颈
2.内存
/tcp_rmem/tcp_wmem
每个socket读/写缓冲区大小
包括三个数值——最小值、默认值、最大值
临时修改
sysctl -w net.ipv4.tcp_rmem=4096 4096 6291456
sysctl -w net.ipv4.tcp_wmem=4096 4096 4194304
永久修改
echo 'net.ipv4.tcp_rmem = 4096 4096 6291456' >> /etc/sysctl.conf
echo 'net.ipv4.tcp_wmem = 4096 4096 4194304' >> /etc/sysctl.conf
sysctl -p


内存
tcp_mem
socket使用的内存限制
临时修改
sysctl -w net.ipv4.tcp_mem=378852 505139 757704
永久修改
echo 'net.ipv4.tcp_mem = 378852 505139 757704' >> /etc/sysctl.conf
sysctl -p
小于第二个数值时系统不会干预socket创建
大于第二个数值时会进入”内存紧张状态”
达到第三个数值时将无法创建socket

内存
tcp_max_orphans/tcp_orphan_retries
orphan状态socket数量限制
不属于任何进程的socket
一般由链路或代码问题导致
临时修改
sysctl -w net.ipv4.tcp_max_orphans=65536
sysctl -w net.ipv4.tcp_orphan_retries=2
永久修改
echo 'net.ipv4.tcp_max_orphans = 65536' >> /etc/sysctl.conf
echo 'net.ipv4.tcp_orphan_retries = 2' >> /etc/sysctl.conf
sysctl -p





回复

使用道具 举报

695

主题

1139

帖子

4064

积分

认证用户组

Rank: 5Rank: 5

积分
4064
 楼主| 发表于 2019-2-20 16:27:57 | 显示全部楼层
数据请求过大,可以客户端配置DNS进行均衡 lvb.png

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|firemail ( 粤ICP备15085507号-1 )

GMT+8, 2020-5-26 02:43 , Processed in 1.283549 second(s), 22 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表