OK, I had some flaws in the last test that, I have realized, were
affecting the performance. For example uwsgi was outputing a whole lot
of data into gnome-terminal, which used much CPU. The new benchmark
with uwsgi running as a daemon:
Concurrency Level: 5
Time taken for tests: 22.585 seconds
Complete requests: 1000
Failed requests: 0
Write errors: 0
Total transferred: 6906000 bytes
HTML transferred: 6531000 bytes
Requests per second: 44.28 [#/sec] (mean)
Time per request: 112.923 [ms] (mean)
Time per request: 22.585 [ms] (mean, across all concurrent
requests)
Transfer rate: 298.62 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.0 0 0
Processing: 65 113 6.2 111 164
Waiting: 65 112 6.2 111 164
Total: 66 113 6.2 111 164
Percentage of the requests served within a certain time (ms)
50% 111
66% 112
75% 113
80% 115
90% 119
95% 125
98% 133
99% 138
100% 164 (longest request)
ALSO, I tried running uwsgi with 4 worker processes by adding the
option "-p 4":
Concurrency Level: 5
Time taken for tests: 14.575 seconds
Complete requests: 1000
Failed requests: 0
Write errors: 0
Total transferred: 6906000 bytes
HTML transferred: 6531000 bytes
Requests per second: 68.61 [#/sec] (mean)
Time per request: 72.876 [ms] (mean)
Time per request: 14.575 [ms] (mean, across all concurrent
requests)
Transfer rate: 462.71 [Kbytes/sec] received
On Jan 18, 6:20 pm, mdipierro <[email protected]> wrote:
> You are right, the admin interface does not do db IO. From your test
> it is slow. Not sure why that is.
>
> On Jan 18, 2:14 am, Ivan P <[email protected]> wrote:
>
> > Hmmm, you are right. But, since I was loading the index page of the
> > standard admin interface, that I have not compiled, I guess it is
> > whatever the admin defaults are (does admin even use a db?). Right?
>
> > On Jan 18, 12:15 am, mdipierro <[email protected]> wrote:
>
> > > In your benchmark, did you set migrate=False and bytecode compile the
> > > app? Did you use Auth? How many additional tables?
>
> > > On Jan 17, 3:11 pm, mdipierro <[email protected]> wrote:
>
> > > > These tests basically measure lots of things at once and are dominated
> > > > by the database. If your are using sqlite, it locks the database
> > > > completely on every request so there is no concurrency.
>
> > > > I think we need a standard app for testing with various options:
>
> > > > 1) db, no-db
> > > > 2) 1,10,100 tables
> > > > 3) view, no-view
> > > > 4) compiled, not-compiler
>
> > > > On Jan 17, 2:49 pm, Ivan P <[email protected]> wrote:
>
> > > > > Alex,
> > > > > Actually, this is my first try at a production deployment, and I have
> > > > > not set up another to test against. Is there a standard "ab" test that
> > > > > is usually run for comparison in web2py community? In any case I ran
> > > > > the following command with sqlite as the backend server (but doubt it
> > > > > matters for this page) for the cherokee setup and the web2py builtin:
> > > > > ab -n 1000 -c 5 url
>
> > > > > ===CHEROKEE results===
>
> > > > > Server Software: Cherokee/0.99.39
> > > > > Server Hostname: cparts.localhost
> > > > > Server Port: 80
>
> > > > > Document Path: /admin/default/index
> > > > > Document Length: 5658 bytes
>
> > > > > Concurrency Level: 5
> > > > > Time taken for tests: 41.809 seconds
> > > > > Complete requests: 1000
> > > > > Failed requests: 0
> > > > > Write errors: 0
> > > > > Total transferred: 6031000 bytes
> > > > > HTML transferred: 5658000 bytes
> > > > > Requests per second: 23.92 [#/sec] (mean)
> > > > > Time per request: 209.043 [ms] (mean)
> > > > > Time per request: 41.809 [ms] (mean, across all concurrent
> > > > > requests)
> > > > > Transfer rate: 140.87 [Kbytes/sec] received
>
> > > > > Connection Times (ms)
> > > > > min mean[+/-sd] median max
> > > > > Connect: 0 0 0.1 0 3
> > > > > Processing: 65 208 11.3 208 283
> > > > > Waiting: 65 208 11.3 208 283
> > > > > Total: 69 209 11.2 208 283
>
> > > > > Percentage of the requests served within a certain time (ms)
> > > > > 50% 208
> > > > > 66% 212
> > > > > 75% 214
> > > > > 80% 215
> > > > > 90% 219
> > > > > 95% 223
> > > > > 98% 235
> > > > > 99% 245
> > > > > 100% 283 (longest request)
>
> > > > > ===CHERRY PY results===
>
> > > > > Server Software: CherryPy/3.2.0beta
> > > > > Server Hostname: localhost
> > > > > Server Port: 8000
>
> > > > > Document Path: /welcome/default/index
> > > > > Document Length: 6531 bytes
>
> > > > > Concurrency Level: 5
> > > > > Time taken for tests: 41.120 seconds
> > > > > Complete requests: 1000
> > > > > Failed requests: 0
> > > > > Write errors: 0
> > > > > Total transferred: 6892000 bytes
> > > > > HTML transferred: 6531000 bytes
> > > > > Requests per second: 24.32 [#/sec] (mean)
> > > > > Time per request: 205.601 [ms] (mean)
> > > > > Time per request: 41.120 [ms] (mean, across all concurrent
> > > > > requests)
> > > > > Transfer rate: 163.68 [Kbytes/sec] received
>
> > > > > Connection Times (ms)
> > > > > min mean[+/-sd] median max
> > > > > Connect: 0 0 0.0 0 0
> > > > > Processing: 51 205 66.0 197 499
> > > > > Waiting: 50 201 65.2 193 499
> > > > > Total: 52 205 66.0 197 499
>
> > > > > Percentage of the requests served within a certain time (ms)
> > > > > 50% 197
> > > > > 66% 222
> > > > > 75% 240
> > > > > 80% 254
> > > > > 90% 296
> > > > > 95% 328
> > > > > 98% 368
> > > > > 99% 402
> > > > > 100% 499 (longest request)
>
> > > > > Sure, I'll make it a slice.
>
> > > > > On Jan 17, 11:01 pm, Alex Fanjul <[email protected]> wrote:
>
> > > > > > Many thanks for your tutorial Ivan,
> > > > > > I'll give it a try... have you noticed any improvements with
> > > > > > cherokee?
> > > > > > could you show us your "ab" benchmarks?
>
> > > > > > regards,
> > > > > > Alex F
>
> > > > > > P.S: try to make an slice in web2pyslices.com
>
> > > > > > El 14/01/2010 23:14, Ivan P escribi :
>
> > > > > > > Inspired by Phyo Arkar's howto on setting up web2py with Cherokee
> > > > > > > and
> > > > > > > FCGI I tried the setup, but was somewhat unsatisfied with the fcgi
> > > > > > > method and decided to try uWSGI. I am happy I did so, since it
> > > > > > > proved
> > > > > > > to be real easy and uWSGI is a real powerhouse and deserves
> > > > > > > attention
> > > > > > > of the whole python webdev community. On to the howto.
>
> > > > > > > I. Compile from source and run the latest uWSGI, 0.9.3 in my case
> > > > > > > (available herehttp://projects.unbit.it/uwsgi/wiki).
> > > > > > > 1. Download the source from and unzip.
>
> > > > > > > 2. To compile you must install packages python-dev and
> > > > > > > libxml2-dev (at
> > > > > > > least thats what they are called on a debian-based system)
>
> > > > > > > 3. When compiling simply run pick a makefile which matches your
> > > > > > > OS and
> > > > > > > python version and run something like "make -f
> > > > > > > Makefile.Linux.Py26".
> > > > > > > This produces only one executable named uwsgi26, where 26 is my
> > > > > > > python
> > > > > > > version. You can put it in /usr/local/bin.
>
> > > > > > > 5. To run it, you have two options:
>
> > > > > > > 5a) Create an xml file and call it, for example, config.xml. Put
> > > > > > > something like this in it:
> > > > > > > <uwsgi>
> > > > > > > <pythonpath>/var/web2py/</pythonpath>
> > > > > > > <app mountpoint="/">
> > > > > > > <script>wsgihandler</script>
> > > > > > > </app>
> > > > > > > </uwsgi>
> > > > > > > In this file "pythonpath" is where your web2py directory is and
> > > > > > > "script" is the file you want to run, in this case its web2py's
> > > > > > > "wsgihandler.py". Now run uWSGI like this, but replace "www-data"
> > > > > > > with
> > > > > > > the owner of your web2py directory, if its the same as your
> > > > > > > current
> > > > > > > user omit the sudo command:
> > > > > > > sudo -u www-data uwsgi26 -s /tmp/uwsgi.sock -C -x config.xml
> > > > > > > Why you need to change user is because web2py writes things
> > > > > > > (session
> > > > > > > data for example) to disc during execution, so the uwsgi process,
> > > > > > > which runs the web2py code, has to be the owner of the directories
> > > > > > > that contain the framework. Note that uwsgi now opened a socket we
> > > > > > > called "/tmp/uwsgi.sock" About other options consult the uwsgi
> > > > > > > manual
> > > > > > > or "uwsgi -h".
>
> > > > > > > 5b) You can omit the xml file and pass all the info via command
> > > > > > > line,
> > > > > > > doing that is easy, so consult the uwsgi docs :)
>
> > > > > > > II. Setting up cherokee (0.99.37 in my case).
> > > > > > > 1. Install it, run cherokee-admin, go to localhost:9090
>
> > > > > > > 2. Open "Information Sources" and create a new one with these
> > > > > > > parameters:
> > > > > > > Nick: web2py
> > > > > > > Connection: /tmp/uwsgi.sock
> > > > > > > Interpreter: uwsgi26 -s /tmp/uwsgi.sock -C -x /path/to/config.xml
> > > > > > > The interpreter line is why it is a good idea to have your web2py
> > > > > > > source owned by www-data or the Cherokee server's user - when
> > > > > > > cherokee
> > > > > > > runs it, you can be sure that owners of the sources and process
> > > > > > > match.
> > > > > > > And of course put the correct path in.
>
> > > > > > > 3. Go to "Virtual Servers" and edit the default one, or you can
> > > > > > > create
> > > > > > > a new one, but make sure you give it a domain name to avoid
> > > > > > > conflict
> > > > > > > (not really sure what happens when they conflict).
>
> > > > > > > 4. Go to the "Behavior" section and edit the "Default" behavior.
>
> > > > > > > 5. Set the "Handler" to uWSGI and on the bottom set the
> > > > > > > information
> > > > > > > source to "web2py"
>
> > > > > > > 6. Pick "Hard restart" from the dropdown on the left and click
> > > > > > > "Save".
> > > > > > > TO PREVENT HEADACHE READ THIS: I seem to get inconsistent results
> > > > > > > with
> > > > > > > these restarts, so if you're doing production it seems to me that
> > > > > > > one
> > > > > > > should restart the server manualy (via /etc/init.d/cherokee
> > > > > > > restart,
> > > > > > > that is). Or maybe I should RTFM.
>
> > > > > > > 6. Go to localhost and BAM! (or at least I hope its a bam). veeery
> > > > > > > easy if all goes smooth.
>
> > > > > > > "But wait, what about url rewriting?" was my thought, and this
> > > > > > > caused
> > > > > > > much confusion, so I'll add a section on that.
>
> > > > > > > III. Doing some redirection (I'll give few examples due to poor
> > > > > > > knowledge of regex).
> > > > > > > Lets redirect "localhost/" to "/myapp/cntrlr/index"
> > > > > > > 1. Go back to the "Behavior" section of your server.
>
> > > > > > > 2. Add a new rule and set it's type to "Regular Expression" and
> > > > > > > set
> > > > > > > the regular expression to "^/$", this simply matches "localhost/"
> > > > > > > or
> > > > > > > "localhost", nothing more, nothing less.
>
> > > > > > > 3. Go to the "Handler" section and set the rule to "Redirect" with
> > > > > > > these parameters
> > > > > > > Type: Internal
> > > > > > > Regular Expression: (yes, blank)
> > > > > > > Substitution: /myapp/cntrlr/index
> > > > > > > The regular expression is blank because for this scenario we did
> > > > > > > all
> > > > > > > the matching while defining a new behavior, you can combine the
> > > > > > > two in
>
> ...
>
> read more »
--
You received this message because you are subscribed to the Google Groups
"web2py-users" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/web2py?hl=en.