// Load testing utility for Citadel Server
//
-// Copyright (c) 1987-2023 by the citadel.org team
+// Copyright (c) 1987-2024 by the citadel.org team
//
// This program is open source software. Use, duplication, or disclosure
// is subject to the terms of the GNU General Public License, version 3.
int nrooms = sizeof(random_rooms) / sizeof(char *);
char *test_user = "Load Test User";
char test_pass[16];
+time_t time_started;
+volatile int ops_completed;
// These are our randomized load test operations: an even mix of changing rooms, posting messages, and deleting messages.
serv_gets(serv_sock, buf);
} while ( (buf[0] != '2') && (total_msgs > 0));
}
-
}
+#define ROW_OFFSET 8
// This is the main loop. We log in as the load test user, and then perform random operations until stopped.
void *loadtest(void *pointer_to_thread_id) {
serv_gets(serv_sock, buf);
// Find a nice spot on the screen to show the operation count for this thread.
- int row = 10 + (thread_id % 20);
+ int row = ROW_OFFSET + (thread_id % 20);
int col = (thread_id / 20) * 10;
long ops = 0;
printf("\033[%d;%dH\033[33m 0\033[0m", row, col);
while(1) {
perform_random_thing(serv_sock);
printf("\033[%d;%dH\033[32m%8ld\033[0m", row, col, ++ops);
+ ++ops_completed; // this is declared "volatile" so we don't need to lock it
+ if (thread_id == 0) {
+ // FIXME the following line produces a divide by zero error on fast machines --- ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
+ printf("\033[2;55H\033[44m\033[33m\033[1m%ld ops/sec \033[0m", (ops_completed / (time(NULL) - time_started)));
+ }
fflush(stdout);
}
}
// Main loop. Do things and have fun.
int main(int argc, char **argv) {
int i;
- int nthreads = 3;
+ int nthreads = 10;
int row, col;
- fprintf(stderr, "\033[2J\033[H"
- "\033[44m\033[33m\033[1m \033[K\033[0m\n"
- "\033[44m\033[33m\033[1m Load testing utility for Citadel \033[K\033[0m\n"
- "\033[44m\033[33m\033[1m Copyright (c) 2023 by citadel.org et al. \033[K\033[0m\n"
- "\033[44m\033[33m\033[1m This program is open source software. Use, duplication, or disclosure \033[K\033[0m\n"
- "\033[44m\033[33m\033[1m is subject to the terms of the GNU General Public license v3. \033[K\033[0m\n"
- "\033[44m\033[33m\033[1m \033[K\033[0m\n");
+ fprintf(stderr, "\033[2J\033[H\033[44m\033[1m"
+ "╔════════════════════════════════════════════════════════════════════════╗\n"
+ "║ Load testing utility for Citadel ║\n"
+ "║ Copyright (c) 2023-2024 by citadel.org et al. ║\n"
+ "║ This program is open source software. Use, duplication, or disclosure ║\n"
+ "║ is subject to the terms of the GNU General Public license v3. ║\n"
+ "╚════════════════════════════════════════════════════════════════════════╝\033[0m\n"
+ );
// Parse command line
while ((i = getopt(argc, argv, "h:n:")) != EOF) {
// paint the screen
for (i=0; i<nthreads; ++i) {
- row = 10 + (i % 20);
+ row = ROW_OFFSET + (i % 20);
col = (i / 20) * 10;
printf("\033[%d;%dH\033[31m -\033[0m", row, col);
fflush(stdout);
threadId[i] = i;
}
+ time_started = time(NULL);
+ ops_completed = 0;
+
for (i=1; i<nthreads; ++i) {
pthread_t thread;