ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

熟悉 Tomcat与Netty,请求处理流程,NIO 底层原理,线程池优化。掌握Nginx基本配置,进行流量限制与转移分发,配合OpenResty编写Lua脚本实现业务极高并发。并熟练掌握JMeter

熟悉 Tomcat与Netty,请求处理流程,NIO 底层原理,线程池优化。掌握Nginx基本配置,进行流量限制与转移分发,配合OpenResty编写Lua脚本实现业务极高并发。并熟练掌握JMeter Tomcatserver对应整体tomcat服务内置一个叫 卡特玲娜的 service 。会有多个connector连接负责处理不同的服务端口如http80 s 443。在向里面会有多个host 、 每个虚拟host对应一个文件夹默认webapps每个host里有又会有多个servlet处理不同的post和get请求内置filter过滤器所以request里面可以拿到不同的host和servleturi。默认server.tomcat.max-threads200server.tomcat.max-connections8912server.tomcat.accept-count100server.tomcat.max-http-form-post-size2MBserver.tomcat.min-spare-threads10server.tomcat.connection-timeout60000maxConnections、maxThreads、acceptCount 参数accept-count最大等待数官方文档的说明为当所有的请求处理线程都在使用时所能接收的连接请求的队列的最大长度。当队列已满时任何的连接请求都将被拒绝。accept-count的默认值为100。详细的来说当调用HTTP请求数达到tomcat的最大线程数时还有新的HTTP请求到来这时tomcat会将该请求放在等待队列中这个acceptCount就是指能够接受的最大等待数默认100。如果等待队列也被放满了这个时候再来新的请求就会被tomcat拒绝connection refused。maxThreads最大线程数每一次HTTP请求到达Web服务tomcat都会创建一个线程来处理该请求那么最大线程数决定了Web服务容器可以同时处理多少个请求。maxThreads默认200肯定建议增加。但是增加线程是有成本的更多的线程不仅仅会带来更多的线程上下文切换成本而且意味着带来更多的内存消耗。JVM中默认情况下在创建新线程时会分配大小为1M的线程栈所以更多的线程异味着需要更多的内存。线程数的经验值为1核2g内存为200线程数经验值2004核8g内存线程数经验值800。maxConnections最大连接数官方文档的说明为这个参数是指在同一时间tomcat能够接受的最大连接数。对于Java的阻塞式BIO默认值是maxthreads的值如果在BIO模式使用定制的Executor执行器默认值将是执行器中maxthreads的值。对于Java 新的NIO模式maxConnections 默认值是10000。对于windows上APR/native IO模式maxConnections默认值为8192这是出于性能原因如果配置的值不是1024的倍数maxConnections 的实际值将减少到1024的最大倍数。如果设置为-1则禁用maxconnections功能表示不限制tomcat容器的连接数。maxConnections和accept-count的关系为当连接数达到最大值maxConnections后系统会继续接收连接但不会超过acceptCount的值。我们可以把tomcat比做一个火锅店流程是取号、入座、叫服务员可以做一下三个形象的类比acceptCount 最大等待数可以类比为火锅店的排号处能够容纳排号的最大数量排号的数量不是无限制的火锅店的排号到了一定数据量之后服务往往会说已经客满。maxConnections 最大连接数可以类比为火锅店的大堂的餐桌数量也就是可以就餐的桌数。如果所有的桌子都已经坐满则表示餐厅已满已经达到了服务的数量上线不能再有顾客进入餐厅了。maxThreads最大线程数可以类比为厨师的个数。每一个厨师在同一时刻只能给一张餐桌炒菜就像极了JVM中的一条线程ToB tomcat不用调总共也没几个qps会从前端页面访问tomcat最小10 最大200白天用的繁忙的时候扩容最大值200。晚上就10节约cpu资源也没请求不用考虑并发。ToC 业务一定要动最大200太小了一般配置为4c8g 放到800而且最小最大都一样不要让它扩缩容因为本来服务接口就是专门给Toc接口调用的没有闲置队列设置5000以上连接数5w。当然这个800需要压测得出来就是压最核心的一系列业务场景接口请求的qps压力直接拉满1wqps请求去压开始的时候最大默认200之后得出一个平均的响应的tps之后慢慢的调大tomcat线程池看它的平均tps会不会上去要是增多了就继续加它会到达一直极限就是再增加也不会变大的TPS了那么就不需要动了说明性能瓶颈已经不在tomcat了其他的中间件压测调优思路也一样就是基于现有的TPS慢慢的优化参数。Netty1.Reactor主线程MainReactor对象通过select监听连接事件收到事件后通过Acceptor处理连接事件2.当Acceptor处理连接事件后MainReactor将连接分配给SubReactorsubreactor将连接加入到连接队列进行监听并创建handler进行各种事件处理3.当有新事件发生时subreactor就会调用对应的handler处理4.handler通过read读取数据分发给后面的worker线程处理5.worker线程池分配独立的worker线程进行业务处理并返回结果6.handler收到响应的结果后再通过send将结果返回给client7.Reactor主线程可以对应多个Reactor子线程即MainRecator可以关联多个SubReactor8.开发者可以自定义ChannelPipeline创建多个自定义的Handler类似拦截器NIOBIO阻塞式io每一个客户端读写事件都需要服务器一个线程去处理。NIO非阻塞io一个服务器端线程可以同时处理多个客户端连接请求。selector模式服务端线程主动轮询客户端线程是否有io消息没有则返回-1有就进行处理。epoll模式服务端线程不需要主动轮询由操作系统发送io事件会自动的告诉服务线程去处理请求。Nginx基本配置http{# 定义upstream服务器组 upstream backend_servers{# 使用server指令定义后端服务器 server backend1.example.com;server backend2.example.com weight2;# 权重设置为2表示此服务器接收的请求是其他服务器的两倍 server192.168.1.1backup;# 作为备份服务器当其他非备份服务器都不可用时才会被使用 server192.168.1.2down;# 当前标记为down不会被调度到请求 # 还可以添加其他参数如#keepalive32;# 保持连接到上游服务器的空闲连接数# 负载均衡算法可选默认是轮询#least_conn;# 使用最少连接的服务器#ip_hash;# 使用IP哈希实现会话持久性#hash$request_uri;# 根据请求URI的哈希值选择服务器#hash$remote_addr;# 根据客户端IP的哈希值选择服务器# 其他参数和指令...}server{listen80;server_name your_domain.com;location/{# 引用upstream服务器组进行代理 proxy_pass http://backend_servers;# 其他配置...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_set_header X-Forwarded-Proto $scheme;}#...其他配置...}#...其他http块配置...}nginx -t 验证配置文件是否正确nginx -s reload 不重启刷新配置Lua脚本EVAL “return tonumber(ARGV[1]) tonumber(ARGV[2])” 参数个数 参数1 参数2SCRIPT LOAD “return tonumber(ARGV[1]) tonumber(ARGV[2])”返回一个固定的hash值不会变EVALSHA hash 2 3 4启动时就把 SCRIPT LOAD 带上这样就可以防止重启redis丢失lua脚本的情况了。keepalived一台为主服务器MASTER一台为备份服务器BACKUP但是对外表现为一个虚拟IP自定义检测脚本进行探活。Haproxy类似nginx 7层负载均衡。OpenRestyLuaNginx
返回列表