我需要清除系统缓存,以便记录冷缓存中 postgres 查询所花费的时间。为了清除系统缓存,我在 Ubuntu 服务器 12.04 上以 root 身份执行以下命令:
sync; echo 1 > /proc/sys/vm/drop_caches
sync; echo 2 > /proc/sys/vm/drop_caches
sync; echo 3 > /proc/sys/vm/drop_caches
我正在运行以下 SQL 命令并清除缓存:
1. select col1 from my_table; //Time Taken= 3000 ms
2. sync; echo 1 > /proc/sys/vm/drop_caches
sync; echo 2 > /proc/sys/vm/drop_caches
sync; echo 3 > /proc/sys/vm/drop_caches
3. Now again running the same select command and clearing caches:
select col1 from my_table; //Time Taken= 200 ms
4. sync; echo 1 > /proc/sys/vm/drop_caches
sync; echo 2 > /proc/sys/vm/drop_caches
sync; echo 3 > /proc/sys/vm/drop_caches
5. Now again running the same select command and clearing caches:
select col1 from my_table; //Time Taken= 10 ms
从查询执行时间的减少中我可以理解的是,即使清除了缓存,实际上缓存也没有被清除。我的解释正确吗?还有其他方法可以在 Ubuntu 12.04 服务器中清除缓存吗?
答案1
我认为你的假设是错误的。通过该drop_caches
界面,你可以清除内核管理的缓存,但这不会将所有用户空间进程重置回之前的状态。
SQL 服务器可能在自己的内存中缓存了一些中间结果,甚至可能是查询的最终结果。或者,它可能根据前两次运行期间收集的统计数据动态调整了查询的执行计划。
您可以通过重新启动守护程序来部分补偿,但对于像 SQL 服务器这样的复杂系统,除了“全新安装”之外,很难准确重现任何以前的状态。除非您对整个机器进行快照。