备用 Postgres 服务上的 UDP 溢出/UDP 丢失

备用 Postgres 服务上的 UDP 溢出/UDP 丢失

我很难尝试防止备用 Postgres 服务上的 UDP 缓冲区溢出。 非常感激任何的帮助。


本质上,一旦我启动 Postgres,与我的 localhost 接口上的 pg_standby 进程关联的 UDP 缓冲区就会逐渐填满,直到达到其最大容量,然后继续稳步丢弃数据包。重新启动 Postgres(当然)会清除缓冲区,但随后它又开始填满。

据我所知,这实际上没有造成任何问题。(这只发生在备用服务上,故障转移数据恢复显示没有丢失任何内容。)尽管如此,我不希望任何缓冲区溢出。

要点:

a) 通过查询 UDP 的“/proc”信息,我可以看到非空缓冲区;并且唯一非空缓冲区的 UDP 端口(十六进制 E97B --> 十进制 59771)允许我们使用 netstat 显示接口(localhost)和 PID(438),这证实了“pg_standby”进程是罪魁祸首:

# cat /proc/net/udp | grep -v '00000000:0000'
sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode ref pointer drops
16: 0100007F:E97B 0100007F:E97B 01 00000000:01000400 00:00000000 00000000   600        0 73123706 2 ffff880026d64ac0 0

# netstat -anp | grep 59771
udp   16778240      0 127.0.0.1:59771             127.0.0.1:59771             ESTABLISHED 438/pg_standby

# ps -F -p 438
UID        PID  PPID  C    SZ   RSS PSR STIME TTY          TIME CMD
postgres   438 29613  0  1016   496   0 11:18 ?        00:00:00 /usr/pgsql-9.1/bin/pg_standby -t /archive_wals/stoprecovery.trigger -c /archive_wals 000000010000000A000000C8 pg_xlog/RECOVERYXLOG 000000010000000A000000C6

b)即使两台服务器上的防火墙(iptables)都已关闭,溢出仍然会发生

c) 我的 UDP 缓冲区似乎已经足够大了。我可以将它们调大一些,但这只能掩盖问题

# grep rmem /etc/sysctl.conf  | grep -v tcp
net.core.rmem_max = 26214400
net.core.rmem_default = 16777216

d) 网上对类似问题的讨论似乎都指向了 Postgres 或统计信息收集器的旧版本;为了排除这种可能性,我尝试关闭所有统计信息收集,但问题仍然存在:

# egrep '(track)' postgresql.conf | grep -v '^\s*#'
track_activities = off
track_counts = off

e) 收到的 UDP 数据包信息量不大;tshark 详细嗅探对每个新丢弃的 UDP 数据包都显示类似这样的信息:

Data (72 bytes)
0000  0b 00 00 00 48 00 00 00 01 00 00 00 00 00 00 00   ....H...........
0010  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................
0020  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................
0030  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................
0040  00 00 00 00 00 00 00 00                           ........
Data: 0B0000004800000001000000000000000000000000000000...
[Length: 72]

f)数据库活动不多(例如,大约每 45 分钟从主服务复制到辅助服务一个 16MB 的 WAL 文件)

g) 我以前运行的是 Postgres 8.3.5,其他设置完全相同;这个问题是在我升级到 9.1.9 后才出现的


我的设置背景:

  1. 两个 CentOS 6.4 x86_64 位系统 (VM),每个系统都运行 Postgres 9.1.9,每个系统位于地理位置上相隔 (<50 英里) 的数据中心
  2. Postgres 在我的主服务器上处于活动状态,并在我的备份服务器上以待机模式运行:
  3. 备份 Postgres 服务通过两种方式接收数据:
  4. 除了 Postgres 之外,这些机器上没有其他任何重要的运行

相关内容