Who woulda thunk it, but switching the DATABASE_HOST to a "" blank string 
(then restarting nginx and postgresql) fixed the intermittent connection 
dropping for me!

On Thursday, March 13, 2008 10:11:00 AM UTC-4, Rajesh Dhawan wrote:
>
> Hi, 
>
> On Mar 12, 12:31 pm, mamcxyz <[email protected]> wrote: 
> > I'm getting this message from a live site, more or less 1-2 each week: 
>
> Do you have your Django apps setup to email you when a 500 Server 
> Error occurs in such cases? If so, does the full trace show such 
> failures whenever a search engine crawler is accessing your site? 
>
> > OperationalError: could not connect to server: Network is unreachable 
> >        Is the server running on host "localhost" and accepting 
> >        TCP/IP connections on port 5432? 
> > 
> > The site run recent trunk of django and postgress with pyso2. 
> > 
> > I don't see a pattern (each time is a diferent page) and don't see a 
> > way to replicate it. My local test are fine. 
> > 
> > The site is deployed on joyent.... 
>
> Are you on a Joyent Solaris "Accelerator"? If so, here is some 
> analysis that might help: 
>
> On Solaris, the socket TIME_WAIT parameter defaults to 4 minutes (RFC 
> recommended value but way too high for local TCP/IP sockets). Linux, 
> FreeBSD, etc. default to something like 1 or 2 minutes. What this 
> means is that closed TCP/IP pgsql connections take longer to clear up 
> on Solaris. So, if let's say you allow 100 max simultaneous pgsql 
> connections and a search engine crawler hits your site and manages to 
> issue 110 requests in a span of a minute (the Joyent Accelerator boxes 
> are pretty fast and can serve many more than these many requests per 
> minute), you will easily hit the pgsql max limit and further 
> connections will be disallowed until the TIME_WAIT state connections 
> clear out. You can see if this is happening by looking for the number 
> of pgsql connections in TIME_WAIT using: 
>
> netstat -an | grep "5432" 
>
> Do this right when you get your above mentioned error message. Chances 
> are that you will see a lot of sockets in the TIME_WAIT state. 
>
> The easiest solution is to simply switch to Unix domain sockets. For 
> pgsql, that means settings your DATABASE_HOST to "" (an empty string) 
> instead of localhost. Make a few requests to your app after that and 
> run the above netstat command. You should see no new TCP/IP 
> connections in a TIME_WAIT state. If it doesn't work, open up your 
> pg_hba.conf and make sure the Unix domain sockets entry is uncommented 
> and set to an appropriate authentication (and then restart pgsql). You 
> might also want to disable the TCP socket entries while you are there. 
>
> The Unix domain sockets solution works for you because your pgsql DB 
> is on the same host as your Django app. If that weren't so, you would 
> have to switch back to TCP/IP sockets. 
>
> The second easiest solution is to use connection pooling (pgpool2) 
> which allows you to reuse a controlled small number of connections for 
> multiple requests. 
>
> There is another issue on Joyent/Solaris that you should be aware of: 
> if you are using postgresql from the Blastwave packaging system, it's 
> not compiled with the option that enables a thread-safe libpq (the 
> library that ultimately is used by psycopg). This causes steady memory 
> leaks and could lead to intermittent problems. See the note I've 
> quoted below from the psycopg2 INSTALL file. 
>
> Hope this helps, 
> -Rajesh 
>
> Compiling and installing psycopg 
> ******************************** 
>
> ** Important note: if you plan to use psyopg2 in a multithreaed 
> application 
>    make sure that your libpq has been compiled with the --with-thread- 
> safety 
>    option. psycopg2 will work correctly even with a non-thread-safe 
> libpq but 
>    libpq will leak memory.

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/django-users.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-users/3d95b96e-26a6-4d8d-b101-68f3227bfc0a%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to