Benchmark debugging output / scalability fixes.

This commit is contained in:
Sears Russell 2005-03-21 08:03:45 +00:00
parent a262d338e9
commit b26105e76f
6 changed files with 219 additions and 34 deletions

145
ChangeLog
View file

@ -1,3 +1,148 @@
2005-03-14 sears@euglenoid <sears@euglenoid>
* linearHashNTA.h:
This commit breaks the build so that Jimmy and I can sync. Sorry. :(
2005-03-10 sears@euglenoid <sears@euglenoid>
* linearHashNTA.h:
Fixed unit tests, added iterator interface, and generic (almost) iterator test harness.
2005-03-02 sears@euglenoid <sears@euglenoid>
* linearHashNTA.h, linkedListNTA.h: Compiles on FreeBSD!
2005-03-01 sears@euglenoid <sears@euglenoid>
* noop.h: Bugfixes for OASYS.
2005-02-24 sears@euglenoid <sears@euglenoid>
* alloc.h, pageOrientedListNTA.h:
Fixeds cht test / finished error checking within LLADD, but haven't tested error handling yet.
2005-02-22 sears@euglenoid <sears@euglenoid>
* linkedListNTA.h: Error handling for linked list.
* linearHashNTA.h, pageOperations.h, pageOrientedListNTA.h, arrayList.h:
More error handling...
2005-02-16 sears@euglenoid <sears@euglenoid>
* linearHashNTA.h, set.h: Started adding error handling code to LLADD.
2005-01-31 sears@euglenoid <sears@euglenoid>
* pageOrientedListNTA.h: Bugfix for pageOrientedList.
2005-01-29 sears@euglenoid <sears@euglenoid>
* pageOrientedListNTA.h:
Re-implemented pageOrientedListNTA from scratch. It's now more flexible, but relies on features that are not provided by Talloc/Tdealloc, so performance isn't as good as it could be.
2005-01-28 sears@euglenoid <sears@euglenoid>
* linearHashNTA.h, pageOrientedListNTA.h:
Working, but slow and non-concurrent variable length key/value support for linear hashtable.
* alloc.h, pageOrientedListNTA.h:
Implemented pageOrientedList, also did some bug fixing, and added some support functions to alloc.c
2005-01-21 sears@euglenoid <sears@euglenoid>
* linearHashNTA.h, prepare.h, alloc.h: More documentation updates.
2005-01-20 sears@euglenoid <sears@euglenoid>
* noop.h, pageOperations.h, prepare.h, set.h, increment.h, instantSet.h, linearHash.h, linearHashNTA.h, linkedListNTA.h, lladdhash.h, naiveLinearHash.h, nestedTopActions.h, alloc.h, arrayList.h, decrement.h:
Documentation update.
2005-01-15 sears@euglenoid <sears@euglenoid>
* linearHashNTA.h, nestedTopActions.h:
- linkedListNTA is now re-entrant.
- linearHashNTA now uses nested top actions, is re-entrant, and supports a
non-re-entrant iterator
- 'recursive' nested top actions allow nested top actions to be nested within each
other.
2005-01-14 sears@euglenoid <sears@euglenoid>
* linkedListNTA.h, nestedTopActions.h:
The linked list implementation now uses nested top actions. (Also, many bugfixes regarding nested top actions were introduced.)
* linearHash.h, linearHashNTA.h, linkedListNTA.h, naiveLinearHash.h:
Working, non-concurrent linear hash and linked list implementations.
The idea is to implement the non-concurrent versions, and then convert
them to concurrent versions using nested top actions.
2005-01-10 sears@euglenoid <sears@euglenoid>
* naiveLinearHash.h:
Starting to rip the old jbhash implementation out, and replace it with a
linear hash implementation. In particular, I've implemented (sort of) an
iterator for linear hash, and (sort of) ported libdfa to linearhash.c
I say 'sort of' since this functionality is broken with this commit. On the other hand, CVS should build now, and the tests under lladd will pass. libdfa's new tests don't pass at the moment.
2004-12-03 sears@euglenoid <sears@euglenoid>
* set.h: Implemented TsetRange, fixed bug in linear hash.
2004-12-01 sears@euglenoid <sears@euglenoid>
* alloc.h: Implemented TrecordType()
2004-11-29 sears@euglenoid <sears@euglenoid>
* nestedTopActions.h:
Support for nested top actions, with simple unit test. (Haven't tested for thread safety yet.)
* naiveLinearHash.h:
Implemented recover_split(), which is needed by the linear hash to recover properly from crashes. It hasn't been tested at all, and is not currently called by anything.
2004-11-28 sears@euglenoid <sears@euglenoid>
* naiveLinearHash.h: Did some misc. cleanup work on linearHash
2004-10-20 sears@euglenoid <sears@euglenoid>
* linearHash.h:
Starting work on the actual graph-generation portion of the benchmarks. :)
2004-10-19 sears@euglenoid <sears@euglenoid>
* arrayList.h, linearHash.h, naiveLinearHash.h:
Lots of optimizations; re-did on-disk layout for the linear hash table.
2004-10-18 sears@euglenoid <sears@euglenoid>
* arrayList.h, linearHash.h, naiveLinearHash.h:
Preliminary version of logical logging linear hash. (No latching yet, and there are some bugs re-opening a closed hash.)
2004-10-17 sears@euglenoid <sears@euglenoid>
* linearHash.h:
Optimized the 'naive' linear hash table, and moved to sourceforge. :)
2004-10-12 sears@euglenoid <sears@euglenoid>
* linearHash.h:
Implemented a linear hash from scratch. Concurrency hasn't been done, but it's probably correct in the single thread case.
2004-10-06 sears@euglenoid <sears@euglenoid>
* arrayList.h:
Implemented pages that store fixed sized records efficiently, and a java-style ArrayList data structure that efficiently supports (relatively) clustered, O(1) access time expandable arrays. (This will be used for the hash implementation...)
2004-10-02 sears@euglenoid <sears@euglenoid>
* alloc.h, instantSet.h, noop.h, prepare.h:
Added test cases for Tprepare(), implemented some redo-only operations, and started to clean up record allocation/deallocation.
Also, numerous bugfixes.
2004-10-02 sears@euglenoid <sears@euglenoid>
* alloc.h, instantSet.h, noop.h, prepare.h:

View file

@ -107,6 +107,8 @@ main(int argc, char *argv[])
db->close(db, 0);
dbenv->close(dbenv, 0);
printf("committed %d times, put %d times\n", commitCount, putCount);
return (0);
}

View file

@ -31,6 +31,20 @@ int max_active = 0;
pthread_cond_t never;
pthread_mutex_t mutex;
void addTimespec(struct timespec * ts, long nsec) {
ts->tv_nsec += nsec;
// 0123456789
if(ts->tv_nsec > 1000000000) {
ts->tv_nsec -= 1000000000;
ts->tv_sec ++;
}
}
double thread_requests_per_sec = 10.0;
int alwaysCommit;
int num_xact;
int insert_per_xact;
void * runThread(void * arg);
@ -43,7 +57,7 @@ main(int argc, char *argv[])
assert(argc == 3 || argc == 4);
int alwaysCommit = (argc == 4);
alwaysCommit = (argc == 4);
/* threads have static thread sizes. Ughh. */
pthread_attr_t attr;
@ -65,11 +79,15 @@ main(int argc, char *argv[])
int r;
int num_threads = atoi(argv[1]);
thread_requests_per_sec = (double) atoi(argv[2]);
printf("%d %f\n", num_threads, thread_requests_per_sec);
if(alwaysCommit) {
num_xact = atoi(argv[2]);
num_xact = 10.0 * thread_requests_per_sec;//atoi(argv[2]);
insert_per_xact = 1;
} else {
abort();
num_xact = 1;
insert_per_xact = atoi(argv[2]);
}
@ -99,10 +117,12 @@ main(int argc, char *argv[])
int k;
double log_multiplier = (COUNTER_RESOLUTION / log(MAX_SECONDS * 1000000000.0));
int total = 0;
for(k = 0; k < COUNTER_RESOLUTION; k++) {
printf("%3.4f\t%d\n", exp(((double)k)/log_multiplier)/1000000000.0, buckets[k]);
total += buckets[k];
}
printf("Total requests: %d\n", total);
db->close(db, 0);
dbenv->close(dbenv, 0);
@ -170,8 +190,9 @@ void * runThread(void * arg) {
if(bucket >= COUNTER_RESOLUTION) { bucket = COUNTER_RESOLUTION - 1; }
timeout.tv_sec++;
addTimespec(&timeout, 1000000000.0 / thread_requests_per_sec);
pthread_mutex_lock(&mutex);
// timeout.tv_sec++;
buckets[bucket]++;
pthread_cond_timedwait(&never, &mutex, &timeout);
pthread_mutex_unlock(&mutex);

View file

@ -2,6 +2,8 @@
DB_ENV *dbenv;
DB *db_cats;
int commitCount = 0;
int putCount = 0;
void
env_dir_create()
{
@ -271,36 +273,38 @@ retry: /* Begin the transaction. */
// pthread_mutex_lock(&hack);
switch (ret = db->put(db, tid, &key, &data, 0)) {
case 0:
break;
case DB_LOCK_DEADLOCK:
// va_end(ap);
abort(); // Locking should be disabled!
/* Deadlock: retry the operation. */
if ((ret = dbc->c_close(dbc)) != 0) {
dbenv->err(
dbenv, ret, "dbc->c_close");
exit (1);
case 0:
break;
case DB_LOCK_DEADLOCK:
// va_end(ap);
abort(); // Locking should be disabled!
/* Deadlock: retry the operation. */
if ((ret = dbc->c_close(dbc)) != 0) {
dbenv->err(
dbenv, ret, "dbc->c_close");
exit (1);
}
if ((ret = tid->abort(tid)) != 0) {
dbenv->err(dbenv, ret, "DB_TXN->abort");
exit (1);
}
if ((ret = tid->abort(tid)) != 0) {
dbenv->err(dbenv, ret, "DB_TXN->abort");
exit (1);
}
goto retry;
default:
/* Error: run recovery. */
dbenv->err(dbenv, ret, "dbc->put: %d/%d", q, q);
abort(); // Error invalidates benchmark!
exit (1);
}
goto retry;
default:
/* Error: run recovery. */
dbenv->err(dbenv, ret, "dbc->put: %d/%d", q, q);
abort(); // Error invalidates benchmark!
exit (1);
}
// pthread_mutex_unlock(&hack);
putCount++;
}
if ((ret = tid->commit(tid, 0)) != 0) {
dbenv->err(dbenv, ret, "DB_TXN->commit");
exit (1);
}
commitCount++;
#ifdef DEBUG_BDB
printf("Called commit\n");
#endif

View file

@ -21,6 +21,10 @@
int activeThreads = 0;
int max_active = 0;
int alwaysCommit;
int commitCount = 0;
int putCount = 0;
/*
double avg_var = 0;
double max_var = 0;
@ -57,7 +61,7 @@ static void * go (void * arg_ptr) {
// gettimeofday(&start, NULL);
ThashInsert(xid, hash, (byte*)&j, sizeof(int), (byte*)&j, sizeof(int));
putCount++;
/* gettimeofday(&endtime, NULL);
double microSecondsPassed = 1000000 * (endtime.tv_sec - start.tv_sec);
@ -72,6 +76,7 @@ static void * go (void * arg_ptr) {
if(alwaysCommit) {
// printf("Commit");
commitCount++;
Tcommit(xid);
xid = Tbegin();
@ -161,4 +166,6 @@ int main(int argc, char** argv) {
}
Tdeinit();
printf("Committed %d times, put %d times.\n", commitCount, putCount);
}

View file

@ -11,7 +11,7 @@
pthread_cond_t never;
pthread_mutex_t mutex;
double thread_requests_per_sec = 1.0;
double thread_requests_per_sec = 10.0;
int alwaysCommit;
#define MAX_SECONDS 100
@ -190,15 +190,19 @@ int main(int argc, char** argv) {
assert(argc == 4);
int thread_count = atoi(argv[1]);
count = atoi(argv[2]);
int thread_count = atoi(argv[1]) ;
// count = atoi(argv[2]);
thread_requests_per_sec = (double)(atoi(argv[2]));
count = 10.0 * thread_requests_per_sec;
alwaysCommit = atoi(argv[3]);
unlink("storefile.txt");
printf("%d %f\n", thread_count, thread_requests_per_sec);
/* unlink("storefile.txt");
unlink("logfile.txt");
unlink("blob0_file.txt");
unlink("blob1_file.txt");
unlink("blob1_file.txt"); */
int l;
@ -243,12 +247,14 @@ int main(int argc, char** argv) {
double log_multiplier = (COUNTER_RESOLUTION / log(MAX_SECONDS * 1000000000.0));
int total = 0;
for(k = 0; k < COUNTER_RESOLUTION; k++) {
printf("%3.4f\t%d\n", exp(((double)k)/log_multiplier)/1000000000.0, buckets[k]);
total += buckets[k];
}
printf("Total requests %d\n", total);
/* printf("mean: (max, avg) %f, %f\n", max_mean, avg_mean / (double)thread_count);
printf("variance: (max, avg) %f, %f\n", max_var, avg_var / (double)thread_count); */