一、Tomcat工作原理 1. TCP的三次握手四次挥手三次握手: 说明: 类比于A和B打电话: A对B说:你好,我是A,你能听到我说话吗? B对A说:嗯,我能听到你说话 A对B说:好,那我们开始聊天吧 在服务器上使用如下命令能看到当前服务器的连接情况 netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' 返回结果说明: LAST_ACK 5 (正在等待处理的请求数) 四次挥手: 说明: 同样用A和B打电话来说明: A对B说:我说完了,我要挂电话了 B对A说:等一下,我还没说完 B继续对A说:我说完了,你可以挂电话了 A对B说:好,我挂电话了 其他参数说明: CLOSED:无连接是活动的或正在进行 2. Tomcat内部结构
上图说明: ·server:指的是整个应用的上下文, 也是最顶层的容器,tomcat中所有的东西都在这个server里边。 ·service:指的是一个服务,主要的功能是把connector组件和engine组织起来,使得通过connector组件与整个容器通讯的应用可以使用engine提供的服务。 ·engine:服务引擎,这个可以理解为一个真正的服务器,内部提供了多个虚拟主机对外服务。 ·host:虚拟主机,每一个虚拟主机相当于一台服务器,并且内部可以部署多个应用,每个虚拟主机可以绑定一个域名,并指定多个别名。 ·context:应用上下文,每一个webapp都有一个单独的context,也可以理解为每一个context代表一个webapp。 ·connector:连接器组件,可以配置多个连接器支持多种协议,如http,APJ 等 组件说明: Tomcat常见组件: 连接器类组件: ·连接器(connectors):负责连接客户端(可以是浏览器或Web服务器)请求至Servlet容器内的Web应用程序,通常指的是接收客户发来请求的位置及服务器端分配的端口。默认端口通常是HTTP协议的8080,管理员也可以根据自己的需要改变此端口。还可以支持HTTPS ,默认HTTPS端口为8443。同时也支持AJP,即(A)一个引擎可以配置多个连接器,但这些连接器必须使用不同的端口。默认的连接器是基于HTTP/1.1的Coyote。同时,Tomcat也支持AJP、JServ和JK2连接器。 容器类组件: 被嵌套类(nested)组件: 这类组件通常包含于容器类组件中以提供具有管理功能的服务,它们不能包含其它组件,但有些却可以由不同层次的容器各自配置。 二、优化思路1. 网络优化BIO、NIO、NIO2、APR,也就是阻塞与非阻塞 1.1、非阻塞,Tomcat8已经取消BIO四种请求连接模型 1.2、启用压缩,消耗CPU,减小网络传输大小compression='on' 2. 并发优化最大线程数 连接数:maxConnections(最大连接数) 3. 底层优化JVM优化 JVM优化:固定堆内存,多线程并发收集,对象预留新生代,大对象进入老年代,启用内联 三、优化实战1. 优化tomcat.conf配置文件/etc/tomcat/tomcat.conf文件修改JAVA_OPTS JAVA_OPTS=“-server –Xmx2048m–Xms2048m –Xmn768m - XX:TargetSurvivorRatio=90 -XX:PetenureSizeThreshold=1000000 - XX:MaxTenuringThreshold=30 –XX:+UseParallelGC 2. 优化server.conf配置文件/etc/tomcat/server.conf文件修改配置 图示: 3. linux内核优化3.1 linux 默认值 open files 和 max user processes 为 1024#ulimit -n 3.2 其他的linux配置优化net.ipv4.tcp_syncookies = 1 开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击;net.ipv4.tcp_tw_reuse = 1 开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0net.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 = 30net.ipv4.tcp_keepalive_probes = 3 probe 3次(每次30秒)不成功,内核才彻底放弃。tcp_keepalive_time = 7200 seconds (2 hours)tcp_keepalive_probes = 9tcp_keepalive_intvl = 75 secondsnet.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没有内存压力. 786432net.ipv4.tcp_mem[1]:在此值下,进入内存压力阶段. 1048576net.ipv4.tcp_mem[2]:高于此值,TCP拒绝分配socket. 1572864/proc/sys/net/core/somaxconn 256listen()的默认参数,挂起请求的最大数量.默认是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)。 四、集群优化当线程数达到250以上,考虑群集部署,集群部署需要考虑的两个问题:Tomcat部署和session共享,Tomcat<> 集群部署原理图: redis实现session共享的原理
Redis实现seesion共享的步骤如下: 1. 下载以下包放到tomcat的lib目录下 TomcatRedisSessionManager-1.1 .jar 2. 在tomcat里面增加如下配置
创建一个redis的配置文件redis-data-cache.properties,放在conf.d目录 redis.hosts=127.0.0.1:6379redis.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/ 看完文章的小伙伴,顺手投个票吧,说说你想看哪些方向的技术文章。让我们一起共同学习,共同成长。
|
|
来自: 昵称25533110 > 《待分类1》