mirror of
https://github.com/scottlamb/moonfire-nvr.git
synced 2025-11-20 01:50:24 -05:00
read sample files from dedicated threads
Reading from the mmap()ed region in the tokio threads could cause
them to stall:
* That could affect UI serving when there were concurrent
UI requests (i.e., not just requests that needed the reads in
question anyway).
* If there's a faulty disk, it could cause the UI to totally hang.
Better to not mix disks between threads.
* Soon, I want to handle RTSP from the tokio threads (#37). Similarly,
we don't want RTSP streaming to block on operations from unrelated
disks.
I went with just one thread per disk which I think is sufficient.
But it'd be possible to do a fixed-size pool instead which might improve
latency when some pages are already cached.
I also dropped the memmap dependency. I had to compute the page
alignment anyway to get mremap to work, and Moonfire NVR already is
Unix-specific, so there wasn't much value from the memmap or memmap2
crates.
Fixes #88
This commit is contained in:
@@ -85,12 +85,17 @@ Moonfire NVR names a few important thread types as follows:
|
||||
|
||||
* `main`: during `moonfire-nvr run`, the main thread does initial setup then
|
||||
just waits for the other threads. In other subcommands, it does everything.
|
||||
* `s-CAMERA-TYPE`: there is one of these threads for every recorded stream
|
||||
(up to two per camera, where `TYPE` is `main` or `sub`). These threads read
|
||||
frames from the cameras via RTSP and write them to disk.
|
||||
* `sync-PATH`: there is one of these threads for every sample file directory.
|
||||
These threads call `fsync` to commit sample files to disk, delete old sample
|
||||
files, and flush the database.
|
||||
* `s-CAMERA-TYPE` (one per stream, where `TYPE` is `main` or `sub`):
|
||||
These threads read frames from the cameras via RTSP and write them to disk.
|
||||
* `sync-PATH` (one per sample file directory): These threads call `fsync` to
|
||||
* commit sample files to disk, delete old sample files, and flush the
|
||||
database.
|
||||
* `r-PATH` (one per sample file directory): These threads read sample files
|
||||
from disk for serving `.mp4` files.
|
||||
* `tokio-runtime-worker` (one per core): these threads handle HTTP requests.
|
||||
* `logger`: this thread writes the log buffer to `stderr`. Logging is
|
||||
asynchronous; other threads don't wait for log messages to be written
|
||||
unless the log buffer is full.
|
||||
|
||||
You can use the following command to teach [`lnav`](http://lnav.org/) Moonfire
|
||||
NVR's log format:
|
||||
|
||||
Reference in New Issue
Block a user