// 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]; }
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; }
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); }