0

ftruncate大きなファイルとfsync操作に驚いています。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 に答える