我有一个java应用程序,它使用java MappedByteBuffer实用程序将数据文件写入磁盘。这是应用程序在写入磁盘时使用~16000字节的字节缓冲区。当正在向其写入新文件时,会创建缓冲区大小的临时文件,并且由于mem-mapped文件的java实现,代码不会显式关闭该文件。相反,我们调用Linux的drop_caches来强制未使用的内存映射刷新到磁盘。
服务器信息: 我们正在运行最新的centos 7.2并且是最新的补丁
已执行测试
我们在Ext4上运行了一个副本服务器,但这个问题没有发生
我们目前正在使用COW和压缩,因此我尝试禁用它们,重新启动,删除旧数据并重新启动软件。问题仍然存在
答案 0 :(得分:1)
由于mem-mapped文件的java实现,代码没有显式关闭文件。
这没有多大意义。文件支持的内存映射不要求其文件描述符保持打开状态。所以你绝对可以在创建映射缓冲区后关闭文件。
相反,我们调用Linux的drop_caches来强制未使用的内存映射刷新到磁盘。
这是大规模的矫枉过正。
try(FileChannel dir = FileChannel.open(Paths.get("/path/directory"), StandardOpenOptions.READ)) {
dir.force(true);
}