gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:02:03 24 4
gpt4 key购买 nike

引用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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com