深入拆解Tomcat & Jetty
李号双
eBay技术主管
立即订阅
6067 人已学习
课程目录
已完结 44 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | Java程序员如何快速成长?
免费
模块一 必备基础 (4讲)
01 | Web容器学习路径
02 | HTTP协议必知必会
03 | 你应该知道的Servlet规范和Servlet容器
04 | 实战:纯手工打造和运行一个Servlet
模块二 整体架构 (9讲)
05 | Tomcat系统架构(上): 连接器是如何设计的?
06 | Tomcat系统架构(下):聊聊多层容器的设计
07 | Tomcat如何实现一键式启停?
08 | Tomcat的“高层们”都负责做什么?
09 | 比较:Jetty架构特点之Connector组件
10 | 比较:Jetty架构特点之Handler组件
11 | 总结:从Tomcat和Jetty中提炼组件化设计规范
12 | 实战:优化并提高Tomcat启动速度
13 | 热点问题答疑(1):如何学习源码?
模块三 连接器 (9讲)
14 | NioEndpoint组件:Tomcat如何实现非阻塞I/O?
15 | Nio2Endpoint组件:Tomcat如何实现异步I/O?
16 | AprEndpoint组件:Tomcat APR提高I/O性能的秘密
17 | Executor组件:Tomcat如何扩展Java线程池?
18 | 新特性:Tomcat如何支持WebSocket?
19 | 比较:Jetty的线程策略EatWhatYouKill
20 | 总结:Tomcat和Jetty中的对象池技术
21 | 总结:Tomcat和Jetty的高性能、高并发之道
22 | 热点问题答疑(2):内核如何阻塞与唤醒进程?
模块四 容器 (8讲)
23 | Host容器:Tomcat如何实现热部署和热加载?
24 | Context容器(上):Tomcat如何打破双亲委托机制?
25 | Context容器(中):Tomcat如何隔离Web应用?
26 | Context容器(下):Tomcat如何实现Servlet规范?
27 | 新特性:Tomcat如何支持异步Servlet?
28 | 新特性:Spring Boot如何使用内嵌式的Tomcat和Jetty?
29 | 比较:Jetty如何实现具有上下文信息的责任链?
30 | 热点问题答疑(3):Spring框架中的设计模式
模块五 通用组件 (4讲)
31 | Logger组件:Tomcat的日志框架及实战
32 | Manager组件:Tomcat的Session管理机制解析
33 | Cluster组件:Tomcat的集群通信原理
特别放送 | 如何持续保持对学习的兴趣?
模块六 性能优化 (8讲)
34 | JVM GC原理及调优的基本思路
35 | 如何监控Tomcat的性能?
36 | Tomcat I/O和线程池的并发调优
37 | Tomcat内存溢出的原因分析及调优
38 | Tomcat拒绝连接原因分析及网络优化
39 | Tomcat进程占用CPU过高怎么办?
40 | 谈谈Jetty性能调优的思路
41 | 热点问题答疑(4): Tomcat和Jetty有哪些不同?
结束语 (1讲)
结束语 | 静下心来,品味经典
深入拆解Tomcat & Jetty
登录|注册

38 | Tomcat拒绝连接原因分析及网络优化

李号双 2019-08-08
专栏上一期我们分析各种 JVM OutOfMemory 错误的原因和解决办法,今天我们来看看网络通信中可能会碰到的各种错误。网络通信方面的错误和异常也是我们在实际工作中经常碰到的,需要理解异常背后的原理,才能更快更精准地定位问题,从而找到解决办法。
下面我会先讲讲 Java Socket 网络编程常见的异常有哪些,然后通过一个实验来重现其中的 Connection reset 异常,并且通过配置 Tomcat 的参数来解决这个问题。

常见异常

java.net.SocketTimeoutException
指超时错误。超时分为连接超时读取超时,连接超时是指在调用 Socket.connect 方法的时候超时,而读取超时是调用 Socket.read 方法时超时。请你注意的是,连接超时往往是由于网络不稳定造成的,但是读取超时不一定是网络延迟造成的,很有可能是下游服务的响应时间过长。
java.net.BindException: Address already in use: JVM_Bind
指端口被占用。当服务器端调用 new ServerSocket(port) 或者 Socket.bind 函数时,如果端口已经被占用,就会抛出这个异常。我们可以用netstat –an命令来查看端口被谁占用了,换一个没有被占用的端口就能解决。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《深入拆解Tomcat & Jetty 》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(13)

  • magicnum
    增大accept队列长度使得tomcat并发短连接数暴增,必然导致服务器处理完请求后需要主动断开连的连接数增加;断开连接时四次挥手的最后一个阶段,客户端要等待2mls时间来保证服务端收到了客户端的ack(如果服务端没有收到最后一次挥手ack会重试,这时客户端需要重新发送ack),这时会导致大量time_wait;一旦达到上限将导致服务器拒绝服务
    2019-08-08
    14
  • 星辰
    老师 这个问题我查了一下别处的答案 https://mp.weixin.qq.com/s/KtcDxcY-pZBsvwJhwuKJmw

    说是tcp连接关闭的最后一步 time_wait 需要2MLS

    文中说到:
    请求方过多time_wait会导致“Cannot assign requested address”异常。

         服务方过多time_wait会导致”Too Many Open Files”异常。


    2019-08-08
    1
    3
  • 许童童
    TCP 连接处在 TIME_WAIT 状态,这个是TCP协议规定的,四次挥手时主动关闭方所处的一个状态,会等待2个MSL,所以在这个时间段内不会释放端口,如果并发量大的话,会导致端口不够用,从而影响新的TCP连接。
    2019-08-08
    2
  • xxxl
    老师能讲下 maxConnections 与 maxThreads 的区别和联系吗?

    作者回复: maxconnections 是连接数,maxthreads是线程数

    2019-08-08
    2
  • QQ怪
    保留timewait是为了是高效复用tcp连接,避免重复创建连接造成资源浪费,但过多的也会造成服务端文件打开数过多造成资源浪费
    2019-08-08
    1
  • 罗乾林
    连接在TIME_WAIT状态停留的时间为2倍的MSL。在2MSL等待期间,该端口不能再被使用。
    2019-08-08
    1
  • xxxl
    老师可以讲下:Jconsole 线程信息里 总阻止数和总等待数的含义吗?还有线程已启动的总数(这个数字很大)是什么意思?

    作者回复: 阻塞意味着线程在调用了lock或者synchronized等待锁,等待数表示等待某个条件变量,已启动线程总数包括了所有创建的线程,包括线程池中线程,acceptor,poller和后台线程

    2019-08-18
  • Liam
    time_waited过多会占用大量内存资源mbufs, 导致其他活跃连接无资源可用,拖慢了其他连接
    2019-08-13
  • Liam
    time_waited过多会占有大量内存资源mbufs),;/
    2019-08-13
  • 星辰
    哇 老师, 您这里讲的 和 网络编程 那一专栏里讲的部分内容一致诶 难怪我读起那篇文章来没有一点违和感,原来在这里已经阅读过一遍了啊。
    2019-08-09
  • 星辰
    老师 我问一个和今天讲的不相关的问题

    分布式系统里面可以使用多种不同的队列应用于不同的业务场景吗?

    分布式系统里面可以使用不用属性的分布式锁应用于不同的业务场景吗?
    2019-08-08
    1
  • -W.LI-
    老师好!TCP链接time_wait我和线程状态搞混了。。。我哭

    作者回复: 😄

    2019-08-08
  • nightmare
    timewait是由于什么原因引起的,tcp四次挥手的哪一个阶段?
    2019-08-08
收起评论
13
返回
顶部