xref: /freebsd/tools/test/stress2/misc/bench.sh (revision 6be3386466ab79a84b48429ae66244f21526d3df)
1#!/bin/sh
2
3#
4# Copyright (c) 2017 Dell EMC Isilon
5# All rights reserved.
6#
7# Redistribution and use in source and binary forms, with or without
8# modification, are permitted provided that the following conditions
9# are met:
10# 1. Redistributions of source code must retain the above copyright
11#    notice, this list of conditions and the following disclaimer.
12# 2. Redistributions in binary form must reproduce the above copyright
13#    notice, this list of conditions and the following disclaimer in the
14#    documentation and/or other materials provided with the distribution.
15#
16# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26# SUCH DAMAGE.
27#
28
29# "benchmark" for file system use, using no physical disk.
30
31. ../default.cfg
32[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1
33
34export LANG=C
35dir=/tmp
36odir=`pwd`
37cd $dir
38sed '1,/^EOF/d' < $odir/$0 > $dir/bench.c
39mycc -o bench -Wall -Wextra -O0 -g bench.c || exit 1
40rm -f bench.c
41cd $odir
42
43mount | grep "on $mntpoint " | grep -q /dev/md && umount -f $mntpoint
44[ -c /dev/md$mdstart ] &&  mdconfig -d -u $mdstart
45mdconfig -a -t swap -s 1g -u $mdstart || exit 1
46bsdlabel -w md$mdstart auto
47
48log=/tmp/stress2.d/bench.sh.log
49[ -f $log ] && old=`tail -1 $log | awk '{print $2}'`
50tmp=/tmp/bench.sh.tmp
51s=0
52for j in `jot 5`; do
53	newfs -n -b 4096 -f 512 -i 1024 md${mdstart}$part > \
54	    /dev/null
55	mount -o async /dev/md${mdstart}$part $mntpoint
56	/usr/bin/time sh -c "(cd $mntpoint; /tmp/bench)" 2>&1 | \
57	    awk '{print $1}'
58	[ $? -ne 0 ] && s=1
59	umount $mntpoint
60done | ministat -n | tail -1 | awk '{printf "%.3f %.3f\n",$6,$7}' > $tmp
61r=`cat $tmp`
62echo "`date +%Y%m%d%H%M` $r `uname -a`" >> $log
63tail -5 $log | cut -c 1-92
64rm $tmp
65
66if [ $old ]; then
67    awk -v old=$old -v new=$(echo $r | awk '{print $1}') \
68    'BEGIN {if ((new - old) * 100 / old > 5) exit 1; else exit 0}'
69    s=$?
70fi
71
72for i in `jot 6`; do
73	mount | grep -q "on $mntpoint " || break
74	umount $mntpoint && break || sleep 10
75done
76[ $i -eq 6 ] && exit 1
77mdconfig -d -u $mdstart
78rm -rf /tmp/bench
79exit 0
80
81EOF
82#include <sys/param.h>
83#include <sys/mman.h>
84#include <sys/stat.h>
85#include <sys/wait.h>
86
87#include <err.h>
88#include <errno.h>
89#include <fcntl.h>
90#include <stdio.h>
91#include <stdlib.h>
92#include <string.h>
93#include <time.h>
94#include <unistd.h>
95
96#define LOOPS 50000
97#define TESTS 6
98#define TIMEOUT 600
99
100static void (*functions[TESTS])();
101
102static void
103t1(void)
104{
105	int fd, i;
106	char file[128];
107
108	alarm(TIMEOUT);
109	for (i = 0; i < LOOPS; i++) {
110		if (i % 1000 == 0)
111			setproctitle("%s @ %d", __func__, i);
112		snprintf(file, sizeof(file), "t1.%06d.%03d", getpid(), i);
113		if ((fd = open(file, O_RDWR | O_CREAT | O_TRUNC,
114		    DEFFILEMODE)) == -1)
115			err(1, "open(%s)", file);
116		close(fd);
117		if (unlink(file) == -1)
118			err(1, "unlink(%s)", file);
119		usleep(100);
120	}
121	_exit(0);
122}
123
124static void
125t2(void)
126{
127	int fd, i;
128	char file[128];
129
130	alarm(TIMEOUT);
131	for (i = 0; i < LOOPS; i++) {
132		if (i % 1000 == 0)
133			setproctitle("%s @ %d", __func__, i);
134		snprintf(file, sizeof(file), "t2.%06d.%03d", getpid(), i);
135		if ((fd = open(file, O_RDWR | O_CREAT | O_TRUNC,
136		    DEFFILEMODE)) == -1)
137			err(1, "open(%s)", file);
138		close(fd);
139		usleep(100);
140	}
141	for (i = 0; i < LOOPS; i++) {
142		snprintf(file, sizeof(file), "t2.%06d.%03d", getpid(), i);
143		if (unlink(file) == -1)
144			err(1, "unlink(%s)", file);
145	}
146	_exit(0);
147}
148
149static void
150t3(void)
151{
152	int fd, i;
153	char dir[128], file[128];
154
155	alarm(TIMEOUT);
156	snprintf(dir, sizeof(dir), "t3.%06d.dir", getpid());
157	if (mkdir(dir, 700) == -1)
158		err(1, "mkdir(%s)", dir);
159	for (i = 0; i < LOOPS; i++) {
160		if (i % 1000 == 0)
161			setproctitle("%s @ %d", __func__, i);
162		snprintf(file, sizeof(file), "%s/t3.%06d.%03d", dir,
163		    getpid(), i);
164		if ((fd = open(file, O_RDWR | O_CREAT | O_TRUNC,
165		    DEFFILEMODE)) == -1)
166			err(1, "open(%s)", file);
167		close(fd);
168		if (unlink(file) == -1)
169			err(1, "unlink(%s)", file);
170		usleep(100);
171	}
172	if (rmdir(dir) == -1)
173		err(1, "rmdir(%s)", dir);
174
175	_exit(0);
176}
177
178static void
179t4(void)
180{
181	int fd, i;
182	char file[128], new[128];
183
184	alarm(TIMEOUT);
185	for (i = 0; i < LOOPS / 2; i++) {
186		if (i % 1000 == 0)
187			setproctitle("%s @ %d", __func__, i);
188		snprintf(file, sizeof(file), "t4.%06d.%03d", getpid(), i);
189		if ((fd = open(file, O_RDWR | O_CREAT | O_TRUNC,
190		    DEFFILEMODE)) == -1)
191			err(1, "open(%s)", file);
192		close(fd);
193		snprintf(new, sizeof(new), "t4.%06d.%03d.new", getpid(), i);
194		if (rename(file, new) == -1)
195			err(1, "rename(%s, %s)", file, new);
196		if (unlink(new) == -1)
197			err(1, "unlink(%s)", new);
198		usleep(100);
199	}
200	_exit(0);
201}
202
203static void
204t5(void)
205{
206	int fd, i;
207	char buf[512], file[128];
208
209	alarm(TIMEOUT);
210	memset(buf, 0, sizeof(buf));
211	for (i = 0; i < LOOPS; i++) {
212		if (i % 1000 == 0)
213			setproctitle("%s @ %d", __func__, i);
214		snprintf(file, sizeof(file), "t5.%06d.%03d", getpid(), i);
215		if ((fd = open(file, O_RDWR | O_CREAT | O_TRUNC,
216		    DEFFILEMODE)) == -1)
217			err(1, "open(%s)", file);
218		if (write(fd, buf, sizeof(buf)) != sizeof(buf))
219			err(1, "write(%s)", file);
220		close(fd);
221		if (unlink(file) == -1)
222			err(1, "unlink(%s)", file);
223		usleep(100);
224	}
225	_exit(0);
226}
227
228static void
229t6(void)
230{
231	int fd, i;
232	char buf[512], file[128];
233
234	alarm(TIMEOUT);
235	memset(buf, 0, sizeof(buf));
236	for (i = 0; i < LOOPS / 2; i++) {
237		if (i % 1000 == 0)
238			setproctitle("%s/write @ %d", __func__, i);
239		snprintf(file, sizeof(file), "t6.%06d.%03d", getpid(), i);
240		if ((fd = open(file, O_RDWR | O_CREAT | O_TRUNC,
241		    DEFFILEMODE)) == -1)
242			err(1, "open(%s)", file);
243		if (write(fd, buf, sizeof(buf)) != sizeof(buf))
244			err(1, "write(%s)", file);
245		close(fd);
246	}
247	for (i = 0; i < LOOPS / 2; i++) {
248		if (i % 1000 == 0)
249			setproctitle("%s/read @ %d", __func__, i);
250		snprintf(file, sizeof(file), "t6.%06d.%03d", getpid(), i);
251		if ((fd = open(file, O_RDONLY)) == -1)
252			err(1, "open(%s)", file);
253		if (read(fd, buf, sizeof(buf)) != sizeof(buf))
254			err(1, "write(%s)", file);
255		close(fd);
256		usleep(100);
257	}
258	for (i = 0; i < LOOPS / 2; i++) {
259		snprintf(file, sizeof(file), "t6.%06d.%03d", getpid(), i);
260		if (unlink(file) == -1)
261			err(1, "unlink(%s)", file);
262	}
263	_exit(0);
264}
265
266static int
267test(void)
268{
269	pid_t pids[TESTS];
270	int e, i, status;
271
272	e = 0;
273	for (i = 0; i < TESTS; i++)
274		if ((pids[i] = fork()) == 0)
275			functions[i]();
276	for (i = 0; i < TESTS; i++) {
277		if (waitpid(pids[i], &status, 0) != pids[i])
278			err(1, "waitpid(%d)", pids[i]);
279		e += status != 0;
280	}
281
282	return (e);
283}
284
285int
286main(void)
287{
288	int e;
289
290	functions[0] = &t1;
291	functions[1] = &t2;
292	functions[2] = &t3;
293	functions[3] = &t4;
294	functions[4] = &t5;
295	functions[5] = &t6;
296
297	e = test();
298
299	return (e);
300}
301