From cedf827e511a41f6335fbf3e66ce111eb01bd1d0 Mon Sep 17 00:00:00 2001 From: Raghavendra Bhat Date: Wed, 13 Jul 2011 18:19:56 +0530 Subject: benchmarking application for calculating average time creation of different file types --- INFO | 2 + c_pgms/create.c | 290 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 292 insertions(+) create mode 100644 c_pgms/create.c diff --git a/INFO b/INFO index afdb985..f517c10 100644 --- a/INFO +++ b/INFO @@ -16,4 +16,6 @@ community-scripts/locks/lock.php ---> Bug 1017 - Locking deadlock when upgrading c_pgms/locking ---> programs (both for file as well as directory) for doing open, lock (fcntl and flock), write, close on an fd multiple times to check for a leak in some memory type of the glusterfs process. (bug number 3025) c_pgms/threaded_io ---> program for opening a file from multiple threads and each thread doing some operation such as stat, write & truncate, read, chown etc on multiple fds + +c_pgms/create_bench(create.c) ---> benchmarking application for taking average time duration needed for the creation of different types of files such as regular file, directory, FIFO, character and block device special files ============================================================================================================================================ \ No newline at end of file diff --git a/c_pgms/create.c b/c_pgms/create.c new file mode 100644 index 0000000..e377a92 --- /dev/null +++ b/c_pgms/create.c @@ -0,0 +1,290 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +double timeval_elapsed(struct timeval *tv1, struct timeval *tv2); + +double timeval_elapsed(struct timeval *tv1, struct timeval *tv2) +{ + return (tv2->tv_sec - tv1->tv_sec)+ + (tv2->tv_usec - tv1->tv_usec) * 1.0e-6; +} + +/* This function sets the limit on maximum number of open files. By default it is set to 1024.This function raises that limit*/ + +int ulimit_unlimited() +{ + int err = 0; + int ret = 0; + struct rlimit lim; + lim.rlim_cur = 1048576; + lim.rlim_max = 1048576; + + if ( setrlimit(RLIMIT_NOFILE, &lim) == -1 ) { + err = errno; + ret = -1; + fprintf(stderr,"%s:ulimit -n error\n", + strerror(errno)); + goto out; + } + + out: + return ret; +} + +int create_block_special_file(char *dir, int n) +{ + + int mknod_ret; + int err; + struct timeval before, after; + double create; + dev_t dev; + char name[4096]; + char remove_name[4096]; + int i; + + gettimeofday(&before,NULL); + + for ( i = 0; i < n; i++ ) { + sprintf(name,"%s/%s.%d", dir, "dev", i); + dev = makedev(2,2 ); /* creates a device with given major and minor numbers and returns a structure of type dev_t */ + mknod_ret = mknod(name,S_IFBLK|0644,dev); + + if(mknod_ret) { + err = errno; + fprintf(stderr,"%s:Creating device file %s failed\n", + strerror(errno),name); + exit(err); + } + } + + gettimeofday(&after,NULL); + + create = timeval_elapsed(&before,&after) * 1e6 / n; + printf("Time to create block device special file is %.01f us\n",create); + + for ( i = 0; i < n; i++ ) { + sprintf(remove_name,"%s/%s.%d", dir, "dev", i); + unlink(remove_name); + } + return 0; + +} + + +int create_directory(char *dirname, int n) +{ + char name[4096]; + char rmdir_name[4096]; + double create; + int makedir_ret; + int err; + int i; + struct timeval before, after; + + gettimeofday(&before,NULL); + + for ( i = 1; i < n; i++ ) { + sprintf(name,"%s/%s.%d", dirname, "dir", i); + makedir_ret = mkdir(name,0755); + if (makedir_ret == -1) { + err = errno; + fprintf(stderr,"%s:creating directory %s created error\n", + strerror(errno),name); + exit(err); + } + + } + + gettimeofday(&after,NULL); + + create = timeval_elapsed(&before,&after) * 1e6 / n; + printf("Time to create directory is %.01f us\n",create); + + for ( i = 0; i < n; i++) { + sprintf(rmdir_name,"%s/%s.%d", dirname, "dir", i); + rmdir(rmdir_name); + } + + return 0; + +} + +int create_character_special_file(char *dir, int n) +{ + int mknod_ret; + int err; + struct timeval before, after; + double create; + dev_t dev; + char name[4096]; + char remove_name[4096]; + int i; + + gettimeofday(&before,NULL); + + for ( i = 0; i < n; i++ ) { + sprintf(name,"%s/%s.%d", dir, "chr", i); + dev = makedev(2,2); /* creates a device with given major and minor numbers and returns a structure of type dev_t */ + mknod_ret = mknod(name,S_IFCHR|0644,dev); + + if(mknod_ret) { + err = errno; + fprintf(stderr,"%s:Creating device file %s failed\n", + strerror(errno),name); + exit(err); + } + + } + + gettimeofday(&after,NULL); + + create = timeval_elapsed(&before,&after) * 1e6 / n; + printf("Time to create character special file is %.01f us\n",create); + + for ( i = 0; i < n; i++ ) { + sprintf(remove_name,"%s/%s.%d", dir, "chr", i); + unlink(remove_name); + } + + return 0; + +} + +int create_pipe(char *dirname, int n) +{ + struct timeval before,after; + char pipe_name[4096]; + char remove_pipe[4096]; + int err = 0; + double create_pipe; + int i; + int ret; + + gettimeofday(&before,NULL); + + for ( i = 0; i < n ; i++) { + sprintf(pipe_name,"%s/%s.%d", dirname, "pipe", i); + ret = mkfifo(pipe_name, 0644); + if ( ret == -1 ) { + err = errno; + fprintf(stderr,"%s:Creating pipe %s caused error\n", + strerror(errno),pipe_name); + exit(err); + } + } + + gettimeofday(&after,NULL); + + create_pipe = timeval_elapsed(&before,&after) * 1e6 / n; + printf("Time to create a pipe is %.01f us\n", create_pipe); + + for ( i = 0; i < n; i++) { + sprintf(pipe_name,"%s/%s.%d", dirname, "pipe", i); + unlink(pipe_name); + } + + return 0; +} + +int create_regular_file(char *dirname, int n) +{ + struct timeval before,after; + char file_name[4096]; + char remove_file[4096]; + int err = 0; + double create_file; + int i; + int ret; + + gettimeofday(&before,NULL); + + for ( i = 0; i < n ; i++) { + sprintf(file_name,"%s/%s.%d", dirname, "file", i); + ret = open(file_name, O_CREAT|O_RDWR,0600); + if ( ret == -1 ) { + err = errno; + fprintf(stderr,"%s:Creating file %s caused error\n", + strerror(errno),file_name); + exit(err); + } + } + + gettimeofday(&after,NULL); + + create_file = timeval_elapsed(&before,&after) * 1e6 / n; + printf("Time to create a regular file is %.01f us\n", create_file); + + for ( i = 0; i < n; i++) { + sprintf(file_name,"%s/%s.%d", dirname, "file", i); + unlink(file_name); + } + + return 0; +} + + +int main(int argc, char **argv) +{ + //char *pathname = "special_file"; + int err; + int num = 1000; + char *dir = "."; + char *dirname = "block_dir"; + char *dirname_char = "char_dir"; + char *dirname_pipe = "pipe_dir"; + char *dirname_regular_file = "file_dir"; + char *entries_dir_path; + + if(argv[1]) + num = atoi(argv[1]); + + printf("%d\n",num); + if ( ulimit_unlimited() == -1 ) { + fprintf(stderr, "%s:ulimit failed going with default value, Setting %d to 1000\n", + strerror(errno),num); + num = 1000; + } + /* Creating 1000 block special files and calculating the time needed for it */ + entries_dir_path = getcwd(entries_dir_path,255); + mkdir (dirname,0755); + strcat(entries_dir_path,dirname); + create_block_special_file(dirname,num); + rmdir(dirname); + + /* Creating 1000 cgaracter special files and calculating the time needed for it */ + entries_dir_path = getcwd(entries_dir_path,255); + mkdir (dirname_char,0755); + strcat(entries_dir_path,dirname_char); + create_character_special_file(dirname_char,num); + rmdir(dirname_char); + + /*Creating 1000 directories and calculating the time needed for it */ + create_directory(dir,num); + + /* Creating 1000 files and calculating the time needed for it */ + entries_dir_path = getcwd(entries_dir_path,255); + mkdir (dirname_pipe,0755); + strcat(entries_dir_path,dirname_pipe); + create_pipe(dirname_pipe,num); + rmdir(dirname_pipe); + + /* Creating 1000 regular files and calculating the time needed for it */ + entries_dir_path = getcwd(entries_dir_path,255); + mkdir (dirname_regular_file,0755); + strcat(entries_dir_path,dirname_regular_file); + create_regular_file(dirname_regular_file,num); + rmdir(dirname_regular_file); + + return 0; +} + -- cgit