mirror of
				https://github.com/blakeblackshear/frigate.git
				synced 2025-10-27 10:52:11 +01:00 
			
		
		
		
	add ffmpeg bandwidth stats (#6492)
* add ffmpeg bandwidth stats * add ffmpeg bandwidth stats * Change column name Co-authored-by: Nicolas Mowen <nickmowen213@gmail.com> * fix lint formatting --------- Co-authored-by: Korneliusz Jarzębski <k.jarzebski@netverse.pl> Co-authored-by: Nicolas Mowen <nickmowen213@gmail.com>
This commit is contained in:
		
							parent
							
								
									b568a29fa8
								
							
						
					
					
						commit
						17e8a46c7d
					
				@ -12,7 +12,8 @@ apt-get -qq install --no-install-recommends -y \
 | 
			
		||||
    unzip locales tzdata libxml2 xz-utils \
 | 
			
		||||
    python3-pip \
 | 
			
		||||
    curl \
 | 
			
		||||
    jq
 | 
			
		||||
    jq \
 | 
			
		||||
    nethogs
 | 
			
		||||
 | 
			
		||||
mkdir -p -m 600 /root/.gnupg
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -16,7 +16,7 @@ from frigate.const import DRIVER_AMD, DRIVER_ENV_VAR, RECORD_DIR, CLIPS_DIR, CAC
 | 
			
		||||
from frigate.types import StatsTrackingTypes, CameraMetricsTypes
 | 
			
		||||
from frigate.util import get_amd_gpu_stats, get_intel_gpu_stats, get_nvidia_gpu_stats
 | 
			
		||||
from frigate.version import VERSION
 | 
			
		||||
from frigate.util import get_cpu_stats
 | 
			
		||||
from frigate.util import get_cpu_stats, get_bandwidth_stats
 | 
			
		||||
from frigate.object_detection import ObjectDetectProcess
 | 
			
		||||
 | 
			
		||||
logger = logging.getLogger(__name__)
 | 
			
		||||
@ -101,6 +101,7 @@ def get_processing_stats(
 | 
			
		||||
            [
 | 
			
		||||
                asyncio.create_task(set_gpu_stats(config, stats, hwaccel_errors)),
 | 
			
		||||
                asyncio.create_task(set_cpu_stats(stats)),
 | 
			
		||||
                asyncio.create_task(set_bandwidth_stats(stats)),
 | 
			
		||||
            ]
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
@ -118,6 +119,14 @@ async def set_cpu_stats(all_stats: dict[str, Any]) -> None:
 | 
			
		||||
        all_stats["cpu_usages"] = cpu_stats
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
async def set_bandwidth_stats(all_stats: dict[str, Any]) -> None:
 | 
			
		||||
    """Set bandwidth from nethogs."""
 | 
			
		||||
    bandwidth_stats = get_bandwidth_stats()
 | 
			
		||||
 | 
			
		||||
    if bandwidth_stats:
 | 
			
		||||
        all_stats["bandwidth_usages"] = bandwidth_stats
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
async def set_gpu_stats(
 | 
			
		||||
    config: FrigateConfig, all_stats: dict[str, Any], hwaccel_errors: list[str]
 | 
			
		||||
) -> None:
 | 
			
		||||
 | 
			
		||||
@ -846,6 +846,35 @@ def get_cpu_stats() -> dict[str, dict]:
 | 
			
		||||
    return usages
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def get_bandwidth_stats() -> dict[str, dict]:
 | 
			
		||||
    """Get bandwidth usages for each ffmpeg process id"""
 | 
			
		||||
    usages = {}
 | 
			
		||||
    top_command = ["nethogs", "-t", "-v0", "-c5", "-d1"]
 | 
			
		||||
 | 
			
		||||
    p = sp.run(
 | 
			
		||||
        top_command,
 | 
			
		||||
        encoding="ascii",
 | 
			
		||||
        capture_output=True,
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    if p.returncode != 0:
 | 
			
		||||
        return usages
 | 
			
		||||
    else:
 | 
			
		||||
        lines = p.stdout.split("\n")
 | 
			
		||||
        for line in lines:
 | 
			
		||||
            stats = list(filter(lambda a: a != "", line.strip().split("\t")))
 | 
			
		||||
            try:
 | 
			
		||||
                if re.search("^ffmpeg/([0-9]+)/", stats[0]):
 | 
			
		||||
                    process = stats[0].split("/")
 | 
			
		||||
                    usages[process[1]] = {
 | 
			
		||||
                        "bandwidth": round(float(stats[2]), 1),
 | 
			
		||||
                    }
 | 
			
		||||
            except:
 | 
			
		||||
                continue
 | 
			
		||||
 | 
			
		||||
    return usages
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def get_amd_gpu_stats() -> dict[str, str]:
 | 
			
		||||
    """Get stats using radeontop."""
 | 
			
		||||
    radeontop_command = ["radeontop", "-d", "-", "-l", "1"]
 | 
			
		||||
 | 
			
		||||
@ -27,6 +27,7 @@ export default function System() {
 | 
			
		||||
  const {
 | 
			
		||||
    cpu_usages,
 | 
			
		||||
    gpu_usages,
 | 
			
		||||
    bandwidth_usages,
 | 
			
		||||
    detectors,
 | 
			
		||||
    service = {},
 | 
			
		||||
    detection_fps: _,
 | 
			
		||||
@ -343,6 +344,7 @@ export default function System() {
 | 
			
		||||
                          <Th>FPS</Th>
 | 
			
		||||
                          <Th>CPU %</Th>
 | 
			
		||||
                          <Th>Memory %</Th>
 | 
			
		||||
                          <Th>Network Bandwidth</Th>
 | 
			
		||||
                        </Tr>
 | 
			
		||||
                      </Thead>
 | 
			
		||||
                      <Tbody>
 | 
			
		||||
@ -360,6 +362,7 @@ export default function System() {
 | 
			
		||||
                          <Td>{cameras[camera]['camera_fps'] || '- '}</Td>
 | 
			
		||||
                          <Td>{cpu_usages[cameras[camera]['ffmpeg_pid']]?.['cpu'] || '- '}%</Td>
 | 
			
		||||
                          <Td>{cpu_usages[cameras[camera]['ffmpeg_pid']]?.['mem'] || '- '}%</Td>
 | 
			
		||||
                          <Td>{bandwidth_usages[cameras[camera]['ffmpeg_pid']]?.['bandwidth'] || '- '}KB/s</Td>
 | 
			
		||||
                        </Tr>
 | 
			
		||||
                        <Tr key="capture" index="1">
 | 
			
		||||
                          <Td>Capture</Td>
 | 
			
		||||
@ -367,6 +370,7 @@ export default function System() {
 | 
			
		||||
                          <Td>{cameras[camera]['process_fps'] || '- '}</Td>
 | 
			
		||||
                          <Td>{cpu_usages[cameras[camera]['capture_pid']]?.['cpu'] || '- '}%</Td>
 | 
			
		||||
                          <Td>{cpu_usages[cameras[camera]['capture_pid']]?.['mem'] || '- '}%</Td>
 | 
			
		||||
                          <Td>-</Td>
 | 
			
		||||
                        </Tr>
 | 
			
		||||
                        <Tr key="detect" index="2">
 | 
			
		||||
                          <Td>Detect</Td>
 | 
			
		||||
@ -387,6 +391,7 @@ export default function System() {
 | 
			
		||||
 | 
			
		||||
                          <Td>{cpu_usages[cameras[camera]['pid']]?.['cpu'] || '- '}%</Td>
 | 
			
		||||
                          <Td>{cpu_usages[cameras[camera]['pid']]?.['mem'] || '- '}%</Td>
 | 
			
		||||
                          <Td>-</Td>
 | 
			
		||||
                        </Tr>
 | 
			
		||||
                      </Tbody>
 | 
			
		||||
                    </Table>
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user