作者:lianghc
Greenplum查询失败,并在pg_log中返回以下错误:
- SQL - ERROR: Interconnect error writing an outgoing packet: Operation not permitted
- SQL - Detail:
- SQL - error during sendto() call (error:1).
- SQL - For Remote Connection: contentId=1
看着像socket 通信错误。检查了机器网络和负载后发现网络没问题,负载很高。后面查找了一些资料,总结如下
原因
到目前为止,有两种类型的已知问题可以触发这类问题:
1. 在段或主节点上启用iptables,并且ip_conntrack模块中的缓冲区已满。
2.服务器上的连接太多。
原因1 ,基本排查,安装gp时都会开启互信并关闭防火墙。不过也说不定某位不知情的运维同事突然开启了某节点的防火墙,检查如下:
iptables使用连接跟踪表来跟踪ip_conntrack模块中的连接。ip_conntrack模块使用系统内存的一部分,如果跟踪的连接数量不断增长,则内存缓冲区可能已满。
要确认这是问题,你可以验证iptables是否正在运行:
service iptables status
以下消息也可以在 / var / log / messages中找到:
kernel: printk: 5 messages suppressed.
kernel: ip_conntrack: table full, dropping packet.
kernel: printk: 13 messages suppressed
kernel: ip_conntrack: table full, dropping packet.
会话数量(可由内核内存中的netfilter同时处理的连接跟踪条目)超过 net.ipv4.netfilter.ip_conntrack_max中 配置的限制。 要确认这是问题,请检查 / var / log / message是否 包含以下日志消息:
nf_conntrack: table full, dropping packet.
nf_conntrack: table full, dropping packet.
nf_conntrack: table full, dropping packet.
解决办法:
1.如果问题是由ip_conntrack模块中的内存缓冲区变满引起的,则需要在所有群集节点上禁用iptables。禁用iptables是Greenplum群集的先决条件。为此,请在iptable所在的节点上运行以下命令 :
服务iptables停止
chkconfig关闭iptables
2.如果问题是由大量连接引起的,则可以尝试增加net.ipv4.netfilter.ip_conntrack_max的值:
sysctl -w net.ip4.netfilter.ip_conntrack_max = 655360 // RHEL 5
sysctl -w net.netfilter.nf_conntrack_max = 655360 // RHEL 6+
要使更改永久化,请在/etc/sysctl.conf中添加以下内容:
net.ip4.netfilter.ip_conntrack_max = 655360 // RHEL 5
net.netfilter.nf_conntrack_max = 655360 // RHEL 6+
作为一般的最佳实践,您不应该在服务器上允许太多的连接。甲跟踪连接消耗在内核(见400个字节的/ proc / slabinfo),这意味着跟踪655360个连接将消耗的RAM 262MB。
备注:ip_conntrack_max 在不同版本的系统上设置不太一样,需要注意一下。将每个节点的ip_conntrack_max 设置成一样的就好了。理论上 这个值没有上限,根据自己机器的内存情况,酌情即可。