#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <pthread.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/time.h>
int numthreads = 128;
size_t filesize = 2000L * 1024 * 1024 * 1024; /* Bytes */
size_t blocksize = 16L*1024; /* Bytes */
int interval=1;
size_t align = 512;
#define FNAME "/dev/sda3"
/* Statistics */
unsigned long writes;
pthread_mutex_t writes_mutex = PTHREAD_MUTEX_INITIALIZER;
int fd;
char* data;
double inline microtime() {
struct timeval tv;
gettimeofday(&tv, NULL);
return (double)tv.tv_sec + (double)tv.tv_usec/(1000*1000);
}
void * writer(void *x) {
unsigned ctx = (unsigned)pthread_self();
int n=0;
while (++n) {
off_t offset = (rand_r(&ctx) * blocksize) % filesize;
*data=rand_r(&ctx);
pread64(fd,data,blocksize,offset);
pthread_mutex_lock(&writes_mutex);
writes++;
pthread_mutex_unlock(&writes_mutex);
}
}
int main(int ac, char ** av) {
double start, elapsed;
pthread_t *threads;
int i;
fd = open(FNAME, O_CREAT|O_RDWR|O_DIRECT|O_LARGEFILE, 0644);
lseek(fd,0,SEEK_SET);
//unlink(FNAME);
data= (char *)malloc(blocksize+align);
memset(data, 105, blocksize);
data += align - ((unsigned long)data % align);
start=microtime();
// for (i = filesize/blocksize; i-- ; )
// write(fd,data,blocksize);
elapsed=microtime()-start;
printf("Initialized %llu bytes in %.2f seconds (%.2f MB/s)\n", filesize, elapsed, (double)filesize/(1024*1024*(elapsed)));
threads = (pthread_t *)malloc(sizeof(pthread_t)*numthreads);
for (i = numthreads; numthreads--; ) {
pthread_create(&threads[i],NULL,writer,NULL);
}
unsigned long long written=0;
while(1) {
sleep(interval);
pthread_mutex_lock(&writes_mutex);
written=writes; writes=0;
pthread_mutex_unlock(&writes_mutex);
printf("Writing at: %.f MB/s (%d tps)\n", (double)(written*blocksize/(interval*1024*1024)), (int)written/interval);
}
}