18a272653SPeter Holm#!/bin/sh 28a272653SPeter Holm 38a272653SPeter Holm# 48a272653SPeter Holm# Copyright (c) 2014 EMC Corp. 58a272653SPeter Holm# All rights reserved. 68a272653SPeter Holm# 78a272653SPeter Holm# Redistribution and use in source and binary forms, with or without 88a272653SPeter Holm# modification, are permitted provided that the following conditions 98a272653SPeter Holm# are met: 108a272653SPeter Holm# 1. Redistributions of source code must retain the above copyright 118a272653SPeter Holm# notice, this list of conditions and the following disclaimer. 128a272653SPeter Holm# 2. Redistributions in binary form must reproduce the above copyright 138a272653SPeter Holm# notice, this list of conditions and the following disclaimer in the 148a272653SPeter Holm# documentation and/or other materials provided with the distribution. 158a272653SPeter Holm# 168a272653SPeter Holm# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 178a272653SPeter Holm# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 188a272653SPeter Holm# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 198a272653SPeter Holm# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 208a272653SPeter Holm# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 218a272653SPeter Holm# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 228a272653SPeter Holm# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 238a272653SPeter Holm# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 248a272653SPeter Holm# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 258a272653SPeter Holm# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 268a272653SPeter Holm# SUCH DAMAGE. 278a272653SPeter Holm# 288a272653SPeter Holm 298a272653SPeter Holm[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1 308a272653SPeter Holm 318a272653SPeter Holm# Show scheduler fairness for ULE vs. 4BSD. 328a272653SPeter Holm 338a272653SPeter Holm. ../default.cfg 348a272653SPeter Holm 358a272653SPeter Holmhere=`pwd` 368a272653SPeter Holmcd /tmp 378a272653SPeter Holmsed '1,/^EOF/d' < $here/$0 > sched.c 388a272653SPeter Holmmycc -o sched -Wall -Wextra -O0 sched.c || exit 1 398a272653SPeter Holmrm -f sched.c 408a272653SPeter Holmcd $here 418a272653SPeter Holm 428a272653SPeter Holmmount | grep $mntpoint | grep -q /dev/md && umount -f $mntpoint 438a272653SPeter Holmmdconfig -l | grep -q md$mdstart && mdconfig -d -u $mdstart 448a272653SPeter Holm 458a272653SPeter Holmmdconfig -a -t swap -s 1g -u $mdstart || exit 1 46*608c97bfSPeter Holmnewfs $newfs_flags md$mdstart > /dev/null 47*608c97bfSPeter Holmmount /dev/md$mdstart $mntpoint 488a272653SPeter Holmchmod 777 $mntpoint 498a272653SPeter Holm 508a272653SPeter Holmcpus=`sysctl hw.ncpu | sed 's/.*: //'` 518a272653SPeter Holmuname -v 528a272653SPeter Holm(cd $mntpoint; /tmp/sched $((cpus + 1))) > /dev/null 2>&1 & 538a272653SPeter Holmsleep 30 548a272653SPeter Holmexport LANG=C 558a272653SPeter Holmtop -U nobody -d 1 | grep nobody | awk '{print $11}' | sed 's/%//' | 568a272653SPeter Holm ministat -A -w 73 | tail -1 | awk '{if ($NF > 1.0) exit 1}' || 578a272653SPeter Holm{ echo Broken; top -U nobody -d 1 | grep nobody; } 588a272653SPeter Holmkillall sched 598a272653SPeter Holmwait 608a272653SPeter Holm 618a272653SPeter Holmfor i in `jot 3`; do 628a272653SPeter Holm echo "run #$i" 638a272653SPeter Holm (cd $mntpoint; /tmp/sched $((cpus + 1))) 648a272653SPeter Holmdone 658a272653SPeter Holm 668a272653SPeter Holmwhile mount | grep $mntpoint | grep -q /dev/md; do 678a272653SPeter Holm umount $mntpoint || sleep 1 688a272653SPeter Holmdone 698a272653SPeter Holmrm -f /tmp/sched 708a272653SPeter Holmmdconfig -d -u $mdstart 718a272653SPeter Holmexit 728a272653SPeter HolmEOF 738a272653SPeter Holm#include <sys/param.h> 748a272653SPeter Holm#include <sys/stat.h> 758a272653SPeter Holm#include <sys/time.h> 768a272653SPeter Holm#include <sys/wait.h> 778a272653SPeter Holm 788a272653SPeter Holm#include <err.h> 798a272653SPeter Holm#include <errno.h> 808a272653SPeter Holm#include <fcntl.h> 818a272653SPeter Holm#include <fts.h> 828a272653SPeter Holm#include <libutil.h> 838a272653SPeter Holm#include <pwd.h> 848a272653SPeter Holm#include <sched.h> 858a272653SPeter Holm#include <stdint.h> 868a272653SPeter Holm#include <stdio.h> 878a272653SPeter Holm#include <stdlib.h> 888a272653SPeter Holm#include <string.h> 898a272653SPeter Holm#include <unistd.h> 908a272653SPeter Holm 918a272653SPeter Holm#define N 100 * 1024 * 1024 928a272653SPeter Holm 938a272653SPeter Holmdouble r; 948a272653SPeter Holmint parallel; 958a272653SPeter Holm 968a272653SPeter Holmvoid 978a272653SPeter Holmwork(void) 988a272653SPeter Holm{ 998a272653SPeter Holm struct passwd *pw; 1008a272653SPeter Holm struct timespec start, finish; 1018a272653SPeter Holm double d1, d2; 1028a272653SPeter Holm int i, j; 1038a272653SPeter Holm volatile char *cp; 1048a272653SPeter Holm 1058a272653SPeter Holm while (access("rendezvous", R_OK) != 0) 1068a272653SPeter Holm usleep(1); 1078a272653SPeter Holm 1088a272653SPeter Holm if ((pw = getpwnam("nobody")) == NULL) 1098a272653SPeter Holm err(1, "no such user: nobody"); 1108a272653SPeter Holm if (setgroups(1, &pw->pw_gid) || 1118a272653SPeter Holm setegid(pw->pw_gid) || setgid(pw->pw_gid) || 1128a272653SPeter Holm seteuid(pw->pw_uid) || setuid(pw->pw_uid)) 1138a272653SPeter Holm err(1, "Can't drop privileges to \"nobody\""); 1148a272653SPeter Holm endpwent(); 1158a272653SPeter Holm 1168a272653SPeter Holm d1 = d2 = 0; 1178a272653SPeter Holm cp = malloc(N); 1188a272653SPeter Holm clock_gettime(CLOCK_REALTIME_PRECISE, &start); 1198a272653SPeter Holm for (i = 0; i < 1; i++) { 1208a272653SPeter Holm for (j = 0; j < INT_MAX; j++) { 1218a272653SPeter Holm d1 = d1 + 1.0 / j; 1228a272653SPeter Holm d2 = d1 + 0.8 / j; 1238a272653SPeter Holm if (j % 1000 == 0) { 1248a272653SPeter Holm cp[arc4random() % N] = j % 255; 1258a272653SPeter Holm } 1268a272653SPeter Holm } 1278a272653SPeter Holm } 1288a272653SPeter Holm r = d1 + d2; 1298a272653SPeter Holm clock_gettime(CLOCK_REALTIME_PRECISE, &finish); 1308a272653SPeter Holm timespecsub(&finish, &start, &finish); 1318a272653SPeter Holm#if defined(DEBUG) 1328a272653SPeter Holm fprintf(stderr, "Elapsed time for pid %d: %.4f\n", getpid(), 1338a272653SPeter Holm finish.tv_sec + (double)finish.tv_nsec / 1e9); 1348a272653SPeter Holm#endif 1358a272653SPeter Holm 1368a272653SPeter Holm _exit(0); 1378a272653SPeter Holm} 1388a272653SPeter Holm 1398a272653SPeter Holmint 1408a272653SPeter Holmmain(int argc, char **argv) 1418a272653SPeter Holm{ 1428a272653SPeter Holm int fd, i; 1438a272653SPeter Holm 1448a272653SPeter Holm if (argc == 2) 1458a272653SPeter Holm parallel = atoi(argv[1]); 1468a272653SPeter Holm else 1478a272653SPeter Holm errx(1, "Usage: %s <cpus>", argv[0]); 1488a272653SPeter Holm 1498a272653SPeter Holm for (i = 0; i < parallel; i++) { 1508a272653SPeter Holm if (fork() == 0) 1518a272653SPeter Holm work(); 1528a272653SPeter Holm } 1538a272653SPeter Holm if ((fd = open("rendezvous", O_CREAT, 0644)) == -1) 1548a272653SPeter Holm err(1, "open()"); 1558a272653SPeter Holm close(fd); 1568a272653SPeter Holm for (i = 0; i < parallel; i++) 1578a272653SPeter Holm wait(NULL); 1588a272653SPeter Holm 1598a272653SPeter Holm return (0); 1608a272653SPeter Holm} 161