What you have here is lighttpd starting 1 forking flup server.  The
important part is this:

from flup.server.fcgi_fork import WSGIServer

With that you have a python interpreter for each request, up to a maximum.
The default is 5 spare children, the default  maximum is 50.
Under lighttpd is also possible to use fcgi_single and "max_procs" = 5 with
similar results  [I'd expect a slightly bigger memory footprint].
Since you have a forking/multiprocess configuration, you need to have a
single connection in the web2py connection pool so pool_size=1 is what you
need, anything more is just a waste of resources and postgres connections.
The max number of open connections should be (max_num_wsgi_proc[flup] *
pool_size[web2py DAL]) * (max_procs[lighttpd] * num_applications[lighttpd]).

About pgbouncer, IMHO you should use it only if you have n client and m max
postgresql connections, and you have n > m.  To speedup things you can use
memcache/redis and/or a more complex setup with pgpoolII and multiple
postgres backends.

2014-12-01 17:46 GMT+01:00 Lisandro Rostagno <rostagnolisan...@gmail.com>:

> Sorry about the delay. I recently installed pgbouncer. I let postgresql
> max_connection set to 80, and configure pgbouncer with a max_client_conn of
> 1000 and a default_pool_size of 20.
> Now when I check pg_stat_activity I can see different amounts of idle
> connections per app, more accordingly with that app's traffic. What I mean
> is that I can see more connections for the apps with higher volumes of
> traffic and less connections for the apps with lower volumes of traffic.
>
> What I still don't understand is the "max_connections" setting of
> postgresql  vs the "max_client_conn" of pgbouncer. For what I've read in
> [1] and [2] it's ok to set those variables for example in the way I did,
> leting postgresql max_connections in an appropiated value (in my case,
> using pgtune, 80 max_connections) and using a high value for
> "max_client_conn" on pgbouncer configuration.
>
> What isnt' clear to me is: what will happen when one of the apps has more
> than 20 active connections to pgbouncer and requests keep coming in? The
> ideal (for me, in this case) would be that next requests just stay waiting
> (browser saying "waiting for domain.com....").
>
>
> In the other hand, related to Michele comment, right now I have every flup
> server running with "max-procs" set to 1, this is how my lighttpd virtual
> hosts look like:
>
> $HTTP["host"] == "diarioprimicia.com.ar" {
>     server.document-root = "/var/www/diarioprimicia"
>     server.dir-listing = "disable"
>     server.error-handler-404 = "/diarioprimicia.fcgi"
>     server.kbytes-per-second = 256
>     connection.kbytes-per-second = 128
>     accesslog.filename = "/var/log/lighttpd/diarioprimicia_access.log"
>     fastcgi.server = (
>         ".fcgi" => ("localhost" => (
>             "check-local" => "disable",
>             "max-procs" => 1,
>             "socket" => "/var/tmp/lighttpd/diarioprimicia.sock",
>             "bin-path" => "/var/www/diarioprimicia/diarioprimicia.fcgi")
>         )
>     )
> }
>
>
> Then the file indicated by "bin-path" contains the following:
>
> #!/usr/bin/python
> import sys
> import gluon.main
> from flup.server.fcgi_fork import WSGIServer
> application=gluon.main.wsgibase
> WSGIServer(application).run()
>
>
> Another "strange" thing I see (strange for me, because I don't fully
> understand in) is that, regardless of setting "max-procs" to 1, when I use
> pgrep to check for fastcgi processes I can see exactly 5 processes for
> every app.
>
> I'm sorry to mix all this stuff in this post, if you think that I should
> move it to other forums, let me know.
> Thank you very much!
>
>
>
>
> 2014-11-30 18:00 GMT-03:00 Michele Comitini <michele.comit...@gmail.com>:
>
> p.s. by "no threading" I mean to use processes in place of threads.  The
>> number of processes is something you must tune based on server resources,
>> 2xn where n is the number of cores is a safe choice.
>>
>> 2014-11-30 20:04 GMT+01:00 Michele Comitini <michele.comit...@gmail.com>:
>>
>>> pool_size==number of threads in a web2py process.
>>> I  suggest to work around the problem by setting the number of threads
>>> to 1 in you flup server.  I.e. no threading.
>>> You should also see smoother performance across applications on higher
>>> loads.
>>>
>>> 2014-11-30 15:51 GMT+01:00 Lisandro Rostagno <rostagnolisan...@gmail.com
>>> >:
>>>
>>>> Yes in deed. I've restarted the webserver and the database server.
>>>> Recently I've tried setting pool_size to 1 for every app, that is, for
>>>> every website. Restarted postgresql and webserver (lighttpd). And then I
>>>> used this SQL statement to check the total count of connections for every
>>>> database (or what it is the same, for every app, because every app has its
>>>> own database):
>>>>
>>>> select datname, count(*) from pg_stat_activity group by datname order
>>>> by datname;
>>>>
>>>> Just to remind, I have around 13 apps running, that is, 13 websites, 13
>>>> databases.
>>>> With this new configuration of every app using a pool size of 1, I
>>>> restarted the database server and the webserver, and then I ran the
>>>> previous SQL statement to see the total connections for every app, and I
>>>> see 5 idle connections for every app, that is, for every website that has
>>>> some visitors browsing the site.
>>>> A couple of the websites almost never have visitors, so, for those
>>>> websites, there were no idle connections. Then I go to the homepage of
>>>> those websites, rechecked connections, and there I see 5 idle connections
>>>> for those websites.
>>>>
>>>> I already checked and re-checked the code of my app to be shure that
>>>> I'm setting "pool_size" parameter correctly.
>>>>
>>>>
>>>> In the other hand, I've been testing pgbouncer on localhost, reading
>>>> about it, and I'll be setting it for production. For what I've read,
>>>> independently of the postgresql max connections, I can set pgbouncer to a
>>>> max_client_conn of 2000 (for example) with a default_pool_size of 20. Then
>>>> all the apps connect to pgbouncer, and pgbouncer will multiplex connections
>>>> to postgres. However I don't want to mix things in this post, regardless of
>>>> pgbouncer, I would like to understand why I can't get to work web2py's
>>>> pooling mechanism.
>>>>
>>>> I'm really grateful for your help! I'll continue trying to figure it
>>>> out. Any comment or suggestion will be appreciated. Thanks!
>>>>
>>>>
>>>> 2014-11-30 9:48 GMT-03:00 Niphlod <niph...@gmail.com>:
>>>>
>>>>> did you restart the webserver ? I don't think that changing pool_size
>>>>> at runtime when connections are still open will make the number of active
>>>>> connection dropped.
>>>>>
>>>>> On Friday, November 28, 2014 8:48:07 PM UTC+1, Lisandro wrote:
>>>>>>
>>>>>> Mmm... I see. That was my understanding in the first place.
>>>>>> At that time I did the maths, I had 10 apps, each one using a
>>>>>> pool_size of 3. In postgresql.conf max_connections was set to 80.
>>>>>> However this morning, with those numbers, almost every of my websites
>>>>>> was throwing intermitent HTTP 500 errors, and the error tickets were
>>>>>> all the same: FATAL: remaining connection slots are reserved for
>>>>>> non-replication superuser connections.
>>>>>>
>>>>>> Right now, I have almost 13 websites, all of them with pool_size in
>>>>>> 3,
>>>>>> and max_connections in 80.
>>>>>> However, if I check the table "pg_stat_activity" I can see 65
>>>>>> connections, and I can see there is 5 connections per app.
>>>>>>
>>>>>> I've tried even setting pool_size to 1 for one of the apps, restarted
>>>>>> database server and webserver, but again I check pg_stat_activity and
>>>>>> I see 5 connections for that app. ¿Am I missing something too
>>>>>> ovbious?
>>>>>>
>>>>>>
>>>>>> 2014-11-28 14:25 GMT-03:00 Niphlod <nip...@gmail.com>:
>>>>>> >
>>>>>> >
>>>>>> > On Friday, November 28, 2014 3:31:02 PM UTC+1, Lisandro wrote:
>>>>>> >>
>>>>>> >> I go back to this thread because today I ran with the same
>>>>>> problem:
>>>>>> >> postgresql reaching max_connection limits and, therefor, some of
>>>>>> my websites
>>>>>> >> throwing intermitent HTTP 500 errors (because web2py couldn't
>>>>>> connect to the
>>>>>> >> database).
>>>>>> >>
>>>>>> >> To remind, we are talking of a VPS with multiple instances of
>>>>>> web2py
>>>>>> >> running, all of them serving the same web2py app, each one
>>>>>> connecting to a
>>>>>> >> different postgresql database (however the database structure is
>>>>>> the same
>>>>>> >> accross all the databases). Each web2py instance is served by a
>>>>>> lighttpd
>>>>>> >> virtual host through fastcgi. Each virtual host (that is, each
>>>>>> web2py
>>>>>> >> instance) receives a different volume of traffic (that is obvious,
>>>>>> they are
>>>>>> >> different websites with different public).
>>>>>> >>
>>>>>> >> The original problem (the one that caused I post this question in
>>>>>> the
>>>>>> >> first place) was that the postgresql database server was reaching
>>>>>> the
>>>>>> >> "max_connections" limit and, in consecuence, some of the websites
>>>>>> were
>>>>>> >> throwing intermitent HTTP 500 errors (web2py couldn't connect to
>>>>>> database).
>>>>>> >>
>>>>>> >> Then, the user oriented me with "pool_size" parameter of DAL
>>>>>> constructor.
>>>>>> >> Thanks again!
>>>>>> >> I've been reading the web2py documentation about pooling [1] and I
>>>>>> notice
>>>>>> >> that it says that "When the next http request arrives, web2py
>>>>>> tries to
>>>>>> >> recycle a connection from the pool and use that for the new
>>>>>> transaction. If
>>>>>> >> there are no available connections in the pool, a new connection
>>>>>> is
>>>>>> >> established".
>>>>>> >> So, if I didn't get it wrong, I deduce that with web2py's pooling
>>>>>> >> mechanism I can't overcome the "max_connections" postgresql limit.
>>>>>> That is
>>>>>> >> because, no matter the size of the pool, if the pool is full and
>>>>>> the website
>>>>>> >> is receiving a lot of requests, new connetions will be created,
>>>>>> and
>>>>>> >> eventually the database server will reach the "max_conectios"
>>>>>> limit.
>>>>>> >
>>>>>> >
>>>>>> > no, you got it wrong again. pool_size=5 will create AT MOST 5
>>>>>> connections .
>>>>>> > if a 6th is needed, users will wait for a connection to be freed.
>>>>>> > if your postgresql accept at most 50 connections, do the math.
>>>>>> > Every db = DAL(, pool_size=5) lying around will create AT MOST 5
>>>>>> > connections, and that means you can host 10 apps.
>>>>>> > If you need 50 apps, set pool_size=1 and let users wait, or set
>>>>>> > max_connections in postgres to a higher value.
>>>>>> >
>>>>>> > --
>>>>>> > Resources:
>>>>>> > - http://web2py.com
>>>>>> > - http://web2py.com/book (Documentation)
>>>>>> > - http://github.com/web2py/web2py (Source code)
>>>>>> > - https://code.google.com/p/web2py/issues/list (Report Issues)
>>>>>> > ---
>>>>>> > You received this message because you are subscribed to a topic in
>>>>>> the
>>>>>> > Google Groups "web2py-users" group.
>>>>>> > To unsubscribe from this topic, visit
>>>>>> > https://groups.google.com/d/topic/web2py/5RTO_RqCsus/unsubscribe.
>>>>>> > To unsubscribe from this group and all its topics, send an email to
>>>>>> > web2py+un...@googlegroups.com.
>>>>>> > For more options, visit https://groups.google.com/d/optout.
>>>>>>
>>>>>  --
>>>>> Resources:
>>>>> - http://web2py.com
>>>>> - http://web2py.com/book (Documentation)
>>>>> - http://github.com/web2py/web2py (Source code)
>>>>> - https://code.google.com/p/web2py/issues/list (Report Issues)
>>>>> ---
>>>>> You received this message because you are subscribed to a topic in the
>>>>> Google Groups "web2py-users" group.
>>>>> To unsubscribe from this topic, visit
>>>>> https://groups.google.com/d/topic/web2py/5RTO_RqCsus/unsubscribe.
>>>>> To unsubscribe from this group and all its topics, send an email to
>>>>> web2py+unsubscr...@googlegroups.com.
>>>>> For more options, visit https://groups.google.com/d/optout.
>>>>>
>>>>
>>>>  --
>>>> Resources:
>>>> - http://web2py.com
>>>> - http://web2py.com/book (Documentation)
>>>> - http://github.com/web2py/web2py (Source code)
>>>> - https://code.google.com/p/web2py/issues/list (Report Issues)
>>>> ---
>>>> You received this message because you are subscribed to the Google
>>>> Groups "web2py-users" group.
>>>> To unsubscribe from this group and stop receiving emails from it, send
>>>> an email to web2py+unsubscr...@googlegroups.com.
>>>> For more options, visit https://groups.google.com/d/optout.
>>>>
>>>
>>>
>>  --
>> Resources:
>> - http://web2py.com
>> - http://web2py.com/book (Documentation)
>> - http://github.com/web2py/web2py (Source code)
>> - https://code.google.com/p/web2py/issues/list (Report Issues)
>> ---
>> You received this message because you are subscribed to a topic in the
>> Google Groups "web2py-users" group.
>> To unsubscribe from this topic, visit
>> https://groups.google.com/d/topic/web2py/5RTO_RqCsus/unsubscribe.
>> To unsubscribe from this group and all its topics, send an email to
>> web2py+unsubscr...@googlegroups.com.
>> For more options, visit https://groups.google.com/d/optout.
>>
>
>  --
> Resources:
> - http://web2py.com
> - http://web2py.com/book (Documentation)
> - http://github.com/web2py/web2py (Source code)
> - https://code.google.com/p/web2py/issues/list (Report Issues)
> ---
> You received this message because you are subscribed to the Google Groups
> "web2py-users" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to web2py+unsubscr...@googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.
>

-- 
Resources:
- http://web2py.com
- http://web2py.com/book (Documentation)
- http://github.com/web2py/web2py (Source code)
- https://code.google.com/p/web2py/issues/list (Report Issues)
--- 
You received this message because you are subscribed to the Google Groups 
"web2py-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to web2py+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to