Ik heb een probleem met tcp/ip verbindingen die lange tijd idle blijven, en ik kom er nog niet uit wat hier tegen te doen.
Situatieschets:
Postgres server: Windows 2008, Postgres versie 9.4
Clients: Verschillende windows versies lopend van XP tot en met 7
Postgres server en clients zitten allemaal in hetzelfde LAN, maar wel in een ander netwerksegment.
Het zaakje is verbonden via een aantal switches/firewalls enz.
Server en clients heb ik direct beheer over, de rest van de netwerkinfra niet.
Probleem:
Als een client een zware query afvuurt op de server (hetzij via eigen software (gebruikmakend van libpq_fe), hetzij via pgadmin) die lang duurt voordat er resultaat terugkomt, krijgt de client het resultaat niet meer terug.
Queries die korter duren (orde-grootte enkele minuten) geven geen enkel probleem.
Experimenten:
Ik heb in de config van postgres op de server al aangegeven dat de tcp_keepalives_idle naar een half uur of zo moet, maar dat heeft geen effect gehad.
Ook al geprobeerd om op de client KeepAliveTime in te stellen in de registry, maar dat heeft ook niet mogen helpen.
Volgens de beheerders van de firewall staat de max idle time voordat een verbinding opgeruimd wordt op 1 uur, die hebben ze al eens verhoogd naar 2.5 uur, maar dat heeft ook niks opgeleverd.
Wat ik wel zie als ik op de server en de client een wireshark laat lopen, dat (ongeacht de instellingen op de server,client of firewall) exact na 2 uur 5 of 6 keepalive packets verstuurd worden, maar dat die niet aan de andere kant aankomen.
Op dat moment krijgt de applicatie die de query afvuurt door dat de verbinding weg is, en stopt dan met een melding (query blijft dan wel netjes doorlopen op de server).
Ik heb nog niet geprobeerd om met setsockopt volgens hier: MSDN: SO_KEEPALIVE socket option (Windows) te spelen, voornamelijk omdat ik wel al keepalive packets verstuurd zie worden na 2 uur.
Er zijn dus concreet een paar vragen:
- Waarom reageert postgres niet op de keepalive instellingen?
- Waarom reageert de client niet op de keepalive instellingen?
- Hoe krijg ik het voor elkaar om keepalive packets te versturen binnen het uur?
- Wordt door windows altijd keepalive packets na 2 uur verstuurd ongeacht de so_keepalive socketoption?
- Zijn er nog andere zaken die ik kan uitproberen?
Wie o wie kan mij hier verder mee helpen?
Edit: Ik zie nu pas dat ik dit misschien beter in een andere thread had kunnen zetten...
Situatieschets:
Postgres server: Windows 2008, Postgres versie 9.4
Clients: Verschillende windows versies lopend van XP tot en met 7
Postgres server en clients zitten allemaal in hetzelfde LAN, maar wel in een ander netwerksegment.
Het zaakje is verbonden via een aantal switches/firewalls enz.
Server en clients heb ik direct beheer over, de rest van de netwerkinfra niet.
Probleem:
Als een client een zware query afvuurt op de server (hetzij via eigen software (gebruikmakend van libpq_fe), hetzij via pgadmin) die lang duurt voordat er resultaat terugkomt, krijgt de client het resultaat niet meer terug.
Queries die korter duren (orde-grootte enkele minuten) geven geen enkel probleem.
Experimenten:
Ik heb in de config van postgres op de server al aangegeven dat de tcp_keepalives_idle naar een half uur of zo moet, maar dat heeft geen effect gehad.
Ook al geprobeerd om op de client KeepAliveTime in te stellen in de registry, maar dat heeft ook niet mogen helpen.
Volgens de beheerders van de firewall staat de max idle time voordat een verbinding opgeruimd wordt op 1 uur, die hebben ze al eens verhoogd naar 2.5 uur, maar dat heeft ook niks opgeleverd.
Wat ik wel zie als ik op de server en de client een wireshark laat lopen, dat (ongeacht de instellingen op de server,client of firewall) exact na 2 uur 5 of 6 keepalive packets verstuurd worden, maar dat die niet aan de andere kant aankomen.
Op dat moment krijgt de applicatie die de query afvuurt door dat de verbinding weg is, en stopt dan met een melding (query blijft dan wel netjes doorlopen op de server).
Ik heb nog niet geprobeerd om met setsockopt volgens hier: MSDN: SO_KEEPALIVE socket option (Windows) te spelen, voornamelijk omdat ik wel al keepalive packets verstuurd zie worden na 2 uur.
Er zijn dus concreet een paar vragen:
- Waarom reageert postgres niet op de keepalive instellingen?
- Waarom reageert de client niet op de keepalive instellingen?
- Hoe krijg ik het voor elkaar om keepalive packets te versturen binnen het uur?
- Wordt door windows altijd keepalive packets na 2 uur verstuurd ongeacht de so_keepalive socketoption?
- Zijn er nog andere zaken die ik kan uitproberen?
Wie o wie kan mij hier verder mee helpen?
Edit: Ik zie nu pas dat ik dit misschien beter in een andere thread had kunnen zetten...
Het grote voordeel van windows is dat je meer dos-boxen kan openen