/* Maximum size of a single RPC message that we will accept (8 MB). */
#define MAX_RPC_MSGSIZE (8 << 20)
+FILE *logfile = NULL;
+
+int warmup_mode = 0;
int threads;
int completed = 0;
int read_size = 32768;
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);
+ if (warmup_mode) {
+ printf("Done warming up %d\n", completed);
+ int scale = 1;
+ if (read_size > (1 << 20))
+ scale = read_size / (1 << 20);
+ if (completed == bench_files->len * scale)
+ g_main_loop_quit(main_loop);
}
}
uint64_t offset, uint64_t len);
static void submit_random_read(NFSConnection *nfs)
{
+ static int warmup_counter = 0;
struct bench_file *bf;
+
+ if (warmup_mode) {
+ int scale = 1;
+ if (read_size > (1 << 20)) {
+ scale = read_size / (1 << 20);
+ }
+ int filecount = bench_files->len;
+ printf("Warming up file %d\n", warmup_counter);
+ if (warmup_counter >= filecount * scale)
+ return;
+ bf = &g_array_index(bench_files, struct bench_file,
+ warmup_counter % filecount);
+ send_read_request(nfs, bf->inum, (warmup_counter / filecount) << 20,
+ read_size > (1 << 20) ? (1 << 20) : read_size);
+ warmup_counter++;
+ return;
+ }
+
bf = &g_array_index(bench_files, struct bench_file,
g_random_int_range(0, bench_files->len));
int blocks = bf->size / read_size;
static void finish_read_request(NFSConnection *nfs, gpointer user_data,
const char *reply, size_t len)
{
- printf("Done reading inode %d\n", GPOINTER_TO_INT(user_data));
-
submit_random_read(nfs);
}
}
if (connect(fd, ai->ai_addr, ai->ai_addrlen) < 0) {
- fprintf(stderr, "Unable to connect to : %m\n");
+ fprintf(stderr, "Unable to connect to %s: %m\n", hostname);
}
freeaddrinfo(ai);
{
g_thread_init(NULL);
g_set_prgname("synclient");
- g_print("Launching synthetic NFS RPC client...\n");
bench_files = g_array_new(FALSE, TRUE, sizeof(struct bench_file));
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) {
+ if (strcmp(argv[4], "WARMUP") == 0) {
+ warmup_mode = 1;
+ } else {
+ logfile = fopen(argv[4], "wb");
+ }
+ }
main_loop = g_main_loop_new(NULL, FALSE);
- nfs_connect("niniel.sysnet.ucsd.edu");
+ nfs_connect("vrable2.sysnet.ucsd.edu");
g_main_loop_run(main_loop);