我努力阻止备用Postgres服务上的UDP缓冲区溢出。 非常感激任何的帮助。
一旦启动Postgres直到达到最大容量,然后继续稳定丢弃数据包,本地主机接口上与pg_standby进程相关联的UDP缓冲区逐渐填满。 重新启动Postgres(当然)会清除缓冲区,但是它会重新开始填充。
据我所知,这实际上并没有造成任何问题。 (这只发生在备用服务,故障恢复数据恢复显示没有丢失。)不过,我不想任何缓冲区溢出。
要点:
a)通过查询UDP的“/ proc”信息,我可以看到非空的缓冲区; 和UDP端口的唯一非空缓冲区(hexE97B – > dec 59771)允许我们使用netstat显示接口(本地主机)和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)上的防火墙都closures,也会发生溢出
c)我的UDP缓冲区看起来不够大。 我可以让他们更大,但这只会掩盖问题
# grep rmem /etc/sysctl.conf | grep -v tcp net.core.rmem_max = 26214400 net.core.rmem_default = 16777216
d)类似问题的在线讨论似乎指向旧版本的Postgres或统计收集器; 排除这一点我试图closures所有的统计收集,但问题仍然存在:
# egrep '(track)' postgresql.conf | grep -v '^\s*#' track_activities = off track_counts = off
e)收到的UDP数据包不是很丰富; 对于每个新丢弃的UDP数据包,tshark详细嗅探显示如下:
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时才开始
我的设置背景: