我对大文件ftruncate
和fsync
的操作感到惊讶。我编写了一个程序,在Linux 64位系统上创建一个空文件,将其截断为0xffffffff字节,之后为fsync
。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;
}
也许还应该提到,这个功能通常被称为稀疏文件(http://en.wikipedia.org/wiki/Sparse_file)。 – LiKao
如果你想为所有这些零字节实际保留空间,你需要在文件上调用'posix_fallocate'。 –