I've been running Emby in a VM on Hyper-V for a couple of years now. Recently I've been trying to resolve some disk activity/latency issues that have been causing delays while loading and moving around in Emby from various clients. I think I've finally found my solution and wanted to share what I learned on the off chance it might help someone else.
Long story short, move the cache/metadata/transcode-temp directory to a separate virtual hard disk (vhd).
I noticed that when an Emby client would take a long time to load or start to timeout, disk activity on the server would jump noticeably. I also found that running the disk cleanup task would cause the same kind of usage. While monitoring the disk performance in task manager and resource monitor I would see that disk activity would max out, the disk queue length would be around .90 - 1.5 and average response time for the disk would hit 500ms. All this even though the disk throughput was only being reported at about 500kbps.
I had two vhdx's on the VM, a Fixed size Disk for C: and another Fixed size disk for D: which is where shows are recorded. The first thing I did to try and improve the situation was reconfigure my Hyper-V's host storage as a Raid 10 array instead of Raid 5. This helped a little but not significantly and the issues were still present. I kept monitoring disk usage and noticed that the cache directory was being accessed rather frequently so I decided to move the Emby cache to a different disk. I added a third 10gb Fixed size disk and changed the cache path. This helped a little but I would still see performance issues when the Library.db was being accessed heavily. After looking into if I could move the Library.db to a different directory (and finding out it would be rather difficult) I noticed that the Metadata directory would show up frequently so I decided to move that instead. I moved the metadata location to the same drive as the cache and after refreshing the metadata in my libraries I finally noticed a significant improvement in performance. I also decided to move the transcoding-temp directory to the third drive as well just to cover all my bases.
I originally did not think that moving the cache/metadata directories to a different virtual disk would make a difference since all the VHD's were on the same physical volume. But doing just that appears to have resolved my issue and now I regret not doing it sooner, I've been running performance tests since making the changes and so far I have not been able to re-produce my original performance issues with a variety of different clients including FireTV/Web/Theater. My Emby clients are much more responsive and not having to sit around and wait while browsing my music library is refreshing. And if I never see that VolleyError timeout message again I'll be very happy.
I'm going to keep a close eye on my disk utilization and performance for the next few days but wanted to share what I was experiencing and what I did in case anyone else runs into the same issue.
Also, on a side note, I did try enabling Quality of Service Management on the Virtual Disks but it ended up making the situation worse. I'm also not sure if this solution applies to only Hyper-V or also VMware. I'm not running VMware ESXi at home so I can't say for certain. But if you are running Emby in VMware and are having a similar issue then maybe this will help you as well.