So as of recently I started having issues with memory use. My machine has 32 GiB of physical RAM, so there shouldn’t usually be a problem running even several virtual machines at once. I’ve even run an XP VM from a RAM disk and you should have seen just how quickly XP can install and boot
Anyway, so from both the task manager which ships with Windows 7 as well as from the Sysinternals tool called RAMmap, I could see that huge amounts of NonPagedPool were being used. The VMs ran quite slow accordingly.
Nothing wrong with using much RAM, if everything else doesn’t suddenly slow down due to resource pressure increased level of paging. I’m not a cargo cultist who keeps perpetuating that using the RAM you installed is somehow a bad thing. It isn’t. Heck, that’s why I install my RAM not out of some vanity motive to tell others just how much RAM I plugged into my machine.
Using the tool
poolmon.exe from the Windows Driver Kit, I figured out that the most offensive pool tags in terms of overall allocation size were
CTNP (almost 12 GiB) and
CT-D (approximately 6 GiB).
findstr, which conveniently comes with Windows and has shipped with Windows for ages, I found that these two tags belong to the same driver:
C:\>findstr /m /l CTNP %SystemRoot%\System32\drivers\*.sys C:\Windows\System32\drivers\tcesd.sys C:\>findstr /m /l CT-D %SystemRoot%\System32\drivers\*.sys C:\Windows\System32\drivers\tcesd.sys
Further inspecting the driver turned out it belongs to a feature of Diskeeper 16 by Condusiv. The file description states
TCE Storage Driver and another string from the version information resource mentions
Tiered Cache for Enterprise. Looks like the culprit got uncovered. Going by the tag names, it even makes sense. When writing tag names in C/C++ one usually uses something like
'ABCD', so a literal of these four letters. When targeting a Little Endian machine (such as x86) the result will show up as a string
"DCBA" inside the binary file. So what the developer wrote for the first tag was
TC is likely a reference to the “Tiered Cache” driver.
I even recall activating the feature, since it sounded like a great idea. After all why would I have all my free RAM lay dormant when there’s good use for it? Alas, Diskeeper 16 only allows enabling or disabling this feature. There is no setting that allows me as power user to intervene and assign it, say, only 8 GiB overall. Instead this feature appears to grab as much as it can and when I start up one or two heavy VMs things go downhill performance-wise.
After disabling the feature1 again, the performance of the virtual machines is back to normal, it seems. So while I think the claim that this feature speeds up I/O is moderately true for the machine on which it runs, the same cannot be said of the virtual machines run from that machine.
Evidently this TCE driver doesn’t vacate the resources quickly enough – quite frankly I wasn’t seeing any indication it was vacating any of the resources at all in such a case – when I start a VM, so I’m better off without it. Your mileage may vary.
- it’s called IntelliMemory, by the way [↩]