summaryrefslogtreecommitdiff
path: root/src/pmieconf/rate-syscalls.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/pmieconf/rate-syscalls.c')
-rw-r--r--src/pmieconf/rate-syscalls.c140
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;
+}