diff --git a/docs/docs/frigate/installation.md b/docs/docs/frigate/installation.md
index 14c85ec4f3..4c6ceec04d 100644
--- a/docs/docs/frigate/installation.md
+++ b/docs/docs/frigate/installation.md
@@ -78,9 +78,9 @@ Users of the Snapcraft build of Docker cannot use storage locations outside your
Frigate utilizes shared memory to store frames during processing. The default `shm-size` provided by Docker is **64MB**.
-The default shm size of **128MB** is fine for setups with **2 cameras** detecting at **720p**. If Frigate is exiting with "Bus error" messages, it is likely because you have too many high resolution cameras and you need to specify a higher shm size, using [`--shm-size`](https://docs.docker.com/engine/reference/run/#runtime-constraints-on-resources) (or [`service.shm_size`](https://docs.docker.com/compose/compose-file/compose-file-v2/#shm_size) in Docker Compose). If raising the shm size does not help, check your [process and file limits](#process-and-file-limits) as well.
+Frigate needs about **210MB** for **2 cameras** detecting at **720p**. If Frigate is exiting with "Bus error" messages, it is likely because you have too many high resolution cameras and you need to specify a higher shm size, using [`--shm-size`](https://docs.docker.com/engine/reference/run/#runtime-constraints-on-resources) (or [`service.shm_size`](https://docs.docker.com/compose/compose-file/compose-file-v2/#shm_size) in Docker Compose). If raising the shm size does not help, check your [process and file limits](#process-and-file-limits) as well.
-The Frigate container also stores logs in shm, which can take up to **40MB**, so make sure to take this into account in your math as well.
+The Frigate container also stores logs and an nginx cache in shm, which can take up to **50MB**. The calculator below includes this, along with room for 2 cameras added while Frigate is running. Its result holds about 25 frames per camera, a little above the 20 frame minimum Frigate warns below. Frigate keeps up to 50 when there is room, which gives slow processes more time to read each frame.
diff --git a/docs/src/components/ShmCalculator/index.jsx b/docs/src/components/ShmCalculator/index.jsx
index b7e13ed79f..afb15365cc 100644
--- a/docs/src/components/ShmCalculator/index.jsx
+++ b/docs/src/components/ShmCalculator/index.jsx
@@ -2,42 +2,53 @@ import React, { useState, useEffect } from "react";
import Admonition from "@theme/Admonition";
import styles from "./styles.module.css";
+// follows calculate_shm_requirements() in frigate/util/services.py, but sizes
+// for 25 frames so float rounding can't land under its 20 frame warning
+const MB = 1048576;
+const RESERVED_MB = 50; // logs + nginx cache
+const TARGET_FRAMES = 25;
+const DEFAULT_FRAMES = 50;
+
+const frameMb = (width, height) =>
+ Math.round(((width * height * 1.5 + 270480) / MB) * 10) / 10;
+
+// room for 2 cameras added at runtime, sized as 720p
+const addedCamerasMb = 2 * frameMb(1280, 720);
+
const ShmCalculator = () => {
const [width, setWidth] = useState(1280);
const [height, setHeight] = useState(720);
const [cameraCount, setCameraCount] = useState(1);
- const [result, setResult] = useState("26.32MB");
- const [singleCameraShm, setSingleCameraShm] = useState("26.32MB");
- const [totalShm, setTotalShm] = useState("26.32MB");
+ const [result, setResult] = useState("-");
+ const [singleCameraShm, setSingleCameraShm] = useState("-");
+ const [addedCamerasShm, setAddedCamerasShm] = useState("-");
+ const [fullRingShm, setFullRingShm] = useState("-");
const calculate = () => {
if (!width || !height || !cameraCount) {
setResult("Please enter valid values");
setSingleCameraShm("-");
- setTotalShm("-");
+ setAddedCamerasShm("-");
+ setFullRingShm("-");
return;
}
- // Single camera base SHM calculation (excluding logs)
- // Formula: (width * height * 1.5 * 20 + 270480) / 1048576
- const singleCameraBase =
- (width * height * 1.5 * 20 + 270480) / 1048576;
- setSingleCameraShm(`${singleCameraBase.toFixed(2)}mb`);
+ const cameraFramesMb = cameraCount * frameMb(width, height) + addedCamerasMb;
- // Total SHM calculation (multiple cameras, including logs)
- const totalBase = singleCameraBase * cameraCount;
- const finalResult = totalBase + 40; // Default includes logs +40mb
+ setSingleCameraShm(formatMb(frameMb(width, height) * TARGET_FRAMES));
+ setAddedCamerasShm(formatMb(addedCamerasMb * TARGET_FRAMES));
+ setResult(formatMb(Math.round(RESERVED_MB + cameraFramesMb * TARGET_FRAMES)));
+ setFullRingShm(
+ formatMb(Math.round(RESERVED_MB + cameraFramesMb * DEFAULT_FRAMES)),
+ );
+ };
- setTotalShm(`${(totalBase + 40).toFixed(2)}mb`);
-
- // Format result
- if (finalResult < 1) {
- setResult(`${(finalResult * 1024).toFixed(2)}kb`);
- } else if (finalResult >= 1024) {
- setResult(`${(finalResult / 1024).toFixed(2)}gb`);
- } else {
- setResult(`${finalResult.toFixed(2)}mb`);
+ const formatMb = (value) => {
+ if (value >= 1024) {
+ return `${(value / 1024).toFixed(2)}gb`;
}
+
+ return `${Number(value.toFixed(2))}mb`;
};
const formatWithUnit = (value) => {
@@ -147,19 +158,27 @@ const ShmCalculator = () => {
- Single Camera: {formatWithUnit(singleCameraShm)}
+ Per Camera: {formatWithUnit(singleCameraShm)}
- Formula: (width × height × 1.5 × 20 + 270480) ÷
- 1048576
+ Formula: (width × height × 1.5 + 270480) ÷
+ 1048576 × {TARGET_FRAMES} frames
- {cameraCount > 1 && (
-
- Total ({cameraCount} cameras): {formatWithUnit(totalShm)}
-
- )}
- With Logs: + 40mb
+ Room for 2 Added Cameras:{" "}
+ {formatWithUnit(addedCamerasShm)}
+
+
+ Logs and Cache: + {RESERVED_MB}
+ mb
+
+
+ Birdseye Restream: + 8
+ mb if enabled
+
+
+ For {DEFAULT_FRAMES} Frames:{" "}
+ {formatWithUnit(fullRingShm)}