Edehuag

导航

keepaLive

参数:
net.ipv4.tcp keepalive time=7200
net.ipv4.tcp keepalive intvl=75
net.ipv4.tcp keepalive probes=9

当启用(默认关闭)keepalive 时,TCP在连接没有数据通过的7200秒后发送keepalive 探测消息,当探测没有确认时,按75秒的重试频率重发一直发9个探测包都没有确认,就认定连接失效。
所以总耗时一般为:2小时11分钟(7200 秒+ 75 秒*9 次)

server 端开启TCP keepalive 两种方式:
ServerBootstrap bootstrap =new ServerBootstrap();
bootstrap.childoption(channeloption.SO_KEEPALIVE,true)
bootstrap.childoption(Niochanneloption,of(standardsocketoptions,SO_KEEPALIVE), true)

除了tcp层的keepalive之外,我们普遍还需要在应用层启动keepalive,一般称之为:应用心跳(心跳机制)

为什么应用还要做心跳?

1、协议分层,各层关注点不同,网络传输层关注网络是否可达,应用层关注是否能正常提供服务
2、tcp的keepalive默认关闭,并且经过路由等中转设备后keepalive包有可能被丢弃
3、tcp层的keepalive时间太长,默认>2小时,虽然可改,但是属于系统参数一旦改动影响该机器上的所有应用

应用何时发送心跳消息?

1、定时keepalive消息,keepalive 消息与服务器正常业务消息交换完全不关联,定时就发送
缺点:浪费资源,因为业务消息的正常收发侧面证明了网络和服务是正常的
2、ldle 监测:负责诊断,诊断后做出不同的行为,一般用来配合keepalive ,减少keepalive
应用心跳较好的方案:开启空闲监测,判定为Idle时才发keepalive,有其他数据传输的时候,不发送keepalive

idle的优势:
快速释放损坏的、恶意的、很久不用的连接,让系统时刻保持最好的状态
实际应用中:结合起来使用。按需keepalive,保证不会空闲,如果空闲,关闭连接。

Netty提供的idle检测机制:
netty提供了一个IdlestateHandler,它是ChannelDuplexHandler类型的,可以用于检测channel是否处于读写空闲的状态

idle监测+keepalive的作用:
1,监测网络的可达性,服务状态是否正常
2,快速释放损坏的、恶意的、很久不用的连接,让系统时刻保持最好的状态

服务端添加read idle check,10s接收不到channel数据就断掉连接,保护自己,瘦身
客户端添加write idle check+keepalive,5s不发送数据就发送一个keepalive,避免连接被断,也避免频繁keepalive

readerldleTime 读数据的空闲时间
writerldleTime:写数据的空闲时间
allldleTime读或写的空闲时间

简述为什么要做Keepalive与idle监测,以及如何做,有什么要注意的地方

,keepalive是为了检测服务的健康状态能近实时的掌握网络状况和服务运行状况
2,tcp协议栈是有Keepalvie机制的,但默认未开启,不过就算开启,TCP 在连接没有数据通过的7200秒后发送keepalive 探测消息,当探测没有确认时,按75秒的重试频率重发,一直发9 个探测包都没有确认,就认定连接失效,总时长2 小时11 分钟(7200 秒+ 75 秒* 9 次),时间太长了
3,除了在tcp网络层开启keepalive之外,我们普遍还需要在应用层启动keepalive,一般称之为:应用心跳,因为协议分层,各层关注点不同,网络传输层关注网络是否可达,应用层关注是否能正常提供服务,且tcp的keepalive默认关闭,并且经过路由等中转设备后keepalive包有可能被丢弃,以及tcp层的keepalive时间太长,默认>2小时,虽然可改,但是属于系统参数一旦改动影响该机器上的所有应用
4,要做ide检测一般用来配合keepalive,减少keepalive 消息,空闲监测+判定为Idle时才发keepalive,有其他数据传输的时候,不发送keepalive ,无数据传输超过一定时间,判定为Idle,再发keepalive

posted on 2024-11-28 16:32  饿得慌~  阅读(7)  评论(0编辑  收藏  举报