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,如需转载请自行联系原作者
目录
相关文章
|
6天前
|
存储 关系型数据库 分布式数据库
PostgreSQL 18 发布,快来 PolarDB 尝鲜!
PostgreSQL 18 发布,PolarDB for PostgreSQL 全面兼容。新版本支持异步I/O、UUIDv7、虚拟生成列、逻辑复制增强及OAuth认证,显著提升性能与安全。PolarDB-PG 18 支持存算分离架构,融合海量弹性存储与极致计算性能,搭配丰富插件生态,为企业提供高效、稳定、灵活的云数据库解决方案,助力企业数字化转型如虎添翼!
|
16天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1317 7
|
4天前
|
存储 人工智能 Java
AI 超级智能体全栈项目阶段二:Prompt 优化技巧与学术分析 AI 应用开发实现上下文联系多轮对话
本文讲解 Prompt 基本概念与 10 个优化技巧,结合学术分析 AI 应用的需求分析、设计方案,介绍 Spring AI 中 ChatClient 及 Advisors 的使用。
285 128
AI 超级智能体全栈项目阶段二:Prompt 优化技巧与学术分析 AI 应用开发实现上下文联系多轮对话
|
3天前
|
监控 JavaScript Java
基于大模型技术的反欺诈知识问答系统
随着互联网与金融科技发展,网络欺诈频发,构建高效反欺诈平台成为迫切需求。本文基于Java、Vue.js、Spring Boot与MySQL技术,设计实现集欺诈识别、宣传教育、用户互动于一体的反欺诈系统,提升公众防范意识,助力企业合规与用户权益保护。
|
15天前
|
机器学习/深度学习 人工智能 前端开发
通义DeepResearch全面开源!同步分享可落地的高阶Agent构建方法论
通义研究团队开源发布通义 DeepResearch —— 首个在性能上可与 OpenAI DeepResearch 相媲美、并在多项权威基准测试中取得领先表现的全开源 Web Agent。
1376 87
|
3天前
|
JavaScript Java 大数据
基于JavaWeb的销售管理系统设计系统
本系统基于Java、MySQL、Spring Boot与Vue.js技术,构建高效、可扩展的销售管理平台,实现客户、订单、数据可视化等全流程自动化管理,提升企业运营效率与决策能力。
|
4天前
|
人工智能 Java API
AI 超级智能体全栈项目阶段一:AI大模型概述、选型、项目初始化以及基于阿里云灵积模型 Qwen-Plus实现模型接入四种方式(SDK/HTTP/SpringAI/langchain4j)
本文介绍AI大模型的核心概念、分类及开发者学习路径,重点讲解如何选择与接入大模型。项目基于Spring Boot,使用阿里云灵积模型(Qwen-Plus),对比SDK、HTTP、Spring AI和LangChain4j四种接入方式,助力开发者高效构建AI应用。
261 122
AI 超级智能体全栈项目阶段一:AI大模型概述、选型、项目初始化以及基于阿里云灵积模型 Qwen-Plus实现模型接入四种方式(SDK/HTTP/SpringAI/langchain4j)
|
5天前
|
弹性计算 安全 数据安全/隐私保护
2025年阿里云域名备案流程(新手图文详细流程)
本文图文详解阿里云账号注册、服务器租赁、域名购买及备案全流程,涵盖企业实名认证、信息模板创建、域名备案提交与管局审核等关键步骤,助您快速完成网站上线前的准备工作。
218 82
2025年阿里云域名备案流程(新手图文详细流程)