/* Maximum size of a single RPC message that we will accept (8 MB). */
#define MAX_RPC_MSGSIZE (8 << 20)
+FILE *logfile = NULL;
+
int threads;
int completed = 0;
+int read_size = 32768;
struct bench_file {
uint64_t inum;
uint64_t size;
};
+struct data_point {
+ uint32_t timestamp; // Unix timestamp of completion
+ uint32_t latency; // Latency, in microseconds
+} __attribute__((packed));
+
GArray *bench_files;
struct rpc_reply {
return;
}
+ struct data_point d;
info->end = now_hires();
- printf("XID %d: Time = %"PRIi64"\n", xid, info->end - info->start);
+ d.timestamp = info->end / 1000000000;
+ d.latency = (info->end - info->start + 500) / 1000; /* Round off */
+ //printf("XID %d: Time = %"PRIi64"\n", xid, info->end - info->start);
if (info->callback != NULL)
info->callback(nfs, info->user_data,
msg->str + sizeof(*reply), msg->len - sizeof(*reply));
g_hash_table_remove(nfs->xid_table, key);
g_free(info);
+ if (logfile != NULL) {
+ fwrite(&d, sizeof(d), 1, logfile);
+ fflush(logfile);
+ }
completed++;
+ /*
if (completed == 128 * threads) {
g_main_loop_quit(main_loop);
- }
+ } */
}
static gboolean read_handler(GIOChannel *channel,
static void send_read_request(NFSConnection *nfs, uint64_t inum,
uint64_t offset, uint64_t len);
-
-static void finish_read_request(NFSConnection *nfs, gpointer user_data,
- const char *reply, size_t len)
+static void submit_random_read(NFSConnection *nfs)
{
- printf("Done reading inode %d\n", GPOINTER_TO_INT(user_data));
-
struct bench_file *bf;
bf = &g_array_index(bench_files, struct bench_file,
g_random_int_range(0, bench_files->len));
- send_read_request(nfs, bf->inum, 0, 1048576);
+ int blocks = bf->size / read_size;
+ if (blocks == 0)
+ blocks = 1;
+
+ int offset = g_random_int_range(0, blocks);
+ send_read_request(nfs, bf->inum, offset * read_size, read_size);
+}
+
+static void finish_read_request(NFSConnection *nfs, gpointer user_data,
+ const char *reply, size_t len)
+{
+ submit_random_read(nfs);
}
static void send_read_request(NFSConnection *nfs, uint64_t inum,
int i;
for (i = 0; i < threads; i++) {
- struct bench_file *bf;
- bf = &g_array_index(bench_files, struct bench_file,
- g_random_int_range(0, bench_files->len));
- send_read_request(nfs, bf->inum, 0, 1048576);
+ submit_random_read(nfs);
}
#if 0
bf.size = i2;
g_array_append_val(bench_files, bf);
}
+ fclose(inodes);
threads = 8;
if (argc > 2)
threads = atoi(argv[2]);
+ if (argc > 3)
+ read_size = atoi(argv[3]);
+ if (argc > 4)
+ logfile = fopen(argv[4], "wb");
main_loop = g_main_loop_new(NULL, FALSE);
nfs_connect("niniel.sysnet.ucsd.edu");