性能优化|Tomcat 服务优化

vascript" URIEncoding="utf-8" keepAliveTimeout="0"
关闭shutdown端口:
关闭ajp连接:注释


取消访问日志Valve阀门
prefix="localhost_access_log." suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
/>

图示:

性能优化|Tomcat 服务优化


3. linux内核优化

3.1 linux 默认值 open files 和 max user processes 为 1024

#ulimit -n

1024

#ulimit –u

1024

问题描述:

说明server只允许同时打开1024个文件,处理1024个用户进程,使用ulimit -a 可以查看当前系统的所有限制值,使用ulimit -n可以查看当前的最大打开文件数。新装的linux 默认只有1024,当作负载较大的服务器时,很容易遇到error: too many open files 。

解决方法:

使用 ulimit –n 65535 可即时修改,但重启后就无效了。

有如下三种修改方式:

在/etc/security/limits.conf 最后增加:

* soft nofile 65535

* hard nofile 65535

* soft nproc 65535

* hard nproc 65535

3.2 其他的linux配置优化


性能优化|Tomcat 服务优化


net.ipv4.tcp_syncookies = 1 开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击;
net.ipv4.tcp_tw_reuse = 1 开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0
net.ipv4.tcp_tw_recycle = 1 开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
net.ipv4.tcp_fin_timeout = 30 如果套接字由本端要求关闭,它决定了它保持在FIN-WAIT-2状态的时间。
net.ipv4.tcp_keepalive_time = 1200 当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 3 probe 3次(每次30秒)不成功,内核才彻底放弃。
tcp_keepalive_time = 7200 seconds (2 hours)
tcp_keepalive_probes = 9
tcp_keepalive_intvl = 75 seconds
net.ipv4.ip_local_port_range = 1024 65000 用于向外连接的端口范围。缺省情况下很小:32768到61000,改为1024到65000。
net.ipv4.tcp_max_syn_backlog = 8192 SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。
net.ipv4.netdev_max_backlog = 1000 表示进入包的最大设备队列,默认300,改大
net.core.tcp_max_tw_buckets = 5000 系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息。默认为180000,改为 5000。
另外可以参考优化内核配置:
/proc/sys/net/core/wmem_max 最大socket写buffer,可参考的优化值:873200
/proc/sys/net/core/rmem_max 最大socket读buffer,可参考的优化值:873200

/proc/sys/net/ipv4/tcp_wmem TCP写buffer,可参考的优化值: 8192 436600 873200
/proc/sys/net/ipv4/tcp_rmem TCP读buffer,可参考的优化值: 32768 436600 873200
/proc/sys/net/ipv4/tcp_mem
同样有3个值,意思是:配置单位为页,不是字节
net.ipv4.tcp_mem[0]:低于此值,TCP没有内存压力. 786432
net.ipv4.tcp_mem[1]:在此值下,进入内存压力阶段. 1048576
net.ipv4.tcp_mem[2]:高于此值,TCP拒绝分配socket. 1572864
/proc/sys/net/core/somaxconn 256
listen()的默认参数,挂起请求的最大数量.默认是128.对繁忙的服务器,增加该值有助于网络性能.
/proc/sys/net/core/optmem_max socket buffer的最大初始化值,默认10K.
/proc/sys/net/ipv4/tcp_retries2 TCP失败重传次数,默认值15.减少到5,以尽早释放内核资源.
net.core.somaxconn = 32768 socket监听(listen)的backlog上限,是socket的监听队列。比如nginx定义
NGX_LISTEN_BACKLOG默认到511


4. nginx优化

1. worker_processes 8;nginx 进程数,建议按照cpu 数目来指定,一般为它的倍数 (如,2个四核的cpu计为8)。

2. worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;为每个进程分配cpu,上例中将8个进程分配到8个cpu,当然可以写多个,或者将一个进程分配到多个cpu。

3. worker_rlimit_nofile 65535;这个指令是指当一个nginx 进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit -n)与nginx进程数相除,但是nginx分配请求并不是那么均匀,所以最好与ulimit -n 的值保持一致。

查看linux系统文件描述符的方法:

[root@web001 ~]# sysctl -a | grep fs.file

fs.file-max = 789972

fs.file-nr = 510 0 789972

4. use epoll; 使用epoll 的I/O 模型

5. worker_connections 65535;每个进程允许的最多连接数,理论上每台nginx 服务器的最大连接数为worker_processes*worker_connections。

6. keepalive_timeout 60;keepalive 超时时间。

7. client_header_buffer_size 4k;客户端请求头部的缓冲区大小,这个可以根据你的系统分页大小来设置,一般一个请求头的大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为分页大小。分页大小可以用命令getconf PAGESIZE 取得。

[root@web001 ~]# getconf PAGESIZE

4096

但也有client_header_buffer_size超过4k的情况,但是client_header_buffer_size该值必须设置为“系统分页大小”的整倍数。

8. open_file_cache max=65535 inactive=60s;这个将为打开文件指定缓存,默认是没有启用的,max 指定缓存数量,建议和打开文件数一致,inactive 是指经过多长时间文件没被请求后删除缓存。

9. open_file_cache_valid 80s;这个是指多长时间检查一次缓存的有效信息。

10. open_file_cache_min_uses 1;open_file_cache 指令中的inactive 参数时间内文件的最少使用次数,如果超过这个数字,文件描述符一直是在缓存中打开的,如上例,如果有一个文件在inactive 时间内一次没被使用,它将被移除。

性能优化|Tomcat 服务优化


四、集群优化

当线程数达到250以上,考虑群集部署,集群部署需要考虑的两个问题:Tomcat部署和session共享,Tomcat<4时,可用tomcat内部的集群session共享,否则采用redis方式集群

集群部署原理图:

性能优化|Tomcat 服务优化


redis实现session共享的原理

性能优化|Tomcat 服务优化


Redis实现seesion共享的步骤如下:

1. 下载以下包放到tomcat的lib目录下

TomcatRedisSessionManager-1.1 .jar

Jredis-2.8.0.jar

Commons-logging-1.2.jar

Commons-pool2-2.4.1.jar

2. 在tomcat里面增加如下配置



创建一个redis的配置文件redis-data-cache.properties,放在conf.d目录

redis.hosts=127.0.0.1:6379
redis.cluster.enabled=false
#- redis database (default 0)
#redis.database=0
#- redis connection timeout (default 2000)
#redis.timeout=2000

五、压力测试

Ab测试

吞吐率(Requests per second):总请求数 / 处理完成这些请求数所花费的时间

并发连接数(The number of concurrent users,Concurrency Level):一个用户可能同时会产生多个会话,也即连接数

用户平均请求等待时间(Time per request):处理完成所有请求数所花费的时间/ (总请求数 / 并发用户数)

服务器平均请求等待时间(Time per request: across all concurrent requests)计 算 公 式 : 处 理 完 成 所 有 请 求 数 所 花 费 的 时 间 / 总 请 求 数

使用示例:

ab –n 1000 –c 100 url/

如果只用到一个Cookie,那么只需键入命令:

ab -n 100 -C key=value http://test.com/

如果需要多个Cookie,就直接设Header:

ab -n 100 -H “Cookie: Key1=Value1; Key2=Value2” http://test.com/

关注我,私信回复我“666"或者“Java架构"获取免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!


分享到:


相關文章: