C 代码测量 Linux 中的磁盘写入时间并处理 RAM 缓冲

标签 c performance time disk ramdisk

引用http://www.linuxatemyram.com/其中描述了磁盘 I/O 如何在内存中缓冲。我想考虑这一点,并实际撤消它,以测量将各种数据量写入文件所需的时间。 我想要做的是根据两种情况的 I/O 了解运行时间:

  1. 通过 mount -t tmpfs -o size=500g tmpfs/ramdisk 安装为 ramdisk 的内存
  2. 将数据写入 /scratch/,其中是格式化为 EXT3 或 XFS 的 900GB Seagate sas 硬盘

我的程序将文件写入硬盘时速度非常快,我确信这是因为 Linux 操作系统正在 RAM 中缓冲该数据,使磁盘 I/O 透明......因为在我的程序完成后,如果在提示我执行rm temp_speed*,这需要一分钟或更长时间才能发生。

例如,如果程序正在写入 10GB,则需要 7 秒才能完成对 ramdisk 的写入,需要 20 秒才能完成对/scratch 的写入。但我可以在写入 ramdisk 后执行 rm temp* 并在 1-3 秒内完成,而如果是从头开始,则删除命令需要 90 秒以上才能完成。

有人知道我如何编写下面的程序来知道程序内磁盘 I/O 何时完全完成吗?谢谢。

预先警告,如果您尝试运行此代码,您可能会面临快速填满硬盘和/或内存并导致系统崩溃的风险。

# include <stdio.h>
# include <stdlib.h>
# include <time.h>

# define MAX_F  256

/* WARNING: running this code you risk quickly filling up */
/*          your hard drive and/or memory and crashing your system.  */

/* compile with -O0  no optimization */

long int get_time ( void )
{
   long int t;

   t = (long int) time( NULL );

   return( t );
}

void diff_time ( long int *start, long int *finish )
{
   time_t s, e;
   long int diff;
   long int h = 0, m = 0;

   s = (time_t) *start;
   e = (time_t) *finish;

   diff = (long int) difftime( e, s );

   h = diff / 3600;

   diff -= ( h * 3600 );

   m = diff / 60;

   diff -= ( m * 60 );

   printf(" problem runtime (h:m:s) = %02ld:%02ld:%02ld\n", h, m, diff );
   printf("\n");
}

int main ( int argc, char *argv[] )
{
    FILE *fp[MAX_F];
    char fname[MAX_F][64];
    long int a, i, amount, num_times, num_files;
    long int maxfilesize;
    long int start_time, end_time;
    double ff[512];     /* 512 doubles = 4096 = 4k worth of data */


    if ( argc != 3 )
    {
       printf("\n   usage: readwrite_speed  <total amount in gb> <max file size in gb>\n\n");
       exit( 0 );
    }

    system( "date" );

    amount = atol( argv[1] );
    maxfilesize = atol( argv[2] );

    if ( maxfilesize > amount )
       maxfilesize = amount;

    num_files = amount / maxfilesize;

    if ( num_files > MAX_F )
    {
       printf("\n   increase max # files abouve %d\n\n", MAX_F );
       exit( 0 );
    }

    num_times = ( amount * 1024 * 1024 * 1024 ) / 4096;

    num_times /= num_files;

    printf("\n");
    printf("   amount = %ldgb, num_times = %ld, num_files = %ld\n", amount, num_times, num_files );

    printf("\n");

    for ( i = 0; i < num_files; i++ )
       sprintf( fname[i], "temp_speed%03d", i );

    start_time = get_time();

    for ( i = 0; i < num_files; i++ )
    {
       fp[i] = fopen( fname[i], "wb" );
       if ( fp[i] == NULL )
           printf("   can't write binary %s\n", fname[i] );
    }

    for ( i = 0; i < 512; i++ )
       ff[i] = rand() / RAND_MAX;

    /* 1 gb = 262,144 times writing 4096 bytes */

    for ( a = 0; a < num_times; a++ )
    {
       for ( i = 0; i < num_files; i++ )
       {
          fwrite( ff, sizeof( double ), 512, fp[i] );
          fflush( fp[i] );
       }
    }

    for ( i = 0; i < num_files; i++ )
       fclose( fp[i] );

    end_time = get_time();

    diff_time( &start_time, &end_time );

    system( "date" );
}

最佳答案

首先看here .
您无法 100% 保证知道数据在磁盘上。
您可以使用 fsync 告诉内核将数据刷新到磁盘。但是磁盘和磁盘 Controller 有自己的缓存,因此即使是内核也无法始终知道何时 100% 完成。

关于C 代码测量 Linux 中的磁盘写入时间并处理 RAM 缓冲,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36725902/

相关文章:

c - 为什么通过 typedef-ed 指针访问 struct 的字段不起作用?

android - 同步联系人 firebase

performance - 计算嵌套for循环的时间复杂度

php - PHP 是否(在内部)以不同方式处理数字索引数组?

C 类型定义冲突

c - 尝试替换由 C 中链表中的节点组成的单词

pandas - 如何在 Python 中去掉日期时间的毫秒数

python - 如何检查日期时间是否超过 20 秒

linux - 如何计算出两个不同 Linux 服务器之间的系统时间偏移量?

c - 覆盖 Lua 中的值分配