diff options
Diffstat (limited to 'src/pmieconf/rate-syscalls.c')
-rw-r--r-- | src/pmieconf/rate-syscalls.c | 140 |
1 files changed, 140 insertions, 0 deletions
diff --git a/src/pmieconf/rate-syscalls.c b/src/pmieconf/rate-syscalls.c new file mode 100644 index 0000000..eb7643e --- /dev/null +++ b/src/pmieconf/rate-syscalls.c @@ -0,0 +1,140 @@ +/* + * Copyright (c) 2010 Silicon Graphics, Inc. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + */ + +#include "pmapi.h" +#include "impl.h" + +/* + * test program to calibrate system call rates ... just compile + * and run: + * $ make rate-syscalls + * $ ./rate-syscalls + * + * useful for *cpu/syscall rules + */ + +int +main() +{ + int fd; + int i; + int n; + int c; + struct timeval now; + struct timeval then; + struct timeval eek; + double delta; + struct hostent *servInfo; + int s; + struct sockaddr_in myAddr; + struct linger noLinger = {1, 0}; + int scale = 2; + + __pmtimevalNow(&then); + n = 600000 * scale; + for (i = 0; i < n; i++) + getpid(); + __pmtimevalNow(&now); + delta = now.tv_sec - then.tv_sec + + (double)(now.tv_usec - then.tv_usec) / 1000000; + printf("getpid()\t\t\t- %9d syscalls/sec [%.2f sec]\n", + (int)(0.5 + n / delta), delta); + + __pmtimevalNow(&then); + n = 300000 * scale; + for (i = 0; i < n; i++) + __pmtimevalNow(&eek); + __pmtimevalNow(&now); + delta = now.tv_sec - then.tv_sec + + (double)(now.tv_usec - then.tv_usec) / 1000000; + printf("gettimeofday()\t\t\t- %9d syscalls/sec [%.2f sec]\n", + (int)(0.5 + n / delta), delta); + + fd = open("/dev/null", 0); + n = 150000 * scale; + __pmtimevalNow(&then); + for (i = 0; i < n; i++) { + /* expect EOF */ + read(fd, &c, 1); + } + __pmtimevalNow(&now); + delta = now.tv_sec - then.tv_sec + + (double)(now.tv_usec - then.tv_usec) / 1000000; + printf("read() at end of file\t\t- %9d syscalls/sec [%.2f sec]\n", + (int)(0.5 + n / delta), delta); + close(fd); + + fd = open("/dev/null", 0); + n = 400000 * scale; + __pmtimevalNow(&then); + for (i = 0; i < n; i++) { + lseek(fd, 0L, 0); + } + __pmtimevalNow(&now); + delta = now.tv_sec - then.tv_sec + + (double)(now.tv_usec - then.tv_usec) / 1000000; + printf("lseek() to start of file\t- %9d syscalls/sec [%.2f sec]\n", + (int)(0.5 + n / delta), delta); + close(fd); + + unlink("/tmp/creat-clo"); + n = 20000 * scale; + __pmtimevalNow(&then); + for (i = 0; i < n; i++) { + if ((fd = creat("/tmp/creat-clo", 0644)) < 0) { + fprintf(stderr, "creat: %s\n", osstrerror()); + exit(1); + } + close(fd); + } + __pmtimevalNow(&now); + delta = now.tv_sec - then.tv_sec + + (double)(now.tv_usec - then.tv_usec) / 1000000; + printf("file creat() and close()\t- %9d syscalls/sec [%.2f sec]\n", + (int)(0.5 + 2*n / delta), delta); + unlink("/tmp/creat-clo"); + + servInfo = gethostbyname("localhost"); + memset(&myAddr, 0, sizeof(myAddr)); + myAddr.sin_family = AF_INET; + memcpy(&myAddr.sin_addr, servInfo->h_addr, servInfo->h_length); + myAddr.sin_port = htons(80); + n = 4000 * scale; + __pmtimevalNow(&then); + for (i = 0; i < n; i++) { + + if ((s = socket(AF_INET, SOCK_STREAM, 0)) < 0) { + fprintf(stderr, "socket: %s\n", netstrerror()); + exit(1); + } + + if (setsockopt(fd, SOL_SOCKET, SO_LINGER, (char *) &noLinger, sizeof(noLinger)) < 0) { + fprintf(stderr, "setsockopt(SO_LINGER): %s\n", netstrerror()); + exit(1); + } + + if (connect(s, (struct sockaddr*) &myAddr, sizeof(myAddr)) < 0) { + fprintf(stderr, "connect: %s\n", netstrerror()); + exit(1); + } + close(s); + } + __pmtimevalNow(&now); + delta = now.tv_sec - then.tv_sec + + (double)(now.tv_usec - then.tv_usec) / 1000000; + printf("socket(), connect() and close()\t- %9d syscalls/sec [%.2f sec]\n", + (int)(0.5 + 3*n / delta), delta); + + return 0; +} |