高并发调优
1 前言
目前轻量级服务的应用是基于EMAP架构开发,Java容器为weblogic,JDK1.6,EMAP底座版本为B159/B203。
编写此文档的目的是用于解决高并发应用场景时,轻量级服务如何保障高可用,不存在性能、宕机等问题。
目前轻量级服务出现高并发的应用有学生体温上报、教职工健康打卡、校内电子通行证等应用,出现高并发场景的学校有电子科技大学、东南大学、海南大学、北京体育大学、重庆大学,根据以上几个学校在运行时的监控和问题排查所总结出的经验,整理出此文档以便于类似的服务可根据以下内容做出相应的调整,来保障服务的可用性。
2 硬nginx.conf中件要求
序 |
用途 |
服务器配置 |
并发数 |
备注 |
1 |
IDS |
内存:16G CPU:8核 网络:1000M 操作系统:OpenEuler-22.03-SP2 中间件:weblogic、redis |
IDS6:750 IDS7:1000 |
IDS6与7的差异比较大,以实际部署的版本为准
|
2 |
AMP |
内存:12G CPU:2核 网络:1000M 操作系统:OpenEuler-22.03-SP2 中间件:weblogic |
500 |
|
3 |
轻服务服务器 |
内存:8G CPU:8核 网络:1000M 操作系统:OpenEuler-22.03-SP2 中间件:weblogic |
500 |
单节点部署,weblogic共享整个服务器的所有资源 |
3 运行环境优化
3.1 Nginx调优
● 限流
打开nginx里的配置文件“conf”,将以下配置在server节点之上
修改版:
1.nginx.conf中
limit_req_zone:定义到http区域:
或者如图:
2.casp_http.conf下配置
3.或者按照下面的方式配置,根据现场nginx判断
server {
listen 80;
server_name ehall.xxx.edu.cn;
limit_req_zone $binary_remote_addr zone=qljfwappLimit:20m rate=100r/s;
}
zone=qljfwappLimit:20m表示生成一个大小为20M,名字为qljfwappLimit的内存区域,用来存储访问的频次信息。
$binary_remote_addr 表示通过remote_addr这个标识来做限制,“binary_”的目的是缩写内存占用量,是限制同一客户端ip地址。
rate=100r/s表示允许相同标识的客户端的访问频次,这里限制的是每秒100次,还可以有比如1000r/m的。
这个参数可根据实际的应用场景做灵活的调整,若nginx前面有硬件负载,$binary_remote_addr
打开配置“conf”,将以下配置项配置在需要限制的location中
server {
listen 80;
server_name ehall.xxx.edu.cn;
location /qljfwapp {
charset utf-8;
default_type text/plain;
set $pgt_need 0;
set $self_logout '1';
set $cookie_self_domain 1;
access_by_lua_file /opt/ids_nginx_config/lua/mod_cas.lua;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://qljfw_server;
limit_req zone=qljfwappLimit burst=99;
}
}
zone=qljfwappLimit对应到上面一个参数中所定义的内存区域名称。
burst=99用于指定最大突发请求数,当rate的频次无法满足请求时,超出rate的部分且未超过burst的请求数会放入到请求队列中,将在下一秒中优先出队处理。默认配置为rate-1,例子中就是100-1=99
● nginx.conf主配置文件调优
以下是http节点处全局优化,可根据学校情况自选。
http {
#http连接超时时间,默认是60s,功能是使客户端到服务器端的连接在设定的时间内持续有效,当出现对服务器的后继请求时,该功能避免了建立或者重新建立连接。
keepalive_timeout 100;
lua_code_cache on;
#启用页面压缩,大大的提升页面的浏览速度
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_comp_level 2;
gzip_types text/html application/json application/javascript text/plain text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
gzip_vary off;
gzip_disable "MSIE [1-6]\.";
#nginx 400 Bad request是request header过大所引起,由于cookie中写入了较大的值
client_header_buffer_size 128k;
large_client_header_buffers 4 128k;
#反向代理缓冲区配置,报proxy_temp Permission denied,避免大文件无法下载
proxy_buffering on;
proxy_buffer_size 10m;
proxy_buffers 4 10m;
proxy_busy_buffers_size 10m;
proxy_temp_file_write_size 10m;
proxy_max_temp_file_size 0;
#反向代理超时,导入大批量数据超时
proxy_connect_timeout 300;
proxy_send_timeout 300;
proxy_read_timeout 300;
}
3.2 Weblogic调优
JVM调优
支撑高并发场景,需要对JVM进行调优。
-Djava.awt.headless=true -Xms:2048m -Xmx:4096m
-Dweblogic.threadpool.MinPoolSize=50
-Dweblogic.threadpool.MaxPoolSize=100
参考数值
并发请求数 |
Xms |
Xmx |
MinPoolSize |
MaxPoolSize |
200 |
2048m |
4096m |
50 |
100 |
200-500 |
4096m |
8192m |
100 |
300 |
500-1000 |
8192m |
16384m |
150 |
500 |
JDBC连接池
并发请求数 |
最小连接数 |
最大连接数 |
200 |
50 |
100 |
200-500 |
100 |
250 |
500-1000 |
250 |
500 |
3.3 操作系统调优
检查文件打开数,如果显示1024需要优化,否则高并发情况下会报错error:too many open files,无法响应用户请求
ulimit -n
vi /etc/security/limits.conf 在最下面增加
* soft nproc 65536
* hard nproc 65536
* soft nofile 65536
* hard nofile 65536
vi /etc/profile,在最后增加
ulimit -n 65535
执行source /etc/profile 使配置立即生效,避免重启操作系统
source /etc/profile
3.4 网络调优
在轻服务的服务器中调整hosts配置,减少服务器之间网络影响。
vim /etc/hosts,IP地址是Nginx的内网IP地址
hosts
10.62.0.102 gateway.wisedu.com
10.62.0.102 auth.wisedu.com
10.62.0.102 ehall.wisedu.com
10.62.0.102 res.wisedu.com
4 历史数据转移
数据分两种类型,流程类项目与非流程类项目。
非流程类业务数据,建议1-2个月或200W+迁移一次。
流程类业务数据,建议2个月或10万条数据迁移一次。
5 常见问题
1、如果报错Closing socket as no data read from it on 121.194.16.77:45,246 during the configured idle timeout of 5 secs时,需要调整登录时长,将5秒改为20秒
这说明线程遭遇的阻塞,请求一直未响应,可能会造成线程池爆掉,可导出线程栈查看因为什么原因而导致的阻塞,可能是程序导致,也可能是数据库查询引起。