最近用Golang做了一个项目,产品需求是“单服要达到5000并行处理”
硬件配置如下:
CPU:Intel(R) Xeon(R) CPU E5-2620 v2 @ 2.10GHz
MEM:32G
DISK:SCSI 600G 10000转/秒
OS:Centos 6.6
好了,先解决并发连接问题,对linux系统环境做了一些优化,优化过程如下:
优化内核参数:
1:修改系统资源限制文件:/etc/security/limit.conf
参照配置文件帮助描述,添加如下配置
* hard nofile 1025500
* soft nofile 1025500
server hard nproc 181960
server soft nproc 181960
2:修改系统控制配置文件:/etc/sysctl.conf
添加如下配置,每个选项是请自行百度或查阅相关书籍
添加完后记得:sysctl –p 以确保起作用
fs.file-max=1025500
net.nf_conntrack_max=1025500
net.netfilter.nf_conntrack_max=1025500
net.core.netdev_max_backlog=30000
net.core.somaxconn=10000
net.core.rps_sock_flow_entries=32768
net.ipv4.tcp_max_syn_backlog=10000
net.ipv4.tcp_max_tw_buckets=10000
net.ipv4.tcp_fin_timeout=10
net.ipv4.tcp_timestamps=0
net.ipv4.tcp_tw_recycle=0
net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_syncookies=1
net.ipv4.tcp_synack_retries=10
net.ipv4.tcp_window_scaling=1
net.ipv4.tcp_keepalive_time=180
net.ipv4.tcp_keepalive_intvl=30
net.ipv4.tcp_keepalive_probes=5
net.ipv4.ip_local_port_range=1024 65535
kernel.sem = 10240 671078400 10240 65535
好了,到此为止,已经可以达到并发连接100W,是没问题了,但并意味着单个物理机就能并行处理
100W,还会受各种IO限制比如磁盘IO等等.
此时测试单服处理能力:1500并发连接,每个连接处理200个事务
测试结果:根据统计结果,有513笔业务处理时长超过1s,单笔处理时长最长已达:1min24s
显然这个结果离产品需求相去甚远,为了取得更好性能需求,下面做进一步的负载均衡,我
首先采用广受赞誉的nginx做一个简单的负载均衡
Nginx负载均衡设置:
在http节点添加如下设置:
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
upstream honorServer {
server 127.0.0.1:6620 weight=2;
server 127.0.0.1:6520;
}
server {
listen 7878;
server_name localhost;
location / {
proxy_pass http://honorServer;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
未完待续…