Kallithea Performance Tuning
Tim Downey
timothy.downey at gmail.com
Tue Jan 27 09:06:34 EST 2015
Thanks Adi. I'll try it out.
On Tue, Jan 27, 2015 at 4:25 AM, Adi Kriegisch <adi at cg.tuwien.ac.at> wrote:
> Hey!
>
> > >I'm running a Kallithea instance with about 100 repositories and
> > >healthy amount of CI activity across several branches on each
> > >repository. I'm looking for some tips on tuning performance. I'm
> > >running using waitress (at least I think I am) and see what look
> > >like several knobs in the production.ini file that can be turned,
> > >but I'm not really sure what I'm looking at.
> [...]
> > I am a relatively happy user of apache + mod_wsgi. It scales nicely
> > with multiple single-threaded worker processes but might require
> > more memory. (I might however investigate uwsgi.)
> We're using uwsgi. Performance and management is great; there are --
> however -- some caveates:
> * you'll need uwsgi >=1.9 (or your git pushes will fail due to some methods
> not implemented in earlier versions[1])
> * you should do 'lazy' initialization; in case you're using a remote
> database server you need 'lazy' initialization or you'll get SSL errors
> when connecting to the database server:
> 'lazy' will first fork the required number of processes and then start
> them. If you don't do that, the initialization of kallithea (including
> establishing a database connection with SSL context) will take place and
> then get forked. The error message you'll get is:
> 'sqlalchemy.exc.OperationalError: (OperationalError) SSL error:
> decryption failed or bad record mac'
> * to allow larger mercurial commits (those may contain large to huge
> headers),
> increase the buffer size default.
> * letting kallithea run as its own user is a good idea and can easily be
> done in uwsgi by setting uid and gid; do not forget to allow the web
> server user (www-data in most cases) to connect to the socket.
> * do not forget to 'calculate' your resource requirements
> (reload-on-rss * processes); also leave some RAM for celery/rabbitmq, the
> web server and the linux file system cache.
>
> The config itself is pretty simple --
> /etc/uwsgi/apps-enabled/kallithea.yaml:
> | uwsgi:
> | plugins: python
> | chdir: /venvs/kallithea
> | virtualenv: /venvs/kallithea
> | pythonpath: = /venvs/kallithea
> | mount: /=/venvs/kallithea/dispatch.wsgi
> | uid: kallithea
> | gid: repos
> | umask: 007
> | memory-report: 1
> | processes: 4
> | reload-on-rss: 256
> | lazy: true
> | post-buffering: 4096
> | # set the buffer for headers
> | buffer-size: 16384
> | chown-socket: www-data
> | socket-timeout: 3600
>
> I personally prefer nginx as a frontend; that may be configured like this:
> /etc/nginx/sites-enabled/kallithea:
> | upstream kallithea {
> | server unix:///run/uwsgi/app/kallithea/socket;
> | }
> | server {
> | (...)
> | # maximum transfer size
> | client_max_body_size 256m;
> |
> | # deliver static file from nginx
> | root /srv/virtualenv/kallithea/public;
> |
> | location / {
> |
> | try_files $uri @uwsgi;
> |
> | }
> | location @uwsgi {
> | uwsgi_pass kallithea;
> | uwsgi_param HTTPS on;
> | uwsgi_param SCRIPT_NAME "";
> | include uwsgi_params;
> | uwsgi_read_timeout 3600;
> | }
> | }
> but apache may also be able to connect to uwsgi either via socket
> (mod_uwsgi) or via http.
>
> Some random notes:
> * nginx currently has an issue with post buffering[2]: a post will be kept
> in memory until it is complete; then it gets forwarded. This will be
> fixed in 1.7/1.8 tree at some point; for nginx 1.2 and 1.4 patches exist.
> * keep in mind that Mercurial is based on python 2.7 that only has inferior
> SSL support and is unable to do SNI[3]; your kallithea instance needs to
> be
> the default virtual host for SSL. Finally, after 6 years of discussion,
> python 2.7.9 might fix some of the more dangerous issues[4].
> * get some guide for securing your SSL config like bettercrypto[5] or
> ssllabs[6].
> * for Debian, backporting uwsgi from unstable (2.0.7) is pretty simple.
> * running Apache is no option to me, because the current stable version of
> Apache in Debian (2.2) does not support DH params > 1024bit (and that is
> no reasonable key size). Debian maintainers backported EC-Support (the
> NIST curves), so you may choose for yourself. Nginx from backports
> has probably the best crypto support one could get out of OpenSSL atm.
>
> -- Adi
>
> [1] "IOError: seeking wsgi.input without post_buffering is IMPOSSIBLE !!!"
> The changelog of v1.9 list a generic implementation of seek, read and
> readlines:
> https://github.com/unbit/uwsgi-docs/blob/master/Changelog-1.9.rst
> [2] http://trac.nginx.org/nginx/ticket/251
> [3] http://bugs.python.org/issue5639
> [4] https://www.python.org/dev/peps/pep-0466/
> [5] https://bettercrypto.org
> [6] http://ssllabs.com
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.sfconservancy.org/pipermail/kallithea-general/attachments/20150127/9b3a34dc/attachment.html>
More information about the kallithea-general
mailing list