Hardware requirements
How much CPU, memory and disk does Kuvasz need? It mostly depends on how many monitors you have. This page gives you numbers that we measured, and shows the one setting you need to change if you have a lot of monitors.
Having less than 500 monitors?
You don't need to worry about any of these details below, just make sure that Kuvasz has at least 768 MB of memory, and you'll be fine! The actual usage will be probably significantly lower unless you really have 500 monitors set up, but that's a safe bet for a stable setup.
Short answer
| Number of monitors | Memory for Kuvasz | Memory setting | CPU for Kuvasz | Database (CPU / memory) | Disk for the database (7 days of history) |
|---|---|---|---|---|---|
| up to 500 | 768 MB | none, the default is enough | 0.5 CPU | 0.5 CPU / 512 MB | about 0.6 GB |
| up to 3,000 | 1 GB | JAVA_TOOL_OPTIONS="-Xmx512M" |
1 CPU | 1 CPU / 1 GB | about 3.5 GB |
| up to 5,000 | 1.5 GB | JAVA_TOOL_OPTIONS="-Xmx768M" |
1 CPU | 1 CPU / 1 GB | about 6 GB |
- Memory setting is an environment variable of the Kuvasz container, see the memory setting below for what it means and where to set it.
- Memory means RAM. Swap doesn't count: if Kuvasz starts to use swap, it becomes very slow. Give it more memory instead.
- Disk is what the database needs to keep the history of 7 days, which is the default. If you keep the history for longer, you need more disk, see disk space below.
- With more than 100 monitors, we recommend turning on virtual thread scheduling. All the numbers on this page were measured with it.
Memory, not CPU, is what matters
Even with 5,000 monitors, Kuvasz used only about a third of one CPU in our tests. When Kuvasz runs out of resources, it's almost always the memory.
What we measured
In every test below, all the monitors were checked on time, no monitor was reported as down by mistake, and 5 virtual users used the web interface and the API at the same time.
| Monitors | Memory limit | Memory setting | Highest memory use | Result |
|---|---|---|---|---|
| 500 | 768 MB | default | 513 MB | |
| 1,500 | 1 GB | -Xmx512M |
719 MB | |
| 3,000 | 1 GB | -Xmx512M |
857 MB | |
| 5,000 | 1.5 GB | -Xmx768M |
1,144 MB |
What "worked well" means
Each test ran for 2 minutes to warm up, then we measured for 5 minutes. A test worked well only if all of these were true during the measurement. Some limits use a percentile: "p99 is at most 5 seconds" means that 99 out of 100 values were at most 5 seconds.
| What we checked | Limit | Worst result in the tests above |
|---|---|---|
| How late the checks ran (compared to their interval), for every monitor type | p99 at most 5 seconds (10% of the interval above 50 s) | 2.1 seconds (Docker monitors), all other types below 1 second |
| Skipped checks | at most 1 out of 100 | none |
| Monitors that were not checked at all | none | none |
| Healthy targets reported as down | none | none |
| Failing targets not reported as down in time | none | none |
| Pages of the web interface and API requests | p95 at most 2 seconds, none above 10 seconds, no errors | p95 0.92 seconds, slowest 0.97 seconds |
| Heartbeats of push monitors | p99 at most 1 second, no errors | 0.16 seconds |
| Database connection timeouts | none | none |
| Kuvasz stopped or restarted | never | never |
The slowest page was always the list of HTTP monitors, which gets big with thousands of monitors (see long monitor lists).
We also tested 3,000 monitors with three other kinds of setups: mostly HTTP monitors, mostly Docker monitors, and mostly ping, TCP and DNS monitors. All of them worked well with 1 GB of memory. The setup with many ping monitors used the most memory (946 MB), see ping monitors below.
The database needed little: even with 5,000 monitors, it used less than one fifth of a CPU and about 150 MB of memory.
Disk space
Most of the disk space goes to the history of the checks (the response times and other metrics of every check). Kuvasz keeps it for 7 days by default, but you can change this with the latency data retention setting. The longer you keep it, the more disk you need:
| Number of monitors | 7 days (default) | 30 days | 90 days |
|---|---|---|---|
| 500 | about 0.6 GB | about 2.3 GB | about 7 GB |
| 3,000 | about 3.5 GB | about 14 GB | about 40 GB |
| 5,000 | about 6 GB | about 23 GB | about 67 GB |
As a rule of thumb: about 150 MB for every 1,000 monitors and every day of history. Add one more day to the retention when you calculate, because the old history is deleted only once a day. If most of your monitors are HTTP monitors, count with about 170 MB instead.
The uptime events (when a monitor went up or down) need very little space, even if you keep them for a year.
The web interface always shows the last 7 days, so keeping a longer history mostly needs more disk, not more memory or CPU.
The memory setting
Kuvasz is a Java application. Java keeps most of its data in a part of the memory called the heap. By default, Kuvasz uses a heap of at most 192 MB, and this doesn't change when you give the machine more memory. 192 MB is enough for about 500 monitors.
On top of the heap, Kuvasz needs about 300 MB for other things (its code, the libraries it uses, etc.). That's why it needs 768 MB of memory even with the default heap.
If you have more than 500 monitors, make the heap bigger, and give the container enough memory:
- The heap (the
-Xmxvalue): see the table above. - The memory of the container: at least the heap plus 500 MB.
What JAVA_TOOL_OPTIONS is, and where to set it
JAVA_TOOL_OPTIONS is an environment variable that Java reads when it starts. It contains settings for Java
itself, and -Xmx is the one that sets the maximum size of the heap: -Xmx512M means 512 MB.
- Set it on the Kuvasz container, in the same place where you set its other environment variables (e.g.
DATABASE_HOST), like in the examples below. It's not needed on the database container. - It can't go into the
kuvasz.ymlconfiguration file, because Java needs it before Kuvasz starts and reads that file. - It takes effect when the container starts, so recreate or restart the container after you change it (for
example with
docker compose up -d).
Note
JAVA_TOOL_OPTIONS replaces the default value of the image (-Xms64M -Xmx192M). That's fine: you only need to set
the maximum size of the heap (-Xmx), Java takes care of the rest.
Checking that the setting is used
When the container starts, Java writes the value it found into the log of the container, in its very first line,
for example: Picked up JAVA_TOOL_OPTIONS: -Xmx512M. If you don't see your value there, the environment variable
didn't reach the container.
Signs that Kuvasz needs more memory
- The container stops and restarts by itself, and Docker or Kubernetes reports it as
OOMKilled(exit code 137). - Kuvasz doesn't start, or it takes many minutes to start.
- The checks run late, and the web interface becomes slow.
If you see any of these, give Kuvasz more memory, and make the heap bigger, as shown above.
More than 5,000 monitors
We tested up to 5,000 monitors. Kuvasz can handle more, but you need to give it more memory: the heap needs about 60 MB more for every 1,000 monitors. Raise the heap and the memory of the container together, and watch the memory use for a few days.
Good to know
- Ping monitors: every ping check starts a small separate program, which needs some extra memory. If you have hundreds of ping (ICMP) monitors, add about 256 MB to the memory in the table above.
- Restarts on small machines: with 0.5 CPU, the first checks after a restart can be slow for a minute or so (we saw one take 5.5 seconds). If you set a response time threshold on your HTTP monitors, such a monitor can be reported as down right after a restart.
- Very short intervals: our tests used a realistic mix of check intervals (from 10 seconds to 1 day, most of them 1 or 5 minutes). If most of your monitors are checked every 10–30 seconds, give Kuvasz and the database more CPU.
- Long monitor lists: with thousands of monitors, the monitor list pages of the web interface get big. To keep them short and fast, group your monitors with categories, and filter the list by category.
How we tested
We ran the official Docker image of Kuvasz 4.5.0 with test sets of 100 to 5,000 monitors. The sets mixed every monitor type (about half of them HTTP monitors, the rest push, ping, TCP, DNS and Docker monitors), and we repeated the 3,000-monitor test with three other mixes. We measured the disk space separately, with the tables of Kuvasz filled with the history of 1,000 monitors. Some of the monitored targets were slow, some were down, and some changed between up and down, like in real life. During the tests, 5 virtual users used the web interface and the API at the same time.
The test machine
| What | Details |
|---|---|
| Processor | Apple M1 Pro (64-bit ARM), 10 cores: 8 performance cores and 2 efficiency cores |
| Memory | 16 GB |
| Disk | SSD |
| Operating system | macOS 26 |
| Docker | Docker Desktop 29.8, with 8 cores and 12 GB of memory given to its Linux virtual machine |
| Kuvasz | the official kuvaszmonitoring/kuvasz:4.5.0 image (linux/arm64), Java 25 |
| Database | PostgreSQL 18 (postgres:18-alpine) |
Kuvasz, the database and the monitored test targets all ran on this computer, each in its own container, with its own CPU and memory limits (the numbers in the tables above). The containers couldn't use swap.
One CPU means one core of the test machine
The CPU numbers on this page are cores of the processor above, which is a fast, modern processor. On a slower one (for example a Raspberry Pi, or an older server), Kuvasz might need more CPU for the same number of monitors.
You can find the test tools and all the details in the
benchmark folder of the repository.