A lightweight and performant web server for Linux, built on top of io_uring. Capable of 60,000
80,000 120,000 135,000 requests per second on static files. Suffice it to say, it is
fast, and getting faster. Actual, more rigorous benchmarks will come once the project gets closer to
completion.
io_uring is a new asynchronous I/O system
on Linux which offers a significant performance advantage (and, subjectively, a much nicer
interface) over its competitors (POSIX aio
, epoll
, etc...).
NOTE: Most development lately has been on the co branch,
which converts the server to use a coroutine-based IO model. It isn't yet up to feature parity with
trunk
, but it is likely to supersede the main branch eventually.
Dependencies:
- A C compiler supporting C11.
- Meson 0.55 or later.
- liburing.
- Linux 5.7 or later.
To build, first ensure all submodules have been downloaded (git submodule update --init --recursive
), and then run meson setup <BUILDDIR>
to configure the build system in BUILDDIR
.
Alternatively, a script to generate various build configurations is provided (./configure
).
Some versions of Meson (before 0.56) may refuse to pull in transitive dependencies, and produce error messages of
the form WARNING: Dependency highwayhash not found but it is available in a sub-subproject.
. If
this occurs, simply run the command meson wrap promote subprojects/a3/subprojects/highwayhash.wrap
.
After, run meson compile -C <BUILDDIR>
to build the project. This produces a binary sc
, which
can be run directly. By default, the server listens on port 8000
. sc --help
will show the
available options and parameters.
Note: on most Linux distributions, you may see warnings about the locked memory and open file resource limits. See here for more information.
This is very new software, which is nowhere near feature complete, let alone stable. There are critical bugs, known and unknown. At this time it should not under any circumstances be used in production or for anything which matters even a little bit.
On most distributions, the locked memory limit is too low to open an io_uring
queue of the size
that Short Circuit does by default. This can be fixed either (preferably) by increasing this limit
(usually in /etc/security/limits.conf
), or by lowering URING_ENTRIES
in config.h
. It probably
needs to be at least halved to work with the default limit.
To serve static files, Short Circuit uses IO_URING_OP_PIPE
. For performance purposes, these pipes
are cached across requests. As a result, under high load (particularly when it is generated by many
simultaneous connections), many systems will hit the open file limit. This can be fixed by raising
the open file limit, or by decreasing CONNECTION_POOL_SIZE
in config.h
. The former can be done
in /etc/security/limits.conf
. A good number is a bit over three times the maximum expected number
of concurrent connections, since each connection requires an open file for the socket and two for
the pipe.
Both of these only require that the hard limit be changed, as Short Circuit will automatically raise its own soft limits at runtime.
Short Circuit is licensed under the GNU Affero GPL, the terms of which are described here.
Short Circuit depends on the following other projects:
liba3 is licensed under the 3-clause BSD license.
liba3
also links with and otherwise uses other software projects, as detailed
here.
liburing is licensed under the MIT license.