annotate docs/usage/performance.rst @ 8743:50906cedb924

hooks: clarify some comments
author Mads Kiilerich <mads@kiilerich.com>
date Tue, 03 Nov 2020 12:52:03 +0100
parents d442d8395b75
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2517
fa88997aa421 Added simple docs for optimizing RhodeCode performance
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
1 .. _performance:
fa88997aa421 Added simple docs for optimizing RhodeCode performance
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
2
fa88997aa421 Added simple docs for optimizing RhodeCode performance
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
3 ================================
5413
22a3fa3c4254 docs: cleanup of casing, markup and spacing of headings
Mads Kiilerich <madski@unity3d.com>
parents: 5400
diff changeset
4 Optimizing Kallithea performance
2517
fa88997aa421 Added simple docs for optimizing RhodeCode performance
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
5 ================================
fa88997aa421 Added simple docs for optimizing RhodeCode performance
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
6
6374
d02c715e2805 docs: tweak formatting of the performance page - replace the odd numbered list with sections
Mads Kiilerich <mads@kiilerich.com>
parents: 6216
diff changeset
7 When serving a large amount of big repositories, Kallithea can start performing
d02c715e2805 docs: tweak formatting of the performance page - replace the odd numbered list with sections
Mads Kiilerich <mads@kiilerich.com>
parents: 6216
diff changeset
8 slower than expected. Because of the demanding nature of handling large amounts
d02c715e2805 docs: tweak formatting of the performance page - replace the odd numbered list with sections
Mads Kiilerich <mads@kiilerich.com>
parents: 6216
diff changeset
9 of data from version control systems, here are some tips on how to get the best
d02c715e2805 docs: tweak formatting of the performance page - replace the odd numbered list with sections
Mads Kiilerich <mads@kiilerich.com>
parents: 6216
diff changeset
10 performance.
d02c715e2805 docs: tweak formatting of the performance page - replace the odd numbered list with sections
Mads Kiilerich <mads@kiilerich.com>
parents: 6216
diff changeset
11
2775
5d12768a0aa1 docs improvements
Marcin Kuzminski <marcin@python-works.com>
parents: 2680
diff changeset
12
6374
d02c715e2805 docs: tweak formatting of the performance page - replace the odd numbered list with sections
Mads Kiilerich <mads@kiilerich.com>
parents: 6216
diff changeset
13 Fast storage
d02c715e2805 docs: tweak formatting of the performance page - replace the odd numbered list with sections
Mads Kiilerich <mads@kiilerich.com>
parents: 6216
diff changeset
14 ------------
2517
fa88997aa421 Added simple docs for optimizing RhodeCode performance
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
15
6374
d02c715e2805 docs: tweak formatting of the performance page - replace the odd numbered list with sections
Mads Kiilerich <mads@kiilerich.com>
parents: 6216
diff changeset
16 Kallithea is often I/O bound, and hence a fast disk (SSD/SAN) and plenty of RAM
d02c715e2805 docs: tweak formatting of the performance page - replace the odd numbered list with sections
Mads Kiilerich <mads@kiilerich.com>
parents: 6216
diff changeset
17 is usually more important than a fast CPU.
d02c715e2805 docs: tweak formatting of the performance page - replace the odd numbered list with sections
Mads Kiilerich <mads@kiilerich.com>
parents: 6216
diff changeset
18
5769
6afa528ee30e db: get rid of vcs_full_cache - it should always be used
Mads Kiilerich <madski@unity3d.com>
parents: 5534
diff changeset
19
6374
d02c715e2805 docs: tweak formatting of the performance page - replace the odd numbered list with sections
Mads Kiilerich <mads@kiilerich.com>
parents: 6216
diff changeset
20 Caching
d02c715e2805 docs: tweak formatting of the performance page - replace the odd numbered list with sections
Mads Kiilerich <mads@kiilerich.com>
parents: 6216
diff changeset
21 -------
2517
fa88997aa421 Added simple docs for optimizing RhodeCode performance
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
22
6374
d02c715e2805 docs: tweak formatting of the performance page - replace the odd numbered list with sections
Mads Kiilerich <mads@kiilerich.com>
parents: 6216
diff changeset
23 Tweak beaker cache settings in the ini file. The actual effect of that is
d02c715e2805 docs: tweak formatting of the performance page - replace the odd numbered list with sections
Mads Kiilerich <mads@kiilerich.com>
parents: 6216
diff changeset
24 questionable.
d02c715e2805 docs: tweak formatting of the performance page - replace the odd numbered list with sections
Mads Kiilerich <mads@kiilerich.com>
parents: 6216
diff changeset
25
7960
fb0417c65c64 docs: document official method for beaker cache cleanup
Mads Kiilerich <mads@kiilerich.com>
parents: 7626
diff changeset
26 .. note::
fb0417c65c64 docs: document official method for beaker cache cleanup
Mads Kiilerich <mads@kiilerich.com>
parents: 7626
diff changeset
27
fb0417c65c64 docs: document official method for beaker cache cleanup
Mads Kiilerich <mads@kiilerich.com>
parents: 7626
diff changeset
28 Beaker has no upper bound on cache size and will never drop any caches. For
fb0417c65c64 docs: document official method for beaker cache cleanup
Mads Kiilerich <mads@kiilerich.com>
parents: 7626
diff changeset
29 memory cache, the only option is to regularly restart the worker process.
fb0417c65c64 docs: document official method for beaker cache cleanup
Mads Kiilerich <mads@kiilerich.com>
parents: 7626
diff changeset
30 For file cache, it must be cleaned manually, as described in the `Beaker
fb0417c65c64 docs: document official method for beaker cache cleanup
Mads Kiilerich <mads@kiilerich.com>
parents: 7626
diff changeset
31 documentation <https://beaker.readthedocs.io/en/latest/sessions.html#removing-expired-old-sessions>`_::
fb0417c65c64 docs: document official method for beaker cache cleanup
Mads Kiilerich <mads@kiilerich.com>
parents: 7626
diff changeset
32
fb0417c65c64 docs: document official method for beaker cache cleanup
Mads Kiilerich <mads@kiilerich.com>
parents: 7626
diff changeset
33 find data/cache -type f -mtime +30 -print -exec rm {} \;
fb0417c65c64 docs: document official method for beaker cache cleanup
Mads Kiilerich <mads@kiilerich.com>
parents: 7626
diff changeset
34
2517
fa88997aa421 Added simple docs for optimizing RhodeCode performance
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
35
6374
d02c715e2805 docs: tweak formatting of the performance page - replace the odd numbered list with sections
Mads Kiilerich <mads@kiilerich.com>
parents: 6216
diff changeset
36 Database
d02c715e2805 docs: tweak formatting of the performance page - replace the odd numbered list with sections
Mads Kiilerich <mads@kiilerich.com>
parents: 6216
diff changeset
37 --------
3224
8b8edfc25856 whitespace cleanup
Marcin Kuzminski <marcin@python-works.com>
parents: 2775
diff changeset
38
6374
d02c715e2805 docs: tweak formatting of the performance page - replace the odd numbered list with sections
Mads Kiilerich <mads@kiilerich.com>
parents: 6216
diff changeset
39 SQLite is a good option when having a small load on the system. But due to
d02c715e2805 docs: tweak formatting of the performance page - replace the odd numbered list with sections
Mads Kiilerich <mads@kiilerich.com>
parents: 6216
diff changeset
40 locking issues with SQLite, it is not recommended to use it for larger
d02c715e2805 docs: tweak formatting of the performance page - replace the odd numbered list with sections
Mads Kiilerich <mads@kiilerich.com>
parents: 6216
diff changeset
41 deployments.
3224
8b8edfc25856 whitespace cleanup
Marcin Kuzminski <marcin@python-works.com>
parents: 2775
diff changeset
42
8443
b688a2a1b189 docs: clarify that MariaDB is supported, with slight preference for this more free option
Mads Kiilerich <mads@kiilerich.com>
parents: 7960
diff changeset
43 Switching to PostgreSQL or MariaDB/MySQL will result in an immediate performance
6374
d02c715e2805 docs: tweak formatting of the performance page - replace the odd numbered list with sections
Mads Kiilerich <mads@kiilerich.com>
parents: 6216
diff changeset
44 increase. A tool like SQLAlchemyGrate_ can be used for migrating to another
d02c715e2805 docs: tweak formatting of the performance page - replace the odd numbered list with sections
Mads Kiilerich <mads@kiilerich.com>
parents: 6216
diff changeset
45 database platform.
d02c715e2805 docs: tweak formatting of the performance page - replace the odd numbered list with sections
Mads Kiilerich <mads@kiilerich.com>
parents: 6216
diff changeset
46
2517
fa88997aa421 Added simple docs for optimizing RhodeCode performance
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
47
6374
d02c715e2805 docs: tweak formatting of the performance page - replace the odd numbered list with sections
Mads Kiilerich <mads@kiilerich.com>
parents: 6216
diff changeset
48 Horizontal scaling
d02c715e2805 docs: tweak formatting of the performance page - replace the odd numbered list with sections
Mads Kiilerich <mads@kiilerich.com>
parents: 6216
diff changeset
49 ------------------
6153
d6942b2b421c config: clarify that we only recommend and support single threaded operation
Mads Kiilerich <madski@unity3d.com>
parents: 5880
diff changeset
50
8611
933d25793167 docs: clarify section on horizontal scaling - multi threading is not supported at all
Mads Kiilerich <mads@kiilerich.com>
parents: 8443
diff changeset
51 Scaling horizontally means running several Kallithea instances (also known as
933d25793167 docs: clarify section on horizontal scaling - multi threading is not supported at all
Mads Kiilerich <mads@kiilerich.com>
parents: 8443
diff changeset
52 worker processes) and let them share the load. That is essential to serve other
933d25793167 docs: clarify section on horizontal scaling - multi threading is not supported at all
Mads Kiilerich <mads@kiilerich.com>
parents: 8443
diff changeset
53 users while processing a long-running request from a user. Usually, the
933d25793167 docs: clarify section on horizontal scaling - multi threading is not supported at all
Mads Kiilerich <mads@kiilerich.com>
parents: 8443
diff changeset
54 bottleneck on a Kallithea server is not CPU but I/O speed - especially network
933d25793167 docs: clarify section on horizontal scaling - multi threading is not supported at all
Mads Kiilerich <mads@kiilerich.com>
parents: 8443
diff changeset
55 speed. It is thus a good idea to run multiple worker processes on one server.
6216
49c82acd30b2 scripts: fix X mode on code formatting scripts
Mads Kiilerich <madski@unity3d.com>
parents: 6153
diff changeset
56
8611
933d25793167 docs: clarify section on horizontal scaling - multi threading is not supported at all
Mads Kiilerich <mads@kiilerich.com>
parents: 8443
diff changeset
57 .. note::
6374
d02c715e2805 docs: tweak formatting of the performance page - replace the odd numbered list with sections
Mads Kiilerich <mads@kiilerich.com>
parents: 6216
diff changeset
58
8611
933d25793167 docs: clarify section on horizontal scaling - multi threading is not supported at all
Mads Kiilerich <mads@kiilerich.com>
parents: 8443
diff changeset
59 Kallithea and the embedded Mercurial backend are not thread-safe. Each
933d25793167 docs: clarify section on horizontal scaling - multi threading is not supported at all
Mads Kiilerich <mads@kiilerich.com>
parents: 8443
diff changeset
60 worker process must thus be single-threaded.
6153
d6942b2b421c config: clarify that we only recommend and support single threaded operation
Mads Kiilerich <madski@unity3d.com>
parents: 5880
diff changeset
61
8611
933d25793167 docs: clarify section on horizontal scaling - multi threading is not supported at all
Mads Kiilerich <mads@kiilerich.com>
parents: 8443
diff changeset
62 Web servers can usually launch multiple worker processes - for example ``mod_wsgi`` with the
933d25793167 docs: clarify section on horizontal scaling - multi threading is not supported at all
Mads Kiilerich <mads@kiilerich.com>
parents: 8443
diff changeset
63 ``WSGIDaemonProcess`` ``processes`` parameter or ``uWSGI`` or ``gunicorn`` with
933d25793167 docs: clarify section on horizontal scaling - multi threading is not supported at all
Mads Kiilerich <mads@kiilerich.com>
parents: 8443
diff changeset
64 their ``workers`` setting.
6153
d6942b2b421c config: clarify that we only recommend and support single threaded operation
Mads Kiilerich <madski@unity3d.com>
parents: 5880
diff changeset
65
8611
933d25793167 docs: clarify section on horizontal scaling - multi threading is not supported at all
Mads Kiilerich <mads@kiilerich.com>
parents: 8443
diff changeset
66 Kallithea can also be scaled horizontally across multiple machines.
6374
d02c715e2805 docs: tweak formatting of the performance page - replace the odd numbered list with sections
Mads Kiilerich <mads@kiilerich.com>
parents: 6216
diff changeset
67 In order to scale horizontally on multiple machines, you need to do the
d02c715e2805 docs: tweak formatting of the performance page - replace the odd numbered list with sections
Mads Kiilerich <mads@kiilerich.com>
parents: 6216
diff changeset
68 following:
3413
d79f3505549e whitespace cleanup
Marcin Kuzminski <marcin@python-works.com>
parents: 3390
diff changeset
69
8619
d442d8395b75 docs: reduce double nesting level in performance.rst
Thomas De Schampheleire <thomas.de_schampheleire@nokia.com>
parents: 8611
diff changeset
70 - Each instance's ``data`` storage needs to be configured to be stored on a
d442d8395b75 docs: reduce double nesting level in performance.rst
Thomas De Schampheleire <thomas.de_schampheleire@nokia.com>
parents: 8611
diff changeset
71 shared disk storage, preferably together with repositories. This ``data``
d442d8395b75 docs: reduce double nesting level in performance.rst
Thomas De Schampheleire <thomas.de_schampheleire@nokia.com>
parents: 8611
diff changeset
72 dir contains template caches, sessions, whoosh index and is used for
d442d8395b75 docs: reduce double nesting level in performance.rst
Thomas De Schampheleire <thomas.de_schampheleire@nokia.com>
parents: 8611
diff changeset
73 task locking (so it is safe across multiple instances). Set the
d442d8395b75 docs: reduce double nesting level in performance.rst
Thomas De Schampheleire <thomas.de_schampheleire@nokia.com>
parents: 8611
diff changeset
74 ``cache_dir``, ``index_dir``, ``beaker.cache.data_dir``, ``beaker.cache.lock_dir``
d442d8395b75 docs: reduce double nesting level in performance.rst
Thomas De Schampheleire <thomas.de_schampheleire@nokia.com>
parents: 8611
diff changeset
75 variables in each .ini file to a shared location across Kallithea instances
d442d8395b75 docs: reduce double nesting level in performance.rst
Thomas De Schampheleire <thomas.de_schampheleire@nokia.com>
parents: 8611
diff changeset
76 - If using several Celery instances,
d442d8395b75 docs: reduce double nesting level in performance.rst
Thomas De Schampheleire <thomas.de_schampheleire@nokia.com>
parents: 8611
diff changeset
77 the message broker should be common to all of them (e.g., one
d442d8395b75 docs: reduce double nesting level in performance.rst
Thomas De Schampheleire <thomas.de_schampheleire@nokia.com>
parents: 8611
diff changeset
78 shared RabbitMQ server)
d442d8395b75 docs: reduce double nesting level in performance.rst
Thomas De Schampheleire <thomas.de_schampheleire@nokia.com>
parents: 8611
diff changeset
79 - Load balance using round robin or IP hash, recommended is writing LB rules
d442d8395b75 docs: reduce double nesting level in performance.rst
Thomas De Schampheleire <thomas.de_schampheleire@nokia.com>
parents: 8611
diff changeset
80 that will separate regular user traffic from automated processes like CI
d442d8395b75 docs: reduce double nesting level in performance.rst
Thomas De Schampheleire <thomas.de_schampheleire@nokia.com>
parents: 8611
diff changeset
81 servers or build bots.
5060
778f7ae3b6eb docs: add a reference to https://github.com/shazow/sqlalchemygrate for migration from sqlite to other dbs
Anatoly Bubenkov <bubenkoff@gmail.com>
parents: 4955
diff changeset
82
6374
d02c715e2805 docs: tweak formatting of the performance page - replace the odd numbered list with sections
Mads Kiilerich <mads@kiilerich.com>
parents: 6216
diff changeset
83
d02c715e2805 docs: tweak formatting of the performance page - replace the odd numbered list with sections
Mads Kiilerich <mads@kiilerich.com>
parents: 6216
diff changeset
84 Serve static files directly from the web server
d02c715e2805 docs: tweak formatting of the performance page - replace the odd numbered list with sections
Mads Kiilerich <mads@kiilerich.com>
parents: 6216
diff changeset
85 -----------------------------------------------
5880
61954577a0df docs: mention use of static_files, it's setup and implications
Mads Kiilerich <madski@unity3d.com>
parents: 5769
diff changeset
86
61954577a0df docs: mention use of static_files, it's setup and implications
Mads Kiilerich <madski@unity3d.com>
parents: 5769
diff changeset
87 With the default ``static_files`` ini setting, the Kallithea WSGI application
6375
692dddf298e2 middleware: drop gzipper middleware
Mads Kiilerich <mads@kiilerich.com>
parents: 6374
diff changeset
88 will take care of serving the static files from ``kallithea/public/`` at the
692dddf298e2 middleware: drop gzipper middleware
Mads Kiilerich <mads@kiilerich.com>
parents: 6374
diff changeset
89 root of the application URL.
5880
61954577a0df docs: mention use of static_files, it's setup and implications
Mads Kiilerich <madski@unity3d.com>
parents: 5769
diff changeset
90
6375
692dddf298e2 middleware: drop gzipper middleware
Mads Kiilerich <mads@kiilerich.com>
parents: 6374
diff changeset
91 The actual serving of the static files is very fast and unlikely to be a
692dddf298e2 middleware: drop gzipper middleware
Mads Kiilerich <mads@kiilerich.com>
parents: 6374
diff changeset
92 problem in a Kallithea setup - the responses generated by Kallithea from
692dddf298e2 middleware: drop gzipper middleware
Mads Kiilerich <mads@kiilerich.com>
parents: 6374
diff changeset
93 database and repository content will take significantly more time and
692dddf298e2 middleware: drop gzipper middleware
Mads Kiilerich <mads@kiilerich.com>
parents: 6374
diff changeset
94 resources.
5880
61954577a0df docs: mention use of static_files, it's setup and implications
Mads Kiilerich <madski@unity3d.com>
parents: 5769
diff changeset
95
61954577a0df docs: mention use of static_files, it's setup and implications
Mads Kiilerich <madski@unity3d.com>
parents: 5769
diff changeset
96 To serve static files from the web server, use something like this Apache config
61954577a0df docs: mention use of static_files, it's setup and implications
Mads Kiilerich <madski@unity3d.com>
parents: 5769
diff changeset
97 snippet::
61954577a0df docs: mention use of static_files, it's setup and implications
Mads Kiilerich <madski@unity3d.com>
parents: 5769
diff changeset
98
61954577a0df docs: mention use of static_files, it's setup and implications
Mads Kiilerich <madski@unity3d.com>
parents: 5769
diff changeset
99 Alias /images/ /srv/kallithea/kallithea/kallithea/public/images/
61954577a0df docs: mention use of static_files, it's setup and implications
Mads Kiilerich <madski@unity3d.com>
parents: 5769
diff changeset
100 Alias /css/ /srv/kallithea/kallithea/kallithea/public/css/
61954577a0df docs: mention use of static_files, it's setup and implications
Mads Kiilerich <madski@unity3d.com>
parents: 5769
diff changeset
101 Alias /js/ /srv/kallithea/kallithea/kallithea/public/js/
61954577a0df docs: mention use of static_files, it's setup and implications
Mads Kiilerich <madski@unity3d.com>
parents: 5769
diff changeset
102 Alias /codemirror/ /srv/kallithea/kallithea/kallithea/public/codemirror/
61954577a0df docs: mention use of static_files, it's setup and implications
Mads Kiilerich <madski@unity3d.com>
parents: 5769
diff changeset
103 Alias /fontello/ /srv/kallithea/kallithea/kallithea/public/fontello/
61954577a0df docs: mention use of static_files, it's setup and implications
Mads Kiilerich <madski@unity3d.com>
parents: 5769
diff changeset
104
61954577a0df docs: mention use of static_files, it's setup and implications
Mads Kiilerich <madski@unity3d.com>
parents: 5769
diff changeset
105 Then disable serving of static files in the ``.ini`` ``app:main`` section::
61954577a0df docs: mention use of static_files, it's setup and implications
Mads Kiilerich <madski@unity3d.com>
parents: 5769
diff changeset
106
61954577a0df docs: mention use of static_files, it's setup and implications
Mads Kiilerich <madski@unity3d.com>
parents: 5769
diff changeset
107 static_files = false
61954577a0df docs: mention use of static_files, it's setup and implications
Mads Kiilerich <madski@unity3d.com>
parents: 5769
diff changeset
108
61954577a0df docs: mention use of static_files, it's setup and implications
Mads Kiilerich <madski@unity3d.com>
parents: 5769
diff changeset
109 If using Kallithea installed as a package, you should be able to find the files
6375
692dddf298e2 middleware: drop gzipper middleware
Mads Kiilerich <mads@kiilerich.com>
parents: 6374
diff changeset
110 under ``site-packages/kallithea``, either in your Python installation or in your
5880
61954577a0df docs: mention use of static_files, it's setup and implications
Mads Kiilerich <madski@unity3d.com>
parents: 5769
diff changeset
111 virtualenv. When upgrading, make sure to update the web server configuration
61954577a0df docs: mention use of static_files, it's setup and implications
Mads Kiilerich <madski@unity3d.com>
parents: 5769
diff changeset
112 too if necessary.
61954577a0df docs: mention use of static_files, it's setup and implications
Mads Kiilerich <madski@unity3d.com>
parents: 5769
diff changeset
113
6375
692dddf298e2 middleware: drop gzipper middleware
Mads Kiilerich <mads@kiilerich.com>
parents: 6374
diff changeset
114 It might also be possible to improve performance by configuring the web server
692dddf298e2 middleware: drop gzipper middleware
Mads Kiilerich <mads@kiilerich.com>
parents: 6374
diff changeset
115 to compress responses (served from static files or generated by Kallithea) when
692dddf298e2 middleware: drop gzipper middleware
Mads Kiilerich <mads@kiilerich.com>
parents: 6374
diff changeset
116 serving them. That might also imply buffering of responses - that is more
692dddf298e2 middleware: drop gzipper middleware
Mads Kiilerich <mads@kiilerich.com>
parents: 6374
diff changeset
117 likely to be a problem; large responses (clones or pulls) will have to be fully
692dddf298e2 middleware: drop gzipper middleware
Mads Kiilerich <mads@kiilerich.com>
parents: 6374
diff changeset
118 processed and spooled to disk or memory before the client will see any
692dddf298e2 middleware: drop gzipper middleware
Mads Kiilerich <mads@kiilerich.com>
parents: 6374
diff changeset
119 response. See the documentation for your web server.
692dddf298e2 middleware: drop gzipper middleware
Mads Kiilerich <mads@kiilerich.com>
parents: 6374
diff changeset
120
5433
fbbe80e3322b docs: consistent spacing around headings
Mads Kiilerich <madski@unity3d.com>
parents: 5425
diff changeset
121
5060
778f7ae3b6eb docs: add a reference to https://github.com/shazow/sqlalchemygrate for migration from sqlite to other dbs
Anatoly Bubenkov <bubenkoff@gmail.com>
parents: 4955
diff changeset
122 .. _SQLAlchemyGrate: https://github.com/shazow/sqlalchemygrate
8611
933d25793167 docs: clarify section on horizontal scaling - multi threading is not supported at all
Mads Kiilerich <mads@kiilerich.com>
parents: 8443
diff changeset
123 .. _mod_wsgi: https://modwsgi.readthedocs.io/
933d25793167 docs: clarify section on horizontal scaling - multi threading is not supported at all
Mads Kiilerich <mads@kiilerich.com>
parents: 8443
diff changeset
124 .. _uWSGI: https://uwsgi-docs.readthedocs.io/
933d25793167 docs: clarify section on horizontal scaling - multi threading is not supported at all
Mads Kiilerich <mads@kiilerich.com>
parents: 8443
diff changeset
125 .. _gunicorn: http://pypi.python.org/pypi/gunicorn