On Feb 6, 2014, at 2:32 PM, Kevin Conway <kevinjacobcon...@gmail.com> wrote:

> There's an incredibly valid reason why we use green thread abstractions like 
> eventlet and gevent in Python. The CPython implementation is inherently 
> single threaded so we need some other form of concurrency to get the most 
> effective use out of our code. You can "import threading" all you want but it 
> won't work the way you expect it to. If you are considering doing anything 
> threading related in Python then http://www.youtube.com/watch?v=Obt-vMVdM8s 
> is absolutely required watching.

As a python core-dev, this isn’t *entirely* correct - or incorrect. It’s 
actually misleading though. But I don’t think -dev is where we need to boil the 
ocean about concurrency in python…

> 
> Green threads give us a powerful way to manage concurrency where it counts: 
> I/O. Everything in openstack is waiting on something else in openstack. That 
> is our natural state of being. If your plan for increasing the number of 
> concurrent requests is "fork more processes" then you're in for a rude 
> awakening when your hosts start kernel panicking from a lack of memory. With 
> green threads, on the other hand, we maintain the use of one process, one 
> thread but are able to manage multiple, concurrent network operations.
> 
> In the case of API nodes: yes, they should (at most) do some db work and drop 
> a message on the queue. That means they almost exclusively deal with I/O. 
> Expecting your wsgi server to scale that up for you is wrong and, in fact, 
> the reason we have eventlet in the first place.
> 
> What's more is this conversation has turned from "lets use asyncio" to "lets 
> make evenltet work with asyncio". If the aim is to convert eventlet to use 
> the asyncio interface then this seems like a great idea so long as it takes 
> place within the eventlet project and not openstack. I don't see the benefit 
> of shimming in asyncio and a fork/backport of asyncio into any of our code 
> bases if the point is to integrate it into a third party module.
> 
> On Thu, Feb 6, 2014 at 12:34 PM, Joshua Harlow <harlo...@yahoo-inc.com> wrote:
> Its a good question, I see openstack as mostly like the following 2 groups of 
> applications.
> 
> Group 1: 
> 
> API entrypoints using [apache/nginx]+wsgi (nova-api, glance-api…)
> 
> In this group we can just let the underlying framework/app deal with the 
> scaling and just use native wsgi as it was intended. Scale more 
> [apache/nginx] if u need more requests per second. For any kind of long term 
> work these apps should be dropping all work to be done on a MQ and letting 
> someone pick that work up to be finished in some future time.
> 
> Group 2:
> 
> Workers that pick things up off MQ. In this area we are allowed to be a 
> little more different and change as we want, but it seems like the simple 
> approach we have been doing is the daemon model (forking N child worker 
> processes). We've also added eventlet in these children (so it becomes more 
> like NxM where M is the number of greenthreads). For the usages where workers 
> are used has it been beneficial to add those M greenthreads? If we just 
> scaled out more N (processes) how bad would it be? (I don't have the answers 
> here actually, but it does make you wonder why we couldn't just eliminate 
> eventlet/asyncio altogether and just use more N processes).
> 
> -Josh
> 
> From: Yuriy Taraday <yorik....@gmail.com>
> 
> Reply-To: "OpenStack Development Mailing List (not for usage questions)" 
> <openstack-dev@lists.openstack.org>
> Date: Thursday, February 6, 2014 at 10:06 AM
> 
> To: "OpenStack Development Mailing List (not for usage questions)" 
> <openstack-dev@lists.openstack.org>
> Subject: Re: [openstack-dev] Asynchrounous programming: replace eventlet with 
> asyncio
> 
> Hello.
> 
> 
> On Tue, Feb 4, 2014 at 5:38 PM, victor stinner <victor.stin...@enovance.com> 
> wrote:
> I would like to replace eventlet with asyncio in OpenStack for the 
> asynchronous programming. The new asyncio module has a better design and is 
> less "magical". It is now part of python 3.4 arguably becoming the de-facto 
> standard for asynchronous programming in Python world.
> 
> I think that before doing this big move to yet another asynchronous framework 
> we should ask the main question: Do we need it? Why do we actually need async 
> framework inside our code?
> There most likely is some historical reason why (almost) every OpenStack 
> project runs every its process with eventlet hub, but I think we should 
> reconsider this now when it's clear that we can't go forward with eventlet 
> (because of py3k mostly) and we're going to put considerable amount of 
> resources into switching to another async framework.
> 
> Let's take Nova for example.
> 
> There are two kinds of processes there: nova-api and others.
> 
> - nova-api process forks to a number of workers listening on one socket and 
> running a single greenthread for each incoming request;
> - other services (workers) constantly poll some queue and spawn a greenthread 
> for each incoming request.
> 
> Both kinds to basically the same job: receive a request, run a handler in a 
> greenthread. Sounds very much like a job for some application server that 
> does just that and does it good.
> If we remove all dependencies from eventlet or any other async framework, we 
> would not only be able to write Python code without need to keep in mind that 
> we're running in some reactor (that's why eventlet was chosen over Twisted 
> IIRC), but we can also forget about all these frameworks altogether.
> 
> I suggest approach like this:
> - for API services use dead-simple threaded WSGI server (we have one in the 
> stdlib by the way - in wsgiref);
> - for workers use simple threading-based oslo.messaging loop (it's on its 
> way).
> 
> Of course, it won't be production-ready. Dumb threaded approach won't scale 
> but we don't have to write our own scaling here. There are other tools around 
> to do this: Apache httpd, Gunicorn, uWSGI, etc. And they will work better in 
> production environment than any code we write because they are proven with 
> time and on huge scales.
> 
> So once we want to go to production, we can deploy things this way for 
> example:
> - API services can be deployed within Apache server or any other HTTP server 
> with WSGI backend (Keystone already can be deployed within Apache);
> - workers can be deployed in any non-HTTP application server, uWSGI is a 
> great example of one that can work in this mode.
> 
> With this approach we can leave the burden of process management, load 
> balancing, etc. to the services that are really good at it.
> 
> What do you think about this?
> 
> -- 
> 
> Kind regards, Yuriy.
> 
> _______________________________________________
> OpenStack-dev mailing list
> OpenStack-dev@lists.openstack.org
> http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev
> 
> 
> 
> 
> -- 
> Kevin Conway
> _______________________________________________
> OpenStack-dev mailing list
> OpenStack-dev@lists.openstack.org
> http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev


_______________________________________________
OpenStack-dev mailing list
OpenStack-dev@lists.openstack.org
http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev

Reply via email to