From the thread dump, I can see that some tags are executing queries to get their values. From the fact that it shows up in the dump, it either means that the queries are taking some time, or there are many of them.
I would guess that you are using the same scan class for tag execution and scan class execution. The long execution time for query based tags is causing the scan class execution to take a long time, which in turn makes the data “stale” in the historical database (and causes values to be missed).
I would recommend the following: separate scan classes for history and execution, and a separate execution scan class for the expression tags.
Going further, it may be possible to improve the tag query performance with better indexes or a different where clause, but that’s a different issue. There should be a way to get the OPC tags to store history with no gaps.
The machine specs are more than fine, it should easily handle this.