0

我对大文件ftruncatefsync操作感到惊讶。我编写了一个程序,在 Linux 64 位系统上创建一个空文件,将其截断为 0xffffffff 字节,然后再截断fsync它。

在所有操作之后,使用此长度正确创建文件。

我看到这ftruncate花费了大约 1442 微秒,而fsync只花费了 4 微秒。

这么高的性能正常吗?真的把所有字节都写在光盘上吗?如果没有,我怎样才能确保这种同步?

#include <sys/time.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <iostream>

static const size_t __tamFile__ = 0xffffffff;

int main(int, char **)
{
    std::string fichero("./testTruncate.dat");

    unlink(fichero.c_str());

    int fd = open(fichero.c_str(), O_CREAT | O_RDWR, S_IRUSR | S_IWUSR);
    if (fd != -1)
    {
        struct timeval t1, t2;

        timerclear(&t1);
        timerclear(&t2);

        gettimeofday(&t1, NULL);
        ftruncate(fd, __tamFile__);
        gettimeofday(&t2, NULL);

        unsigned long long msecTruncate = static_cast<unsigned long long>((((t2.tv_sec * 1E6) + t2.tv_usec) - ((t1.tv_sec * 1E6) + t1.tv_usec))) ;

        gettimeofday(&t1, NULL);
        fdatasync(fd);
        gettimeofday(&t2, NULL);

        unsigned long long msecFsync = static_cast<unsigned long long>((((t2.tv_sec * 1E6) + t2.tv_usec) - ((t1.tv_sec * 1E6) + t1.tv_usec))) ;

        std::cout << "Total microsec truncate: " << msecTruncate << std::endl;
        std::cout << "Total microsec fsync: " << msecFsync << std::endl;

        close(fd);
    }
    return 0;
}
4

2 回答 2

7

我编写了一个程序,在 Linux 64 位系统上创建一个空文件,将其截断为 0xffffffff 字节,然后对其进行 fsync。

除非您向其写入内容,否则该文件极有可能包含漏洞。

来自 TLPI:

如果程序越过文件末尾,然后执行 I/O,会发生什么?调用 read() 将返回 0,表示文件结束。有点令人惊讶的是,可以在文件末尾之后的任意点写入字节。

文件的前一个结尾和新写入的字节之间的空间称为文件洞。从编程的角度来看,孔中的字节是存在的,从孔中读取会返回一个包含 0(空字节)的字节缓冲区。

但是,文件漏洞不会占用任何磁盘空间。文件系统不会为空洞分配任何磁盘块,直到稍后将数据写入其中。

于 2012-05-25T07:58:56.733 回答
0

您拥有哪个 Linux 内核版本、哪个文件系统以及哪些挂载选项(特别是是否启用了屏障?)?

在 Linux 2.6.32 64 位,启用了障碍的 ext4(默认)上,我得到


$ ~/src/cpptest/truncsync 
Total microsec truncate: 32
Total microsec fsync: 266
Total microsec close: 14

否则相同,但使用 NFS 安装的文件系统,我得到


$ ./truncsync 
Total microsec truncate: 38297
Total microsec fsync: 6
Total microsec close: 6
$ ./truncsync 
Total microsec truncate: 3454967
Total microsec fsync: 8
Total microsec close: 330
于 2012-05-25T08:23:53.743 回答