pgpool-II中对 setsockopt 的利用

简介:
在研究 pcp_child.c 中的代码的时候,看到 pcp_do_accept 函数中有如下代码:

复制代码
if (setsockopt(afd, IPPROTO_TCP, TCP_NODELAY,                        
               (char *) &on,            
               sizeof(on)) < 0)            
{                        
    pool_error("pcp_child: setsockopt() failed: %s", strerror(errno));                    
    close(afd);                    
    return NULL;                    
}                        
复制代码
Google了一下,发现是:为了最小化 报文传输的延迟。就是说不会对报文合并,有了数据就进行发送。

但是下一个是比较奇怪的:

复制代码
if (setsockopt(afd, SOL_SOCKET, SO_KEEPALIVE,                        
               (char *) &on,            
               sizeof(on)) < 0)            
{                        
    pool_error("pcp_child: setsockopt() failed: %s", strerror(errno));                    
    close(afd);                    
    return NULL;                    
}
复制代码
Google了一下,人家都是这么说的:

复制代码
                                    
设置 SO_KEEPALIVE 选项            
            
SO_KEEPALIVE 保持连接检测对方主机是否崩溃,避免(服务器)永远阻塞于TCP连接的输入。            
            
设置该选项后,如果2小时内在此套接口的任一方向都没有数据交换,TCP就自动给对方 发一个保持存活探测分节(keepalive probe)。            
            
这是一个对方必须响应的TCP分节.            
它会导致以下三种情况:            
    对方接收一切正常:以期望的ACK响应。        
        2小时后,TCP将发出另一个探测分节。
    对方已崩溃且已重新启动:        
        以RST响应。套接口的待处理错误被置为ECONNRESET,套接 口本身则被关闭。
    对方无任何响应:        
        源自berkeley的TCP发送另外8个探测分节,相隔75秒一个,试图得到一个响应。    
        在发出第一个探测分节11分钟15秒后若仍无响应就放弃。套接口的待处理错误被置为ETIMEOUT,套接口本身则被关闭。
        如ICMP错误是“host unreachable(主机不可达)”,说明对方主机并没有崩溃,但是不可达,这种情况下待处理错误被置为 EHOSTUNREACH。在该书的第158页有更详细的描述。     
            
根据上面的介绍我们可以知道对端以一种非优雅的方式断开连接的时候,            
我们可以设置SO_KEEPALIVE属性使得我们在2小时以后发现对方的TCP连接是否依然存在。
    keepAlive = 1; Setsockopt(listenfd, SOL_SOCKET, SO_KEEPALIVE, (void*)&keepAlive, sizeof(keepAlive)); 
            
如果我们不能接受如此之长的等待时间,            
从TCP-Keepalive-HOWTO上可以知道一共有两种方式可以设置,            
    一种是修改内核关于网络方面的配置参数, 
    另外一种就是SOL_TCP字段的TCP_KEEPIDLE, TCP_KEEPINTVL, TCP_KEEPCNT三个选项。        
复制代码
英文说明在:http://tldp.org/HOWTO/TCP-Keepalive-HOWTO/programming.html

但是我的问题在于:pcp_pool_status等各种客户端命令,都是立即结束的。根本就不会维持和服务器端的长连接。经过试验,修改 下列参数:

/proc/sys/net/ipv4/tcp_keepalive_time 

/proc/sys/net/ipv4/tcp_keepalive_intvl

 

/proc/sys/net/ipv4/tcp_keepalive_probes

 

改为  tcp_keepalive_time=180秒  tcp_keepalive_intvl=10秒  tcp_keepalive_probes=6个

再次运行,无论程序中是否包含

if (setsockopt(afd, SOL_SOCKET, SO_KEEPALIVE, (char *) &on, sizeof(on)) < 0) { 
  pool_error("pcp_child: setsockopt() failed: %s", strerror(errno));
  close(afd);
  return NULL;
}

都可以正常多次运行 pcp_pool_status 命令,后台产生响应的 socket描述符的值也都一样。

怀疑当初的开发者考虑过长连接的问题:就是pcp_pool_status 之类不断运行,长连接并不断开。但最终pcp客户端并没有如此实现。



本文转自健哥的数据花园博客园博客,原文链接:http://www.cnblogs.com/gaojian/archive/2012/08/15/2639963.html,如需转载请自行联系原作者
目录
相关文章
|
1天前
|
云安全 人工智能 算法
以“AI对抗AI”,阿里云验证码进入2.0时代
三层立体防护,用大模型打赢人机攻防战
1277 1
|
8天前
|
编解码 人工智能 自然语言处理
⚽阿里云百炼通义万相 2.6 视频生成玩法手册
通义万相Wan 2.6是全球首个支持角色扮演的AI视频生成模型,可基于参考视频形象与音色生成多角色合拍、多镜头叙事的15秒长视频,实现声画同步、智能分镜,适用于影视创作、营销展示等场景。
669 4
|
1天前
|
机器学习/深度学习 安全 API
MAI-UI 开源:通用 GUI 智能体基座登顶 SOTA!
MAI-UI是通义实验室推出的全尺寸GUI智能体基座模型,原生集成用户交互、MCP工具调用与端云协同能力。支持跨App操作、模糊语义理解与主动提问澄清,通过大规模在线强化学习实现复杂任务自动化,在出行、办公等高频场景中表现卓越,已登顶ScreenSpot-Pro、MobileWorld等多项SOTA评测。
430 2
|
2天前
|
人工智能 Rust 运维
这个神器让你白嫖ClaudeOpus 4.5,Gemini 3!还能接Claude Code等任意平台
加我进AI讨论学习群,公众号右下角“联系方式”文末有老金的 开源知识库地址·全免费
|
1天前
|
存储 弹性计算 安全
阿里云服务器4核8G收费标准和活动价格参考:u2a实例898.20元起,计算型c9a3459.05元起
现在租用阿里云服务器4核8G价格是多少?具体价格及配置详情如下:云服务器ECS通用算力型u2a实例,配备4核8G配置、1M带宽及40G ESSD云盘(作为系统盘),其活动价格为898.20元/1年起;此外,ECS计算型c9a实例4核8G配置搭配20G ESSD云盘,活动价格为3459.05元/1年起。在阿里云的当前活动中,4核8G云服务器提供了多种实例规格供用户选择,不同实例规格及带宽的组合将带来不同的优惠价格。本文为大家解析阿里云服务器4核8G配置的实例规格收费标准与最新活动价格情况,以供参考。
219 150
|
9天前
|
机器学习/深度学习 人工智能 前端开发
构建AI智能体:七十、小树成林,聚沙成塔:随机森林与大模型的协同进化
随机森林是一种基于决策树的集成学习算法,通过构建多棵决策树并结合它们的预测结果来提高准确性和稳定性。其核心思想包括两个随机性:Bootstrap采样(每棵树使用不同的训练子集)和特征随机选择(每棵树分裂时只考虑部分特征)。这种方法能有效处理大规模高维数据,避免过拟合,并评估特征重要性。随机森林的超参数如树的数量、最大深度等可通过网格搜索优化。该算法兼具强大预测能力和工程化优势,是机器学习中的常用基础模型。
350 164