There are a number of possible causes.
It is a low latency streaming pipeline, so brief network interruptions will cause FPS to drop, recover, go above its normal FPS as the stream "catches up", and then level off.
Blue Iris is also usually transcoding the video in realtime from the source codec to the target codec / bitrate / etc. The higher the resolution and frame rate is, the harder it is for Blue Iris to achieve this without dropping frames. This will cause FPS to fluctuate no matter how good your network is. In my experience even a modern Blue Iris server with a very fast CPU is going to struggle to transcode 4K video above about 15 FPS.
The best way to resolve that is to set up a streaming profile in UI3 to use "direct-to-wire" and try that. You could also try Blue Iris's hardware accelerated encoding (BI Settings > Web server > Advanced > Streaming 0 configure). But right now it is pretty bad and last I checked it didn't even work. Before that, when I did see it working, it did not meaningfully affect the transcoding frame rate.
Also if you are "dual streaming" (having Blue Iris use both the main stream and a sub stream from the camera), then the frame timing gets weird and that can negatively affect the transcoding frame rate and smoothness. The rule of thumb is to use the
same frame rate for both main and sub stream as this will generally yield the best results. Although there's a caveat to this. I find it is more important to have a high sub stream frame rate than a high main stream frame rate. For example in bandwidth-constrained environments I like to reduce the main stream to 1 or 2 FPS. Dual streaming works very poorly if the sub stream is also at 1 or 2 FPS. For some reason it works significantly better if the sub stream is at 10 FPS or above, even if the main stream frame rate is lower than that. So in my experience it is fine to use a higher sub stream frame rate than main stream frame rate, but I'd try to keep it where the sub stream FPS is an integer multiple of the main stream rate. For example if the main stream is 5 FPS, sub stream should be 10, 15, 20, 25, or 30 FPS to improve the consistency of the main stream's frame timing.