【问题标题】:How to programmatically clear the filesystem memory cache in C++ on a Linux system?如何在 Linux 系统上以编程方式清除 C++ 中的文件系统内存缓存?
【发布时间】:2011-10-12 17:08:18
【问题描述】:

我正在用 C++ 编写一个基准测试工具,我想在实验之间清除文件系统内存缓存。我知道以下控制台命令:

sync
echo 3 > /proc/sys/vm/drop_caches

我的问题是如何直接在 C++ 中以编程方式执行此操作?

感谢任何帮助!

【问题讨论】:

    标签: c++ c linux caching


    【解决方案1】:

    这样的事情应该可以解决问题:

    int fd;
    char* data = "3";
    
    sync();
    fd = open("/proc/sys/vm/drop_caches", O_WRONLY);
    write(fd, data, sizeof(char));
    close(fd);
    

    【讨论】:

    • 这是一个更好的答案,因为它包含同步。这一点很重要,因为 drop_caches 是一个 调试 工具,它并不总是在删除磁盘之前获取磁盘上的数据。
    • 更好的答案是什么?我看到的两个答案都包括sync
    • 如果这是真的,那么这有点危险——如果一个进程在后台写入文件会发生什么? sync() 和 open() 之间写入的数据是不是就丢失了?
    • @ZanLynx:drop_caches 是非破坏性的,只会释放干净的缓存(尚未同步到磁盘的缓存)。因此,之前调用 sync() 不会使操作更加安全,而是增加了可以删除的缓存数量。参见:/usr/src/linux/Documentation/sysctl/vm.txt
    • 如果 drop_caches 不安全,则您的内核存在错误。没有现代内核会对此有问题。
    【解决方案2】:

    写信给它:

    sync();
    
    std::ofstream ofs("/proc/sys/vm/drop_caches");
    ofs << "3" << std::endl;
    

    【讨论】:

      【解决方案3】:

      更好的方法是使用syncfs() 仅同步包含您的描述符的文件系统。或者更好的是,只需使用fsync()

      int fd = open(...);   // Open your files
      write(...);           // Your write calls
      fsync(fd);            // Sync your file
      close(fd);            // Close them
      

      如果您的描述符无效,fsync() 可能会失败。如果返回-1,则查找errno

      【讨论】:

        猜你喜欢
        • 2010-09-14
        • 2012-08-29
        • 1970-01-01
        • 2020-09-25
        • 1970-01-01
        • 1970-01-01
        • 2010-11-06
        • 2010-12-28
        • 1970-01-01
        相关资源
        最近更新 更多