keepalives on MacOS X
It looks like the recent keepalives patch won't support MacOS X,
because MacOS X does not have the TCP_KEEPIDLE, TCP_KEEPINTVL, and
TCP_KEEPCNT socket parameters. It does have this:
#define TCP_KEEPALIVE 0x10 /* idle time used when
SO_KEEPALIVE is enabled */
Should we try to support that as a synonym for TCP_KEEPIDLE, if that's
what it is? Or not worry about it? Or... what?
--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise Postgres Company
On Tue, Jun 29, 2010 at 4:07 AM, Robert Haas <robertmhaas@gmail.com> wrote:
It looks like the recent keepalives patch won't support MacOS X,
because MacOS X does not have the TCP_KEEPIDLE, TCP_KEEPINTVL, and
TCP_KEEPCNT socket parameters. It does have this:#define TCP_KEEPALIVE 0x10 /* idle time used when
SO_KEEPALIVE is enabled */Should we try to support that as a synonym for TCP_KEEPIDLE, if that's
what it is? Or not worry about it? Or... what?
I'm not sure that can be a synonym for TCP_KEEPIDLE, but if so we should
change not only a client-side but also server-side.
Regards,
--
Fujii Masao
NIPPON TELEGRAPH AND TELEPHONE CORPORATION
NTT Open Source Software Center
Robert Haas <robertmhaas@gmail.com> writes:
It looks like the recent keepalives patch won't support MacOS X,
because MacOS X does not have the TCP_KEEPIDLE, TCP_KEEPINTVL, and
TCP_KEEPCNT socket parameters. It does have this:
It looks to me like there's support for setting KEEPIDLE and KEEPINTVL
via sysctl, but of course that's system-wide and presumably requires
root privilege to set. (Apple seems to have inherited that from various
BSDen, btw; it's not unique to Darwin.)
#define TCP_KEEPALIVE 0x10 /* idle time used when
SO_KEEPALIVE is enabled */
Should we try to support that as a synonym for TCP_KEEPIDLE, if that's
what it is? Or not worry about it? Or... what?
Yeah, a bit of rooting around in the Darwin sources shows that this
value is used as a per-connection override for tcp_keepidle. So it
is a synonym. Not sure if it's worth supporting when the other value
can't be set too. Maybe it'd be more useful to document that people can
set the system-wide values if they're desperate.
regards, tom lane
On Tue, Jun 29, 2010 at 12:42 AM, Tom Lane <tgl@sss.pgh.pa.us> wrote:
Yeah, a bit of rooting around in the Darwin sources shows that this
value is used as a per-connection override for tcp_keepidle. So it
is a synonym. Not sure if it's worth supporting when the other value
can't be set too. Maybe it'd be more useful to document that people can
set the system-wide values if they're desperate.
Well, the default value for tcp_keepidle is 2 hours, and the default
value for tcp_keepintvl is 75 seconds. Assuming that tcp_keepcount
defaults to something reasonable (I think the default on Linux is 9),
the lion's share of the time will be waiting for tcp_keepidle - so
just the ability to reduce that value to something reasonable should
help a lot. It's also not much code - proposed patch attached.
Some documentation of how to change this stuff via sysctl on various
OSes wouldn't be a bad thing either - anyone feel like writing
something up?
--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise Postgres Company
Attachments:
tcp_keepalive_for_keepidle.patchapplication/octet-stream; name=tcp_keepalive_for_keepidle.patchDownload+33-9
On Tue, Jun 29, 2010 at 11:28 PM, Robert Haas <robertmhaas@gmail.com> wrote:
On Tue, Jun 29, 2010 at 12:42 AM, Tom Lane <tgl@sss.pgh.pa.us> wrote:
Yeah, a bit of rooting around in the Darwin sources shows that this
value is used as a per-connection override for tcp_keepidle. So it
is a synonym. Not sure if it's worth supporting when the other value
can't be set too. Maybe it'd be more useful to document that people can
set the system-wide values if they're desperate.Well, the default value for tcp_keepidle is 2 hours, and the default
value for tcp_keepintvl is 75 seconds. Assuming that tcp_keepcount
defaults to something reasonable (I think the default on Linux is 9),
the lion's share of the time will be waiting for tcp_keepidle - so
just the ability to reduce that value to something reasonable should
help a lot. It's also not much code - proposed patch attached.
src/interfaces/libpq/fe-connect.c
+ appendPQExpBuffer(&conn->errorMessage,
+ libpq_gettext("setsockopt(TCP_KEEPIDLE) failed: %s\n"),
+ SOCK_STRERROR(SOCK_ERRNO, sebuf, sizeof(sebuf)));
s/TCP_KEEPIDLE/TCP_KEEPALIVE
Don't we need to change pq_getkeepalivesidle?
In pq_setkeepalivesidle, if neither TCP_KEEPIDLE nor TCP_KEEPALIVE are
supported, the following message is output.
setsockopt(TCP_KEEPIDLE) not supported
We should change it to something like?
neither setsockopt(TCP_KEEPIDLE) nor setsockopt(TCP_KEEPALIVE) are supported
Regards,
--
Fujii Masao
NIPPON TELEGRAPH AND TELEPHONE CORPORATION
NTT Open Source Software Center
On Tue, Jun 29, 2010 at 10:53 PM, Fujii Masao <masao.fujii@gmail.com> wrote:
On Tue, Jun 29, 2010 at 11:28 PM, Robert Haas <robertmhaas@gmail.com> wrote:
On Tue, Jun 29, 2010 at 12:42 AM, Tom Lane <tgl@sss.pgh.pa.us> wrote:
Yeah, a bit of rooting around in the Darwin sources shows that this
value is used as a per-connection override for tcp_keepidle. So it
is a synonym. Not sure if it's worth supporting when the other value
can't be set too. Maybe it'd be more useful to document that people can
set the system-wide values if they're desperate.Well, the default value for tcp_keepidle is 2 hours, and the default
value for tcp_keepintvl is 75 seconds. Assuming that tcp_keepcount
defaults to something reasonable (I think the default on Linux is 9),
the lion's share of the time will be waiting for tcp_keepidle - so
just the ability to reduce that value to something reasonable should
help a lot. It's also not much code - proposed patch attached.src/interfaces/libpq/fe-connect.c + appendPQExpBuffer(&conn->errorMessage, + libpq_gettext("setsockopt(TCP_KEEPIDLE) failed: %s\n"), + SOCK_STRERROR(SOCK_ERRNO, sebuf, sizeof(sebuf)));s/TCP_KEEPIDLE/TCP_KEEPALIVE
Fixed.
Don't we need to change pq_getkeepalivesidle?
I changed this, but it doesn't seem to have done much. When I do
"show tcp_keepalives_idle" on MacOS X, I still get 0. gdb says
getsockopt is getting called, though. Am I doing something boneheaded
here, or is this just the behavior?
In pq_setkeepalivesidle, if neither TCP_KEEPIDLE nor TCP_KEEPALIVE are
supported, the following message is output.setsockopt(TCP_KEEPIDLE) not supported
Fixed.
--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise Postgres Company
Attachments:
tcp_keepalive_for_keepidle-v2.patchapplication/octet-stream; name=tcp_keepalive_for_keepidle-v2.patchDownload+45-11
On Fri, Jul 2, 2010 at 5:44 PM, Robert Haas <robertmhaas@gmail.com> wrote:
On Tue, Jun 29, 2010 at 10:53 PM, Fujii Masao <masao.fujii@gmail.com> wrote:
On Tue, Jun 29, 2010 at 11:28 PM, Robert Haas <robertmhaas@gmail.com> wrote:
On Tue, Jun 29, 2010 at 12:42 AM, Tom Lane <tgl@sss.pgh.pa.us> wrote:
Yeah, a bit of rooting around in the Darwin sources shows that this
value is used as a per-connection override for tcp_keepidle. So it
is a synonym. Not sure if it's worth supporting when the other value
can't be set too. Maybe it'd be more useful to document that people can
set the system-wide values if they're desperate.Well, the default value for tcp_keepidle is 2 hours, and the default
value for tcp_keepintvl is 75 seconds. Assuming that tcp_keepcount
defaults to something reasonable (I think the default on Linux is 9),
the lion's share of the time will be waiting for tcp_keepidle - so
just the ability to reduce that value to something reasonable should
help a lot. It's also not much code - proposed patch attached.src/interfaces/libpq/fe-connect.c + appendPQExpBuffer(&conn->errorMessage, + libpq_gettext("setsockopt(TCP_KEEPIDLE) failed: %s\n"), + SOCK_STRERROR(SOCK_ERRNO, sebuf, sizeof(sebuf)));s/TCP_KEEPIDLE/TCP_KEEPALIVE
Fixed.
Don't we need to change pq_getkeepalivesidle?
I changed this, but it doesn't seem to have done much. When I do
"show tcp_keepalives_idle" on MacOS X, I still get 0. gdb says
getsockopt is getting called, though. Am I doing something boneheaded
here, or is this just the behavior?In pq_setkeepalivesidle, if neither TCP_KEEPIDLE nor TCP_KEEPALIVE are
supported, the following message is output.setsockopt(TCP_KEEPIDLE) not supported
Fixed.
Committed, after some further testing.
--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise Postgres Company