Our current model of measurements is cache drop and "sync" for every benchmark type. This is good but not enough. We need to drop caches after every request because otherwise we both benefit from warm caches and suffer from memory pressure from previous queries.
Specifically, we want each query (which is currently run 10 times) to be run in a separate process. Our second iteration for memory-heavy queries (think clickbench with 9.5GB madvice) gets TLB issues because it tries to deallocate the memory allocated by first iteration (we run them in same process).
This in turn happens because mimalloc/jemalloc keep deallocated memory for a short time after deallocation because giving it back to the user is faster then returning it to the OS and then allocating again. However, this impacts benchmark performance a lot.
cc @AdamGS
Our current model of measurements is cache drop and "sync" for every benchmark type. This is good but not enough. We need to drop caches after every request because otherwise we both benefit from warm caches and suffer from memory pressure from previous queries.
Specifically, we want each query (which is currently run 10 times) to be run in a separate process. Our second iteration for memory-heavy queries (think clickbench with 9.5GB madvice) gets TLB issues because it tries to deallocate the memory allocated by first iteration (we run them in same process).
This in turn happens because mimalloc/jemalloc keep deallocated memory for a short time after deallocation because giving it back to the user is faster then returning it to the OS and then allocating again. However, this impacts benchmark performance a lot.
cc @AdamGS