linux配置keep_alive

基本介绍

Keep alive 可以设置在操作系统级别, 作用于对本机所建立的连接. 在设定的时间内对远程主机返送一个简单的tcp 包,用来探测远程主机是否还有响应。

主要应用场景有2个:

  1. 更早的知道远程主机down 掉了。
    正常情况下A 主机 和B 主机建立了连接。 A 发送了信息给B 主机,B 说收到了, A 开始等待。 但B 主机down 掉了, 但B 又没有对A 说自己已经down 了, 所以A 会一直等下去(除非应用程序设置的有timeout 机制)。使用了keep alive 可以更早的探测到B down 掉了。

  2. A 和 B 之间的其他网络设备会主动关闭掉太空闲的连接, 因为网络设备用来保持2台机器的连接是需要资源的,而资源是有限的。
    如果A, B 上的应用程序有时交换请求的时间会比较长,例如需要创建一个大的索引。 当过了一段时间后A 通过已建立的连接去和B 通信,然而这个连接却已经被中间的某些设备关闭掉了。就会带来不必要的麻烦。 所以可以通>过keep alive 的机制,定期的发送一些请求,让那些中间设备知道2个机器之间还有交互,从而就不会关闭连接了。

为了解决上述的2个问题, 大部分程序不会自己去实现一个keep alive 的功能。当可以很方便的使用Linux 所提供的这个服务, 只需要在创建socket 的时候,告诉Linux Kernel 说我需要你的 Keep alive 功能。

int keepalive = 1;
setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &keepalive , sizeof(keepalive ));

相关参数:

tcp_keepalive_time

发送keep alive 包的时间间隔,单位是秒。

tcp_keepalive_intvl
如果发送的,但没有回应。过多久才会再发一个。

tcp_keepalive_probes
发送多少个都没有回应,会认为对方是down 掉了。

cat /proc/sys/net/ipv4/tcp_keepalive_time
cat /proc/sys/net/ipv4/tcp_keepalive_intvl
cat /proc/sys/net/ipv4/tcp_keepalive_probes
echo ‘60’ > /proc/sys/net/ipv4/tcp_keepalive_time
echo 60 > /proc/sys/net/ipv4/tcp_keepalive_intvl
echo 20 > /proc/sys/net/ipv4/tcp_keepalive_probes

上述方式仅仅对当前Linux 实例有效。 如果想保证始终有效需要修改/etc/sysctl.conf
net.ipv4.tcp_keepalive_time=60
net.ipv4.tcp_keepalive_intvl=60
net.ipv4.tcp_keepalive_probes=20
参考文档

http://tldp.org/HOWTO/TCP-Keepalive-HOWTO/overview.html

http://tldp.org/HOWTO/TCP-Keepalive-HOWTO/usingkeepalive.html

http://stackoverflow.com/questions/17740492/how-i-will-use-setsockopt-and-getsockopt-with-keep-alive-in-linux-c-programming

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值