Ok, and if I hit the 'random' problem, then will a subsequent call to mod_wsgi.process_metrics() likely succeed or will it be messed up from then on out?
On Thu, Apr 7, 2016 at 4:37 PM, Graham Dumpleton <graham.dumple...@gmail.com > wrote: > If proc filesystem isn’t available will always return None. > > I think the proxy system should always be available, unless is very > special Linux build. But then that means always return None and not > transiently. > > On 8 Apr 2016, at 6:33 AM, Kent Bower <k...@bowermail.net> wrote: > > It's Linux, mod_wsgi version 4.4.22 > > I can go to 4.5.1, but if the proc file system isn't available for some > reason (I assume transiently??), will 4.5.1 still return None? > > Kent > > On Thu, Apr 7, 2016 at 3:51 PM, Graham Dumpleton < > graham.dumple...@gmail.com> wrote: > >> When you are not using Linux or MacOS X. Or when the Linux system you are >> using doesn’t provide proc file system for some reason. >> >> Also, randomly if using the develop version from the Git repository >> before 4.5.0 was released, plus if you are using 4.5.0. :-) >> >> The randomly bug should be fixed by using 4.5.1. >> >> So I have now released this code, but detected the same issue about five >> minutes after releasing 4.5.0, as was the first time I had tried on Linux. >> Thus 4.5.1 was released to fix it. >> >> Try again with the latest version. >> >> Graham >> >> >> On 8 Apr 2016, at 12:27 AM, Kent Bower <k...@bowermail.net> wrote: >> >> Graham, >> >> Under what circumstances might* mod_wsgi.process_metrics()* return *None* >> ? >> >> Exception in thread Thread-1: >> Traceback (most recent call last): >> File "/usr/local/lib/python2.6/threading.py", line 525, in >> __bootstrap_inner >> self.run() >> File "/usr/local/lib/python2.6/threading.py", line 477, in run >> self.__target(*self.__args, **self.__kwargs) >> File "/home/rarch/trunk/src/appserver/wsgi-config/memory_monitor.py", >> line 41, in monitor >> * megs = metrics['memory_rss']/1048576* >> *TypeError: 'NoneType' object is unsubscriptable* >> >> I've only seen this once in apache log file, some strange timing?? >> >> Kent >> >> >> On Mon, Mar 28, 2016 at 8:42 AM, Kent Bower <k...@bowermail.net> wrote: >> >>> (Graham, your suggestions and recipe for a memory monitoring thread are >>> working beautifully. Thanks again.) >>> >>> On Mon, Mar 21, 2016 at 6:30 PM, Graham Dumpleton < >>> graham.dumple...@gmail.com> wrote: >>> >>>> >>>> On 22 Mar 2016, at 4:01 AM, Kent Bower <k...@bowermail.net> wrote: >>>> >>>> In your recipe for a background monitoring thread watching memory >>>> consumption, after issuing the SIGUSR1, I'd probably just want the thread >>>> to exit instead of sleeping... do I just do "sys.exit()" to safely >>>> accomplish that? >>>> >>>> >>>> The code isn’t just sleeping. It waits on a queue object which has >>>> something placed on it when mod_wsgi is shutting down the process via >>>> atexit callback. When the thread gets that it will exit cleanly, with the >>>> main thread waiting on it to exit to ensure it isn’t running. >>>> >>>> If you just call sys.exit() that results in a SystemExit exception >>>> being raised which causes the thread to exit but leaves an exception in the >>>> error logs. >>>> >>>> The use of the queue is better as it ensures that threads are shutdown >>>> properly when process is shutting down, else you risk that the thread could >>>> try and run while interpreter is being destroyed, causing Python to crash >>>> the process. >>>> >>>> Also, regarding my observations of paster returning garbage-collected >>>> memory to the OS, was I just getting lucky while monitoring (the memory was >>>> at the very top of the allocated memory)? This is a universal python >>>> issue? >>>> >>>> >>>> It is a universal issue with any programs running on a UNIX system. >>>> >>>> You may want to Google up some articles on how memory allocation in >>>> UNIX as well as in Python works. >>>> >>>> >>>> Again, thanks for all your help! >>>> >>>> On Sat, Mar 19, 2016 at 11:22 PM, Graham Dumpleton < >>>> graham.dumple...@gmail.com> wrote: >>>> >>>>> >>>>> On 20 Mar 2016, at 1:10 AM, Kent Bower <k...@bowermail.net> wrote: >>>>> >>>>> Thanks Graham, few more items inline... >>>>> >>>>> On Sat, Mar 19, 2016 at 1:24 AM, Graham Dumpleton < >>>>> graham.dumple...@gmail.com> wrote: >>>>> >>>>>> >>>>>> On 17 Mar 2016, at 11:28 PM, Kent Bower <k...@bowermail.net> wrote: >>>>>> >>>>>> My answers are below, but before you peek, Graham, note that you and >>>>>> I have been through this memory discussion before & I've read the >>>>>> vertical >>>>>> partitioning article and use inactivity-timeout, "WSGIRestrictEmbedded >>>>>> On", >>>>>> considered maximum-requests, etc. >>>>>> >>>>>> After years of this, I'm resigned to the fact that python is memory >>>>>> hungry, especially built on many of these web-stack and database >>>>>> libraries, >>>>>> etc. I'm Ok with that. I'm fine with a high-water RAM mark imposed by >>>>>> running under Apache, mostly. But, dang, it sure would be great if the 1 >>>>>> or 2% of requests that really (and legitimately) hog a ton of RAM, like, >>>>>> say 500MB extra, didn't keep it when done. I may revisit vertical >>>>>> partitioning again, but last time I did I think I found that the 1 or 2% >>>>>> in >>>>>> my case generally won't be divisible by url. In most cases I wouldn't >>>>>> know >>>>>> whether the particular request is going to need lots of RAM until >>>>>> *after *the database queries return (which is far too late for >>>>>> vertical partitioning to be useful). >>>>>> >>>>>> So I was mostly just curious about the status of nginx running wsgi, >>>>>> which doesn't solve python's memory piggishness, but would at least >>>>>> relinquish the extra RAM once python garbage collected. >>>>>> >>>>>> >>>>>> Where have you got the idea that using nginx would result in memory >>>>>> being released back to the OS once garbage collected? It isn’t able to do >>>>>> that. >>>>>> >>>>>> The situations are very narrow as to when a process is able to give >>>>>> back memory to the operating system. It can only be done when the now >>>>>> free >>>>>> memory was at top of allocated memory. This generally only happens for >>>>>> large block allocations and not in normal circumstances for a running >>>>>> Python application. >>>>>> >>>>> >>>>> >>>>> At this point I'm not sure where I got that idea, but I'm surprised at >>>>> this. For example, my previous observations of paster running wsgi were >>>>> that it is quite faithful at returning free memory to the OS. Was I just >>>>> getting lucky, or would paster be different for some reason? >>>>> >>>>> In any case, if nginx won't solve that, then I can't see any reason to >>>>> even consider it over apache/mod_wsgi. Thank you for answering that. >>>>> >>>>> >>>>>> >>>>>> (Have you considered a max-memory parameter to mod_wsgi that would >>>>>> gracefully stop taking requests and shutdown after the threshold is >>>>>> reached >>>>>> for platforms that would support it? I recall -- maybe incorrectly -- >>>>>> you >>>>>> saying on Windows or certain platforms you wouldn't be able to support >>>>>> that. What about the platforms that *could *support it? It seems >>>>>> to me to be the very best way mod_wsgi could approach this Apache RAM >>>>>> nuance, so seems like it would be tremendously useful for the platforms >>>>>> that could support it.) >>>>>> >>>>>> >>>>>> You can do this yourself rather easily with more recent mod_wsgi >>>>>> version. >>>>>> >>>>>> If you create a background thread from a WSGI script file, in similar >>>>>> way as monitor for code changes does in: >>>>>> >>>>>> >>>>>> http://modwsgi.readthedocs.org/en/develop/user-guides/debugging-techniques.html#extracting-python-stack-traces >>>>>> >>>>>> but instead of looking for code changes, inside the main loop of the >>>>>> background thread do: >>>>>> >>>>>> import os >>>>>> import mod_wsgi >>>>>> >>>>>> metrics = mod_wsgi.process_metrics() >>>>>> >>>>>> if metrics[‘memory_rss’] > MYMEMORYTHRESHOLD: >>>>>> os.kill(os.getpid(), signal.SIGUSR1) >>>>>> >>>>>> So mod_wsgi provides the way of determining the amount of memory >>>>>> without resorting to importing psutil, which is quite fat in itself, but >>>>>> how you use it is up to you. >>>>>> >>>>> >>>>> >>>>> Right, that's an idea; (could even be a shell script that takes this >>>>> approach, I suppose, but I like your recipe.) >>>>> >>>>> Unfortunately, I don't want to *automate *bits that can feasibly >>>>> clobber blocked sessions. SIGUSR1, after graceful-timeout & >>>>> shutdown-timeout, can result in ungraceful killing. Our application >>>>> shares >>>>> a database with an old legacy application which was poorly written to hold >>>>> transactions while waiting on user input (this was apparently common two >>>>> decades ago). So, unfortunately, it isn't terribly uncommon that our >>>>> application is blocked at the database level waiting for someone using the >>>>> legacy application who has a record(s) locked and may not even be at their >>>>> desk or may have gone to lunch. Sometimes our client's IT staff has to >>>>> hunt down these people or decide to kill their database session. In any >>>>> case, from a professional point of view, our application should be the >>>>> responsible one and wait patiently, allowing our client's IT staff the >>>>> choice of how to handle those cases. So, while the likelihood is pretty >>>>> low, even with graceful-timeout & shutdown-timeout set at a very high >>>>> value >>>>> like 5 minutes,* I still run the risk of killing legitimate sessions >>>>> with SIGUSR1*. (I've brought this up before and you didn't agree >>>>> with my gripe and I do understand why, but in my use case, I don't feel I >>>>> can automate that route responsibly.... we do use SIGUSR1 manually >>>>> sometimes, when we can monitor and react to cases where a session is >>>>> blocked at the database level.) >>>>> >>>>> >>>>> If we have discussed it previously, then I may not have anything more >>>>> to add. >>>>> >>>>> Did I previously suggest offloading this memory consuming tasks behind >>>>> a job queue run under Celery or something else? That way they are out of >>>>> the web server processes at least. >>>>> >>>>> inactivity-timeout doesn't present this concern: it won't ever kill >>>>> anything, just silently restarts like a good boy when inactive. I've >>>>> recently reconsidered dropping that way down from 30 minutes. (When I >>>>> first implemented this, it was just to reclaim RAM at the end of the day, >>>>> so that's why it is 30 minutes. I didn't like the idea of churning new >>>>> processes during busy periods, but I've been thinking 1 or 2 minutes may >>>>> be >>>>> quite reasonable.) >>>>> >>>>> If I could signal processes to shutdown at their next opportunity >>>>> (meaning the next time they are handling no requests, like >>>>> inactivity-timeout), that would solve many issues in this regard for me >>>>> because I could signal these processes when their RAM consumption is high >>>>> and let them restart when "convenient," being the ultimate in >>>>> gracefulness. SIGUSR2 could mean "the next time you get are completely >>>>> idle," while SIGUSR1 continues to mean "initiate shutdown now.” >>>>> >>>>> >>>>> That is what SIGUSR1 does it you set graceful-timeout large enough. It >>>>> is SIGINT or SIGTERM which is effectively initiate shutdown now. So >>>>> shouldn’t be a need to have a SIGUSR2 as SIGUSR1 should already do what >>>>> you >>>>> are hoping for with a reasonable setting of graceful-timeout. >>>>> >>>>> >>>>>> Do note that if using SIGUSR1 to restart the current process (which >>>>>> should only be done for deamon mode), you should also set >>>>>> graceful-timeout >>>>>> option to WSGIDaemonProcess if you have long running requests. It is the >>>>>> maximum time process will wait to shutdown while still waiting for >>>>>> requests >>>>>> when doing a SIGUSR2 graceful shutdown of process, before going into >>>>>> forced >>>>>> shutdown mode where no requests will be accepted and requests can be >>>>>> interrupted. >>>>>> >>>>>> Here ( >>>>>> http://blog.dscpl.com.au/2009/05/blocking-requests-and-nginx-version-of.html) >>>>>> you discuss nginx's tendency to block requests that may otherwise be >>>>>> executing in a different process, depending on timing, etc. Is this >>>>>> issue >>>>>> still the same (I thought I read a hint somewhere that there may be a >>>>>> workaround for that), so I ask. >>>>>> >>>>>> >>>>>> That was related to someones attempt to embedded a Python interpreter >>>>>> inside of nginx processes themselves. That project died a long time ago. >>>>>> No >>>>>> one embeds Python interpreters inside of nginx processes. It was a flawed >>>>>> design. >>>>>> >>>>>> I don’t what you are reading to get all these strange ideas. :-) >>>>>> >>>>> >>>>> >>>>> Google, I suppose ;) That's why I finally asked you when I couldn't >>>>> find anything more about it via Google. >>>>> >>>>> >>>>> >>>>>> >>>>>> And so I wanted your opinion on nginx... >>>>>> >>>>>> ==== >>>>>> Here is what you asked for if it can still be useful. >>>>>> >>>>>> I'm on mod_wsgi-4.4.6 and the particular server that prompted me this >>>>>> time is running Apache 2.4 (prefork), though some of our clients use 2.2 >>>>>> (prefork). >>>>>> >>>>>> Our typical wsgi conf setting is something like this, though threads >>>>>> and processes varies depending on server size: >>>>>> >>>>>> LoadModule wsgi_module modules/mod_wsgi.so >>>>>> WSGIPythonHome /home/rarch/tg2env >>>>>> # see http://code.google.com/p/modwsgi/issues/detail?id=196#c10 >>>>>> concerning >>>>>> timeouts >>>>>> WSGIDaemonProcess rarch processes=20 threads=14 >>>>>> inactivity-timeout=1800 display-name=%{GROUP} graceful-timeout=5 >>>>>> python-eggs=/home/rarch/tg2env/lib/python-egg-cache >>>>>> >>>>>> >>>>>> Is your web server really going to be idle for 30 minutes? I can’t >>>>>> see how that would have been doing anything. >>>>>> >>>>>> Also, in mod_wsgi 4.x when inactivity-timeout kicks in has changed. >>>>>> >>>>>> It used to apply when there were active requests and they were >>>>>> blocked, as well as when no requests were running. >>>>>> >>>>>> Now it only applies to case where there are no requests. >>>>>> >>>>>> The case for running but blocked requests is now handled by >>>>>> request-timeout. >>>>>> >>>>>> You may be better of setting request-timeout now to be a more >>>>>> reasonable value for your expected longest request, but set >>>>>> inactivity-timeout to something much shorter. >>>>>> >>>>>> So suggest you play with that. >>>>>> >>>>>> Also, are you request handles I/O or CPU intensive and how many >>>>>> requests? >>>>>> >>>>>> Such a high number of processes and threads always screams to me that >>>>>> half the performance problems are due to setting these too [HIGH], >>>>>> invoking >>>>>> pathological OS process swapping issues and Python GIL issues. >>>>>> >>>>>> >>>>> >>>>> Yes, the requests are I/O intensive (that is, database intensive, >>>>> which adds a huge overhead to our typical request). Often requests finish >>>>> in under a second or two, but they also can take many seconds (not >>>>> *terrible *for the user, but sometimes they do a lot of processing >>>>> with many trips to the database). >>>>> We have several clients (companies), so the number of requests varies >>>>> widely, but can get pretty heavy on busy days (like black friday, since >>>>> they are in retail). We've played with those numbers quite a bit and >>>>> without high numbers like that, responsiveness suffers because we backlog >>>>> due to requests often taking several seconds. >>>>> >>>>> Thanks for all your input, you've been tremendously helpful! >>>>> Kent >>>>> >>>>> >>>>> >>>>> >>>>>> WSGIProcessGroup rarch >>>>>> WSGISocketPrefix run/wsgi >>>>>> WSGIRestrictStdout Off >>>>>> WSGIRestrictStdin On >>>>>> # Memory tweak. >>>>>> http://blog.dscpl.com.au/2009/11/save-on-memory-with-modwsgi-30.html >>>>>> WSGIRestrictEmbedded On >>>>>> WSGIPassAuthorization On >>>>>> >>>>>> # we'll make the /tg/ directory resolve as the wsgi script >>>>>> WSGIScriptAlias /tg >>>>>> /home/rarch/trunk/src/appserver/wsgi-config/wsgi-deployment.py >>>>>> process-group=rarch application-group=%{GLOBAL} >>>>>> WSGIScriptAlias /debug/tg >>>>>> /home/rarch/trunk/src/appserver/wsgi-config/wsgi-deployment.py >>>>>> process-group=rarch application-group=%{GLOBAL} >>>>>> >>>>>> MaxRequestsPerChild 0 >>>>>> <IfModule prefork.c> >>>>>> MaxClients 308 >>>>>> ServerLimit 308 >>>>>> </IfModule> >>>>>> <IfModule worker.c> >>>>>> ThreadsPerChild 25 >>>>>> MaxClients 400 >>>>>> ServerLimit 16 >>>>>> </IfModule> >>>>>> >>>>>> >>>>>> Thanks for all your help and for excellent software! >>>>>> Kent >>>>>> >>>>>> >>>>>> On Wed, Mar 16, 2016 at 7:27 PM, Graham Dumpleton < >>>>>> graham.dumple...@gmail.com> wrote: >>>>>> >>>>>>> On the question of whether nginx will solve this problem, I can’t >>>>>>> see how. >>>>>>> >>>>>>> When one talks about nginx and Python web applications, it is only >>>>>>> as a proxy for HTTP requests to some backend WSGI server. The Python web >>>>>>> application doesn’t run in nginx itself. So memory issues and how to >>>>>>> deal >>>>>>> with them are the provence of the WSGI server used, whatever that is and >>>>>>> not nginx. >>>>>>> >>>>>>> Anyway, answer the questions below and can start with that. >>>>>>> >>>>>>> You really want to be using recent mod_wsgi version and not Apache >>>>>>> 2.2. >>>>>>> >>>>>>> Apache 2.2 design has various issues and bad configuration defaults >>>>>>> which means it can gobble up more memory than you want. Recent mod_wsgi >>>>>>> versions have workarounds for Apache 2.2 issues and are much better at >>>>>>> eliminating those Apache 2.2 issues. Recent mod_wsgi versions also have >>>>>>> fixes for memory usage problems in some corner cases. As far as what I >>>>>>> mean >>>>>>> by recent, I recommend 4.4.12 or later. The most recent version is >>>>>>> 4.4.21. >>>>>>> If you are stuck with 3.4 or 3.5 from your Linux distro that is not good >>>>>>> and that may increase problems. >>>>>>> >>>>>>> So long as got recent mod_wsgi version then can look at using >>>>>>> vertical partitioning to farm out memory hungry request handlers to >>>>>>> their >>>>>>> own daemon process group and better configure those to handle that and >>>>>>> recycle processes based on activity or, memory usage. A blog post >>>>>>> related >>>>>>> to that is: >>>>>>> >>>>>>> * >>>>>>> http://blog.dscpl.com.au/2014/02/vertically-partitioning-python-web.html >>>>>>> >>>>>>> Graham >>>>>>> >>>>>>> On 17 Mar 2016, at 7:15 AM, Graham Dumpleton < >>>>>>> graham.dumple...@gmail.com> wrote: >>>>>>> >>>>>>> What version of mod_wsgi and Apache are you using? >>>>>>> >>>>>>> Are you stuck with old versions of both? >>>>>>> >>>>>>> For memory tracking there are API calls mod_wsgi provides in recent >>>>>>> versions for getting memory usage which can be used as part of scheme to >>>>>>> trigger a process restart. You can’t use sys.exit(), but can use >>>>>>> signals to >>>>>>> trigger a clean shutdown of a process. Again better to have recent >>>>>>> mod_wsgi >>>>>>> versions as can then also set up some graceful timeout options for >>>>>>> signal >>>>>>> induced restart. >>>>>>> >>>>>>> Also, what is your mod_wsgi configuration so can make sure doing all >>>>>>> the typical things one would do to limit memory usage, or quarantine >>>>>>> particular handlers which are memory hungry? >>>>>>> >>>>>>> Graham >>>>>>> >>>>>>> On 17 Mar 2016, at 4:29 AM, Kent Bower <k...@bowermail.net> wrote: >>>>>>> >>>>>>> Interesting idea.. yes, we are using multiple threads and also >>>>>>> other stack frameworks, so that's not straightforward, but worth >>>>>>> thinking >>>>>>> about... not sure how to approach that with the other threads. Thank >>>>>>> you >>>>>>> Bill. >>>>>>> >>>>>>> On Wed, Mar 16, 2016 at 1:11 PM, Bill Freeman <ke1g...@gmail.com> >>>>>>> wrote: >>>>>>> >>>>>>>> I don't know about nginx, but one possibility, if the large memory >>>>>>>> requests are infrequent, is to detect when you have completed one and >>>>>>>> trigger the exit/reload of the daemon process (calling sys.exit() is >>>>>>>> not >>>>>>>> the way, since there could be other threads in the middle of something, >>>>>>>> unless you run one thread per process). >>>>>>>> >>>>>>>> On Wed, Mar 16, 2016 at 7:50 AM, Kent <jkentbo...@gmail.com> wrote: >>>>>>>> >>>>>>>>> I'm looking for a very brief high-level pros vs. cons of wsgi under >>>>>>>>> *apache *vs. under *nginx *and then to be pointed to more >>>>>>>>> details I can study myself (or at least the latter). >>>>>>>>> >>>>>>>>> Our application occasionally allows requests that consume a large >>>>>>>>> amount of RAM (no obvious way around that, they are valid requests) >>>>>>>>> and >>>>>>>>> occasionally this causes problems since we can't reclaim the RAM >>>>>>>>> readily >>>>>>>>> from apache. (We already have tweaked with and do use >>>>>>>>> "inactivity-timeout". This helps, but still now and then we hit >>>>>>>>> problems >>>>>>>>> where we run into swapping to disk.) >>>>>>>>> >>>>>>>>> I'm wondering if nginx may solve this problem. I've read much of >>>>>>>>> what you (Graham) have had to say about the memory strategies with >>>>>>>>> apache >>>>>>>>> and mod_wsgi, but wonder what your opinion of nginx is and where >>>>>>>>> you've >>>>>>>>> already discussed this. I've read articles I could find you've >>>>>>>>> written on >>>>>>>>> nginx, such as "Blocking requests and nginx version of mod_wsgi," but >>>>>>>>> wonder if the same weaknesses are still applicable today, 7 years >>>>>>>>> later? >>>>>>>>> >>>>>>>>> >>>>>>>>> Thank you very much in advance! >>>>>>>>> Kent >>>>>>>>> >>>>>>>>> -- >>>>>>>>> You received this message because you are subscribed to the Google >>>>>>>>> Groups "modwsgi" group. >>>>>>>>> To unsubscribe from this group and stop receiving emails from it, >>>>>>>>> send an email to modwsgi+unsubscr...@googlegroups.com. >>>>>>>>> To post to this group, send email to modwsgi@googlegroups.com. >>>>>>>>> Visit this group at https://groups.google.com/group/modwsgi. >>>>>>>>> For more options, visit https://groups.google.com/d/optout. >>>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> -- >>>>>>>> You received this message because you are subscribed to a topic in >>>>>>>> the Google Groups "modwsgi" group. >>>>>>>> To unsubscribe from this topic, visit >>>>>>>> https://groups.google.com/d/topic/modwsgi/wyo2bJP0Cfc/unsubscribe. >>>>>>>> To unsubscribe from this group and all its topics, send an email to >>>>>>>> modwsgi+unsubscr...@googlegroups.com. >>>>>>>> To post to this group, send email to modwsgi@googlegroups.com. >>>>>>>> Visit this group at https://groups.google.com/group/modwsgi. >>>>>>>> For more options, visit https://groups.google.com/d/optout. >>>>>>>> >>>>>>> >>>>>>> >>>>>>> -- >>>>>>> You received this message because you are subscribed to the Google >>>>>>> Groups "modwsgi" group. >>>>>>> To unsubscribe from this group and stop receiving emails from it, >>>>>>> send an email to modwsgi+unsubscr...@googlegroups.com. >>>>>>> To post to this group, send email to modwsgi@googlegroups.com. >>>>>>> Visit this group at https://groups.google.com/group/modwsgi. >>>>>>> For more options, visit https://groups.google.com/d/optout. >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> -- >>>>>>> You received this message because you are subscribed to a topic in >>>>>>> the Google Groups "modwsgi" group. >>>>>>> To unsubscribe from this topic, visit >>>>>>> https://groups.google.com/d/topic/modwsgi/wyo2bJP0Cfc/unsubscribe. >>>>>>> To unsubscribe from this group and all its topics, send an email to >>>>>>> modwsgi+unsubscr...@googlegroups.com. >>>>>>> To post to this group, send email to modwsgi@googlegroups.com. >>>>>>> Visit this group at https://groups.google.com/group/modwsgi. >>>>>>> For more options, visit https://groups.google.com/d/optout. >>>>>>> >>>>>> >>>>>> >>>>>> -- >>>>>> You received this message because you are subscribed to the Google >>>>>> Groups "modwsgi" group. >>>>>> To unsubscribe from this group and stop receiving emails from it, >>>>>> send an email to modwsgi+unsubscr...@googlegroups.com. >>>>>> To post to this group, send email to modwsgi@googlegroups.com. >>>>>> Visit this group at https://groups.google.com/group/modwsgi. >>>>>> For more options, visit https://groups.google.com/d/optout. >>>>>> >>>>>> >>>>>> >>>>>> -- >>>>>> You received this message because you are subscribed to a topic in >>>>>> the Google Groups "modwsgi" group. >>>>>> To unsubscribe from this topic, visit >>>>>> https://groups.google.com/d/topic/modwsgi/wyo2bJP0Cfc/unsubscribe. >>>>>> To unsubscribe from this group and all its topics, send an email to >>>>>> modwsgi+unsubscr...@googlegroups.com. >>>>>> To post to this group, send email to modwsgi@googlegroups.com. >>>>>> Visit this group at https://groups.google.com/group/modwsgi. >>>>>> For more options, visit https://groups.google.com/d/optout. >>>>>> >>>>> >>>>> >>>>> -- >>>>> You received this message because you are subscribed to the Google >>>>> Groups "modwsgi" group. >>>>> To unsubscribe from this group and stop receiving emails from it, send >>>>> an email to modwsgi+unsubscr...@googlegroups.com. >>>>> To post to this group, send email to modwsgi@googlegroups.com. >>>>> Visit this group at https://groups.google.com/group/modwsgi. >>>>> For more options, visit https://groups.google.com/d/optout. >>>>> >>>>> >>>>> >>>>> -- >>>>> You received this message because you are subscribed to a topic in the >>>>> Google Groups "modwsgi" group. >>>>> To unsubscribe from this topic, visit >>>>> https://groups.google.com/d/topic/modwsgi/wyo2bJP0Cfc/unsubscribe. >>>>> To unsubscribe from this group and all its topics, send an email to >>>>> modwsgi+unsubscr...@googlegroups.com. >>>>> To post to this group, send email to modwsgi@googlegroups.com. >>>>> Visit this group at https://groups.google.com/group/modwsgi. >>>>> For more options, visit https://groups.google.com/d/optout. >>>>> >>>> >>>> >>>> -- >>>> You received this message because you are subscribed to the Google >>>> Groups "modwsgi" group. >>>> To unsubscribe from this group and stop receiving emails from it, send >>>> an email to modwsgi+unsubscr...@googlegroups.com. >>>> To post to this group, send email to modwsgi@googlegroups.com. >>>> Visit this group at https://groups.google.com/group/modwsgi. >>>> For more options, visit https://groups.google.com/d/optout. >>>> >>>> >>>> >>>> -- >>>> You received this message because you are subscribed to a topic in the >>>> Google Groups "modwsgi" group. >>>> To unsubscribe from this topic, visit >>>> https://groups.google.com/d/topic/modwsgi/wyo2bJP0Cfc/unsubscribe. >>>> To unsubscribe from this group and all its topics, send an email to >>>> modwsgi+unsubscr...@googlegroups.com. >>>> To post to this group, send email to modwsgi@googlegroups.com. >>>> Visit this group at https://groups.google.com/group/modwsgi. >>>> For more options, visit https://groups.google.com/d/optout. >>>> >>> >>> >> >> -- >> You received this message because you are subscribed to the Google Groups >> "modwsgi" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to modwsgi+unsubscr...@googlegroups.com. >> To post to this group, send email to modwsgi@googlegroups.com. >> Visit this group at https://groups.google.com/group/modwsgi. >> For more options, visit https://groups.google.com/d/optout. >> >> >> >> -- >> You received this message because you are subscribed to a topic in the >> Google Groups "modwsgi" group. >> To unsubscribe from this topic, visit >> https://groups.google.com/d/topic/modwsgi/wyo2bJP0Cfc/unsubscribe. >> To unsubscribe from this group and all its topics, send an email to >> modwsgi+unsubscr...@googlegroups.com. >> To post to this group, send email to modwsgi@googlegroups.com. >> Visit this group at https://groups.google.com/group/modwsgi. >> For more options, visit https://groups.google.com/d/optout. >> > > > -- > You received this message because you are subscribed to the Google Groups > "modwsgi" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to modwsgi+unsubscr...@googlegroups.com. > To post to this group, send email to modwsgi@googlegroups.com. > Visit this group at https://groups.google.com/group/modwsgi. > For more options, visit https://groups.google.com/d/optout. > > > -- > You received this message because you are subscribed to a topic in the > Google Groups "modwsgi" group. > To unsubscribe from this topic, visit > https://groups.google.com/d/topic/modwsgi/wyo2bJP0Cfc/unsubscribe. > To unsubscribe from this group and all its topics, send an email to > modwsgi+unsubscr...@googlegroups.com. > To post to this group, send email to modwsgi@googlegroups.com. > Visit this group at https://groups.google.com/group/modwsgi. > For more options, visit https://groups.google.com/d/optout. > -- You received this message because you are subscribed to the Google Groups "modwsgi" group. To unsubscribe from this group and stop receiving emails from it, send an email to modwsgi+unsubscr...@googlegroups.com. To post to this group, send email to modwsgi@googlegroups.com. Visit this group at https://groups.google.com/group/modwsgi. For more options, visit https://groups.google.com/d/optout.