Пример #1
0
// Read lbns l1 and l2 back-to-back, timing the second request.  In
// trace generation mode, we just print out the IOs we would do.  In
// calibration mode, we inject both IOs into an instance of disksim.
double
time_second_request(int l1, int l2, struct dsstuff *ds, struct trace *t,
		    struct dm_disk_if *d) {
  struct disksim_request *r1, *r2;

  ddbg_assert(l1 < d->dm_sectors);
  ddbg_assert(l2 < d->dm_sectors);

  if(mode == GENTRACE) {
    fprintf(t->fp, "%f 0 %d 1 1\n", ds->now, l1);
    fprintf(t->fp, "%f 0 %d 1 1\n", ds->now + 0.1, l2);
    ds->now += 20.0;
  } else {
    r1 = calloc(1, sizeof(*r1));
    r2 = calloc(1, sizeof(*r2));

    r1->blkno = l1;
    r1->bytecount = 512;
    r1->flags |= DISKSIM_READ;
    r1->start = ds->now;
    //    r1->reqctx = &t1;
  
    r2->blkno = l2;
    r2->bytecount = 512;
    r2->flags |= DISKSIM_READ;
    r2->start = ds->now + 0.001;
    //    r2->reqctx = &t2;
  
    disksim_interface_request_arrive(ds->iface, ds->now, r1);
    disksim_interface_request_arrive(ds->iface, ds->now, r2);
  
    // pump disksim

    do {
      ds->now = ds->next;
      ds->next = -1;
      disksim_interface_internal_event(ds->iface, ds->now, 0);
    } while(ds->next != -1);

    // roll now forward slightly, some small ~1ms int-arr
    ds->now += 1.0;

    free(r1);
    free(r2);

    //    printf("%d -> %d : %f\n", l1, l2, ds->compl[1] - ds->compl[0]);

    ds->compl_next = 0;
  }

  return ds->compl[1] - ds->compl[0]; 
}
Пример #2
0
int seek_sim(
		struct disksim_interface *disksim,
		const int measurements,
		const size_t sector_size,
		const int write_flag)
{
    double t; 
    double sum;
    unsigned long pos=0;
    int nbytes; 
    int i; 
    struct disksim_request r;
    int base = 0;

    fprintf(stdout, "# Seek distances measured: %d\n", measurements);

    sum = 0;
    //    for ( base = 0; base < sector_size*measurements; base += sector_size )
    //    for ( base = 0; base < sector_size*1000; base += 4096 )
    {
      pos = 0;
	for (i=0; i<measurements; i++) 
	{
	  r.start = now;
	  //	  r.flags = DISKSIM_READ;
	  r.flags = DISKSIM_WRITE;
	  r.devno = 0;
	  r.bytecount = sector_size;
	  //	  r.blkno = base;	  r.blkno = base;
	  r.blkno = 0;
	  
	  /* reset the disk position */
	  if (write_flag) {
	    r.flags = DISKSIM_WRITE;
	  }
	  
	  disksim_interface_request_arrive(disksim, now, &r);

	  /* Process events until this I/O is completed */
	  while(next_event >= 0) {
	    now = next_event;
	    next_event = -1;
	    disksim_interface_internal_event(disksim, now, 0);
	  }

	  pos = 0;

	  /* save the current time */
	  
	  /* lseek(fd, i*sector_size, SEEK_CUR) */
	  r.start = now;
	  r.flags = DISKSIM_WRITE;
	  r.devno = 0;
	  r.bytecount = sector_size;
	  r.blkno = i+base/sector_size;
	  
	  /* reset the disk position */
	  if (write_flag) {
	    r.flags = DISKSIM_WRITE;
	  }
	  
	  t = now;
	  disksim_interface_request_arrive(disksim, now, &r);

	  /* Process events until this I/O is completed */
	  while(next_event >= 0) {
	    now = next_event;
	    next_event = -1;
	    disksim_interface_internal_event(disksim, now, 0);
	  }
	  
	  fprintf(stdout, "%d %lf\n", i, now-t);
	}

      }

    return 0; 
}
Пример #3
0
int
main(int argc, char *argv[])
{
  int i;
  int nsectors;
  struct stat buf;
  struct disksim_request r;
  struct disksim_interface *disksim;
  unsigned long pos=0;

  int measurements;
  struct stat; 
  int len = 8192000;
  int test_encapsulation;
  struct disksim_interface* iface;  
  struct gengetopt_args_info args_info; 

  double t;
  
  if (argc != 4 || (measurements = atoi(argv[3])) <= 0) {
    fprintf(stderr, "usage: %s <param file> <output file> <#measurements>\n",
	    argv[0]);
    exit(1);
  }

  if (stat(argv[1], &buf) < 0)
    panic(argv[1]);

  disksim = disksim_interface_initialize(argv[1], 
					 argv[2],
					 syssim_report_completion,
					 syssim_schedule_callback,
					 syssim_deschedule_callback,
					 0,
					 0,
					 0);

  /* NOTE: it is bad to use this internal disksim call from external... */
  DISKSIM_srand48(1);

  for (i=0; i < measurements; i++) {
    r.start = now;
    r.flags = DISKSIM_READ;
    r.devno = 0;

    /* NOTE: it is bad to use this internal disksim call from external... */
    r.blkno =  pos; //BLOCK2SECTOR*(DISKSIM_lrand48()%(nsectors/BLOCK2SECTOR));
    r.bytecount = SECTOR;
    completed = 0;

    t = now;
    disksim_interface_request_arrive(disksim, now, &r);

    /* Process events until this I/O is completed */
    while(next_event >= 0) {
      now = next_event;
      next_event = -1;
      disksim_interface_internal_event(disksim, now, 0);
    }

    pos+= SECTOR;
    fprintf(stdout, "%d %g\n",i,(now-t)*1000.0);

    if (!completed) {
      fprintf(stderr,
	      "%s: internal error. Last event not completed %d\n",
	      argv[0], i);
      exit(1);
    }
  }

  disksim_interface_shutdown(disksim, now);

  print_statistics(&st, "response time");

  exit(0);
}