[forgot *again* to reply-all and only sent this to Jay initially - resending to group]
Thanks for the response Jay. I may have glossed over the parallelism & concurrency aspects a bit too much when I first read those sections in the Racket Guide. I now see in 20.1 re: Futures: "The level of parallelism available from those constructs, however, is limited by several factors, and the current implementation is best suited to numerical tasks." and in 20.2: "The place form creates a place, which is effectively a new Racket instance that can run in parallel to other places, including the initial place." "Places" appears to be similar to my current approach of having multiple Ruby/Rails processes handle web requests. In the case of Ruby/Rails, it's a very inefficient use of memory, i.e. the amount of RAM needed to fully utilize all cores is *much* higher than it should be when spinning up multiple app server processes that each load the entire Rails framework. Each Rails process is essentially single-threaded. I was hoping to gain a big improvement of Ruby/Rails with Racket, and that may be possible even with the current implementation (both Ruby & Rails are performance-challenged), but can you give me some idea of the level importance multi-core performance is in the Racket community moving forward? I'm taking a fairly long term perspective with Racket, so the "roadmap" is as important to me as the current implementation. I'm referring to Racket in general, not just the web server. I haven't done much research or testing yet, so maybe a combination of Places and Threads will be sufficient for my needs. Maybe one Place per CPU core w/ multiple threads to keep the CPU busy while some threads are blocked on I/O requests. Thanks, Brian On Jul 16, 2014, at 10:17 PM, Jay McCarthy wrote: > It wouldn't have a big impact on the server. The big question is how > to effectively use multi-core in Racket programs generally. > > Futures are really only good for numerical codes that stay in the JIT, > which doesn't sound like most Web programs. That said, it is trivial > to implement: > > #lang racket/base > (require racket/future > web-server/servlet-env > web-server/http) > > (define (fib n) > (if (< n 2) > 1 > (+ (fib (- n 1)) > (fib (- n 2))))) > > (define (start req) > (touch > (future > (λ () > (response/xexpr > `(html > (body > (p "It's " > ,(number->string > (fib (random 20))))))))))) > > (serve/servlet start) > > Boom! That's a servlet that uses multi-core to handle every request... > of course, it probably doesn't pay in this or most other programs. > > Places are for more coarse-grained things and you can pass file > descriptors, so it's feasible to have a TCP accepter that feeds work > to a group of places servicing the requests. However, places must not > use mutation to communicate higher-order values (they can communicate > flat values like numbers with mutation), so they couldn't share > continuations. It would be trivial to use serializable continuations > or to implement a continuation manager that stored all the > continuations in a single place. Session affinity doesn't really make > a lot of sense in the continuation context, fwiw. > > My guess is that you could spend less than 100 lines to implement the > continuation manager and the place-based worker setup. (This is based > on the normal server setup just being 127 lines and the manager > interface being implemented in as little as 40 lines.) This might be > worth it. > > Jay > > > On Wed, Jul 16, 2014 at 4:09 PM, Brian Adkins <racketus...@lojic.com> wrote: >> I haven't looked into the Racket web server much yet, so I'd like to >> understand the implications of this. >> >> My experience is with stateless http app servers (primarily with Unicorn >> Ruby servers at the moment), so firing up a number of worker processes and >> having something like nginx proxy to them works well to fully utilize all >> cores. >> >> I think I read that the Racket web server makes use of continuations, so I >> expect some sort of process affinity would be necessary, where a given >> user's requests are always proxied to the same worker process - is that >> right? Is it common to use multiple web server processes in Racket web apps? >> >> In your estimation, what is the feasibility of adding multi-core support to >> the Racket web server? For example, is it reasonably feasible and on the >> current roadmap, or would it require massive changes to the web server? >> >> Thanks, >> Brian >> >> On Jul 16, 2014, at 8:42 AM, Jay McCarthy wrote: >> >>> It does not use multiple cores if they are available. >>> >>> Jay >>> >>> On Wed, Jul 16, 2014 at 7:02 AM, Sean Kemplay <sean.kemp...@gmail.com> >>> wrote: >>>> Hello, >>>> >>>> I am interested in the racket web server for some micro services. Just >>>> wondering if by default it runs across multiple cores or if it is >>>> restricted >>>> to one due to threads in racket. >>>> >>>> Regards, >>>> Sean >>>> >>>> >>>> ____________________ >>>> Racket Users list: >>>> http://lists.racket-lang.org/users >>>> >>> >>> >>> >>> -- >>> Jay McCarthy >>> http://jeapostrophe.github.io >>> >>> "Wherefore, be not weary in well-doing, >>> for ye are laying the foundation of a great work. >>> And out of small things proceedeth that which is great." >>> - D&C 64:33 >>> ____________________ >>> Racket Users list: >>> http://lists.racket-lang.org/users >> > > > > -- > Jay McCarthy > http://jeapostrophe.github.io > > "Wherefore, be not weary in well-doing, > for ye are laying the foundation of a great work. > And out of small things proceedeth that which is great." > - D&C 64:33 ____________________ Racket Users list: http://lists.racket-lang.org/users