[Linux-cluster] Slowness above 500 RRDs

David Teigland teigland at redhat.com
Tue Apr 24 19:46:13 UTC 2007


On Tue, Apr 24, 2007 at 02:36:00PM -0500, David Teigland wrote:
> On Mon, Apr 23, 2007 at 04:17:18PM -0500, David Teigland wrote:
> > > Also, what's that new infrastructure?  Do you mean GFS2?  I read it
> > > was not production quality yet, so I didn't mean to try it.  But again
> > > you may have got something else in your head...
> > 
> > GFS1 and GFS2 both run on the new openais-based cluster infrastructure.
> > (in the cluster-2.00.00 release, and the RHEL5 and HEAD cvs branches).
> 
> I've attached a little flock/plock performance test that emulates what
> you're doing; could you run it on your cluster and send the results?

Attached now

-------------- next part --------------
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <errno.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/file.h>
#include <fcntl.h>
#include <unistd.h>

#define die(fmt, args...) \
{ \
	fprintf(stderr, "%s: ", prog_name); \
	fprintf(stderr, fmt, ##args); \
	exit(EXIT_FAILURE); \
}

char *prog_name;
unsigned int wait = 1;
int delay;
int pid;
int files[5000];

int do_plock(int fd, unsigned long long offset, int len, int type)
{
	struct flock lock;
	int action;

	lock.l_type = type;
	lock.l_start = offset;
	lock.l_whence = SEEK_SET;
	lock.l_len = len;

	if (wait)
		action = F_SETLKW;
	else
		action = F_SETLK;

	return fcntl(fd, action, &lock);
}

void read_plock(int fd, unsigned long long offset, int len)
{
	int error;

	error = do_plock(fd, offset, len, F_RDLCK);
	if (error < 0) {
		printf("%d read lock failed %d errno %d\n", pid, error, errno);
		exit(EXIT_FAILURE);
	}
}

void write_plock(int fd, unsigned long long offset, int len)
{
	int error;

	error = do_plock(fd, offset, len, F_WRLCK);
	if (error < 0) {
		printf("%d write lock failed %d errno %d\n", pid, error, errno);
		exit(EXIT_FAILURE);
	}
}

void unlock_plock(int fd, unsigned long long offset, int len)
{
	int error;

	error = do_plock(fd, offset, len, F_UNLCK);
	if (error < 0) {
		printf("%d unlock failed %d errno %d\n", pid, error, errno);
		exit(EXIT_FAILURE);
	}
}

void read_flock(int fd)
{
	int error;
	int mode = LOCK_SH;

	if (!wait)
		mode |= LOCK_NB;

	error = flock(fd, mode);
	if (error < 0) {
		printf("%d read lock failed %d errno %d\n", pid, error, errno);
		exit(EXIT_FAILURE);
	}
}

void write_flock(int fd)
{
	int error;
	int mode = LOCK_EX;

	if (!wait)
		mode |= LOCK_NB;

	error = flock(fd, mode);
	if (error < 0) {
		printf("%d write lock failed %d errno %d\n", pid, error, errno);
		exit(EXIT_FAILURE);
	}
}

void unlock_flock(int fd)
{
	int error;

	error = flock(fd, LOCK_UN);
	if (error < 0) {
		printf("%d unlock failed %d errno %d\n", pid, error, errno);
		exit(EXIT_FAILURE);
	}
}

uint64_t dt_usec(struct timeval *start, struct timeval *stop)
{
	uint64_t dt;

	dt = stop->tv_sec - start->tv_sec;
	dt *= 1000000;
	dt += stop->tv_usec - start->tv_usec;
	return dt;
}

void file_loop(int filecount, int flock)
{
	char path[64];
	struct timeval enter, exit, begin, end;
	uint64_t et_usec;
	int x, i, fd;

	gettimeofday(&enter, NULL);
	for (x = 0; x < 5; x++) {
		gettimeofday(&begin, NULL);
		for (i = 0; i < filecount; i++) {

			memset(path, 0, sizeof(path));
			sprintf(path, "file%.10u", i);
			fd = open(path, O_RDWR, 0644);

			if (flock) {
				read_flock(fd);
				unlock_flock(fd);
			} else {
				read_plock(fd, 0, 0);
				unlock_plock(fd, 0, 0);
			}

			close(fd);
		}
		gettimeofday(&end, NULL);

		et_usec = dt_usec(&begin, &end);
		printf("%s: filecount=%d iteration=%d elapsed time=%.3f s\n",
			flock ? "flock" : "plock", filecount, x,
			(1.e-6 * et_usec));
	}
	gettimeofday(&exit, NULL);

	et_usec = dt_usec(&enter, &exit);
	printf("total elapsed time=%.3f s\n", (1.e-6 * et_usec));

	if (delay) {
		printf("%d sec delay...\n", delay);
		sleep(delay);
	}
}

void create_all(int filecount)
{
	int i, fd;
	char path[64];

	for (i = 0; i < filecount; i++) {
		memset(path, 0, sizeof(path));
		sprintf(path, "file%.10u", i);
		fd = open(path, O_RDWR | O_CREAT, 0644);
		if (fd < 0)
			die("can't create file %s\n", strerror(errno));
		close(fd);
	}
}

void open_all(int filecount)
{
	int i, fd;
	char path[64];

	for (i = 0; i < filecount; i++) {
		memset(path, 0, sizeof(path));
		sprintf(path, "file%.10u", i);
		files[i] = fd = open(path, O_RDWR | O_CREAT, 0644);
		if (fd < 0)
			die("can't create file %s\n", strerror(errno));
	}
}

void close_all(int filecount)
{
	int i;

	for (i = 0; i < filecount; i++)
		close(files[i]);
}

int main(int argc, char *argv[])
{
	pid = getpid();
	prog_name = argv[0];

	if (argc > 1)
		delay = atoi(argv[1]);

	create_all(5000);

	file_loop(100, 1);
	file_loop(500, 1);
	file_loop(1000, 1);
	file_loop(2000, 1);
	file_loop(5000, 1);

	file_loop(100, 0);
	file_loop(500, 0);
	file_loop(1000, 0);
	file_loop(2000, 0);
	file_loop(5000, 0);

	exit(EXIT_SUCCESS);
}



More information about the Linux-cluster mailing list