add ffmpeg bandwidth stats

This commit is contained in:
Korneliusz Jarzębski 2023-05-15 02:39:02 +02:00
parent e3b9998879
commit c15a2bd233
4 changed files with 40 additions and 2 deletions

View File

@ -12,7 +12,8 @@ apt-get -qq install --no-install-recommends -y \
unzip locales tzdata libxml2 xz-utils \ unzip locales tzdata libxml2 xz-utils \
python3-pip \ python3-pip \
curl \ curl \
jq jq \
nethogs
mkdir -p -m 600 /root/.gnupg mkdir -p -m 600 /root/.gnupg

View File

@ -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.types import StatsTrackingTypes, CameraMetricsTypes
from frigate.util import get_amd_gpu_stats, get_intel_gpu_stats, get_nvidia_gpu_stats from frigate.util import get_amd_gpu_stats, get_intel_gpu_stats, get_nvidia_gpu_stats
from frigate.version import VERSION 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 from frigate.object_detection import ObjectDetectProcess
logger = logging.getLogger(__name__) 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_gpu_stats(config, stats, hwaccel_errors)),
asyncio.create_task(set_cpu_stats(stats)), asyncio.create_task(set_cpu_stats(stats)),
asyncio.create_task(set_bandwidth_stats(stats)),
] ]
) )
@ -117,6 +118,12 @@ async def set_cpu_stats(all_stats: dict[str, Any]) -> None:
if cpu_stats: if cpu_stats:
all_stats["cpu_usages"] = cpu_stats all_stats["cpu_usages"] = cpu_stats
async def set_bandwidth_stats(all_stats: dict[str, Any]) -> None:
"""Set cpu usage from top."""
bandwidth_stats = get_bandwidth_stats()
if bandwidth_stats:
all_stats["bandwidth_usages"] = bandwidth_stats
async def set_gpu_stats( async def set_gpu_stats(
config: FrigateConfig, all_stats: dict[str, Any], hwaccel_errors: list[str] config: FrigateConfig, all_stats: dict[str, Any], hwaccel_errors: list[str]

View File

@ -843,6 +843,32 @@ def get_cpu_stats() -> dict[str, dict]:
return usages 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]: def get_amd_gpu_stats() -> dict[str, str]:
"""Get stats using radeontop.""" """Get stats using radeontop."""

View File

@ -343,6 +343,7 @@ export default function System() {
<Th>FPS</Th> <Th>FPS</Th>
<Th>CPU %</Th> <Th>CPU %</Th>
<Th>Memory %</Th> <Th>Memory %</Th>
<Th>Bandwidth KB/s</Th>
</Tr> </Tr>
</Thead> </Thead>
<Tbody> <Tbody>
@ -352,6 +353,7 @@ export default function System() {
<Td>{cameras[camera]['camera_fps'] || '- '}</Td> <Td>{cameras[camera]['camera_fps'] || '- '}</Td>
<Td>{cpu_usages[cameras[camera]['ffmpeg_pid']]?.['cpu'] || '- '}%</Td> <Td>{cpu_usages[cameras[camera]['ffmpeg_pid']]?.['cpu'] || '- '}%</Td>
<Td>{cpu_usages[cameras[camera]['ffmpeg_pid']]?.['mem'] || '- '}%</Td> <Td>{cpu_usages[cameras[camera]['ffmpeg_pid']]?.['mem'] || '- '}%</Td>
<Td>{bandwidth_usages[cameras[camera]['ffmpeg_pid']]?.['bandwidth'] || '- '}KB/s</Td>
</Tr> </Tr>
<Tr key="capture" index="1"> <Tr key="capture" index="1">
<Td>Capture</Td> <Td>Capture</Td>
@ -359,6 +361,7 @@ export default function System() {
<Td>{cameras[camera]['process_fps'] || '- '}</Td> <Td>{cameras[camera]['process_fps'] || '- '}</Td>
<Td>{cpu_usages[cameras[camera]['capture_pid']]?.['cpu'] || '- '}%</Td> <Td>{cpu_usages[cameras[camera]['capture_pid']]?.['cpu'] || '- '}%</Td>
<Td>{cpu_usages[cameras[camera]['capture_pid']]?.['mem'] || '- '}%</Td> <Td>{cpu_usages[cameras[camera]['capture_pid']]?.['mem'] || '- '}%</Td>
<Td>-</Td>
</Tr> </Tr>
<Tr key="detect" index="2"> <Tr key="detect" index="2">
<Td>Detect</Td> <Td>Detect</Td>
@ -379,6 +382,7 @@ export default function System() {
<Td>{cpu_usages[cameras[camera]['pid']]?.['cpu'] || '- '}%</Td> <Td>{cpu_usages[cameras[camera]['pid']]?.['cpu'] || '- '}%</Td>
<Td>{cpu_usages[cameras[camera]['pid']]?.['mem'] || '- '}%</Td> <Td>{cpu_usages[cameras[camera]['pid']]?.['mem'] || '- '}%</Td>
<Td>-</Td>
</Tr> </Tr>
</Tbody> </Tbody>
</Table> </Table>