1

私は、アプリケーションのアクセス特性によって、ファイル システムのパフォーマンスがどのように大きく影響を受けるかを調査しようとしています。リクエスト サイズを 1KB (1024) から 64KB (65536) に変更したいと考えています。

8KB になると、ファイルへの書き込みエラーが発生します。十分なスペースを割り当てていませんか?

./test
error writing file (rc = 200704, errno 0)

ここで 1KB ~ 64KB のサイズを調整しています。

request_size = 32*(1<<13); /* 1KB is 1^10 (or 1<<10) */

したがって、これは 8kb = 8192 になります。

今すぐ 4MB ファイルをリクエストする必要がありますか? それがどのシフトになるかわかりませんか?

int main(int c, char *argv[]) {

    int fd;
    void *buffer, *buffer_aligned;
    int i, rc;
    unsigned long file_size, request_size;
    struct timeval start, stop;
    double seconds;

    /* allocate a 64KB page-aligned buffer */
    buffer = malloc(65536+4096);
    buffer_aligned = buffer+(4096-(((unsigned long)buffer)%4096));

    /* write a 1MB file with 32KB requests  */
    fd = open("foo", O_CREAT|O_RDWR, 0644);
    file_size = 1*(1<<20);  /* 1MB is 2^20 (or 1<<20). 1GB is 2^30 (or 1<<30) */
    request_size = 32*(1<<13); /* 1KB is 1^10 (or 1<<10) */
    gettimeofday(&start, NULL);
    for (i=0; i<file_size/request_size; i++) {
            if ((rc=write(fd, buffer_aligned, request_size))!=request_size) {
                    fprintf(stderr, "error writing file (rc = %i, errno %i)\n", rc, errno);
                    return 1;
            }
    }       
    gettimeofday(&stop, NULL);
    seconds = ((stop.tv_sec*1e6+stop.tv_usec)-(start.tv_sec*1e6+start.tv_usec))/1e6;
    printf("file size is %uMB\n", file_size>>20);
    printf("request size is %uKB\n", request_size>>13);
    printf("elapsed time is %.2lf seconds\n", seconds);
    printf("bandwidth is %.2lf MB/sec\n", file_size/seconds/(1<<20));
    close(fd);

    /* free buffer */
    free(buffer);

    return 0;
}

8KBじゃないの?

request_size = 32*(1<<13); /* 1KB is 1^10 (or 1<<10) */
4

1 に答える 1

1

1 回の呼び出しで書き込んでいるデータの量がwrite多すぎて、最初の呼び出しで常に完全に書き込めない可能性があります。のGNU libcドキュメントからwrite

戻り値は、実際に書き込まれたバイト数です。これはサイズかもしれませんが、常に小さくすることができます。プログラムは常にループ内で write を呼び出し、すべてのデータが書き込まれるまで繰り返します。

(私は他の libc 実装のドキュメントをチェックしようとしましたが、GNU と同じようにこの動作を詳細に説明しているものはありません。関数は単に「nbytes のデータを書き込もうとして、書き込まれたバイト数を返す」と言っています。ファイル記述子がノンブロッキング モードかどうかに依存すると言う人もいますが、いずれにせよ、write通常はオペレーティング システム コールに直接マップされるため、動作も OS に依存します。)

したがって、基本的には、ループを配置して、バイトwriteが書き込まれるまでチェックする必要があります。request_size何かのようなもの:

unsigned long data_remaining = request_size;
void *data_offset = buffer_aligned;
while (data_remaining > 0)
{
    rc = write(fd, data_offset, data_remaining);
    if (rc == -1) {
        fprintf(stderr, "error writing file (rc = %i, errno %i)\n", rc, errno);
        return 1;
    }
    data_remaining -= rc;
    data_offset += rc;  /* you don't care about the data being written, so this is kind of unnecessary in your case */
}
于 2012-12-02T23:23:54.613 に答える