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)}