Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 21 Aug 1995 22:09:49 +1000
From:      Bruce Evans <bde@zeta.org.au>
To:        dyson@freefall.FreeBSD.org, hasty@rah.star-gate.com, rcarter@geli.com
Cc:        hackers@freebsd.org, terry@cs.weber.edu
Subject:   Re: Why Linux? (fwd)
Message-ID:  <199508211209.WAA23103@godzilla.zeta.org.au>

next in thread | raw e-mail | index | archive | help
>Curious though, I deal with low-latency networking types for a 
>(partial) living, and I have had more than one mention the 
>syscall.s in Linux as the model for syscall overhead.  Shouldn't
>this show up somewhere in user land?

Probably not.  Not many applications really need to do lots of
syscalls.

Anyway, Linux currently seems to have about the same syscall overhead
as FreeBSD.  However, vfs has much more overhead.  The "null syscall"
benchmark in lmbench for some reason (;-) tests only the speed of a
syscall that is fast under Linux.  To show that FreeBSD is better,
benchmark only gettimeofday().  The FreeBSD one is faster because we
needed microtime() to be fast for accurate system timing to be
acceptably efficient.  The Pentium version is even faster.

I measured the following a few minutes ago:

Machine		System			Benchmark	Sys Time	Load Av
---------	-----------------------	---------------	-----		-
486DX2/66	FreeBSD-2.2-current	1e6 getpid()s	 5.78		0
"		Linux-1.2.13		"		 6.91		4 (*)
486DX/33	FreeBSD-2.2-current	"		11.16		0
"		FreeBSD-2.2-current-prof"		12.93		0
486DX2/66	FreeBSD-2.2-current	1e6 setuid()s	 8.03		0
"		Linux-1.2.13		"		 7.45		6
486DX/33	FreeBSD-2.2-current	"		17.69		0
"		FreeBSD-2.2-current-prof"		19.58		0
486DX2/66	FreeBSD-2.2-current 1e6 gettimeofday()s	13.18		0
"		Linux-1.2.13		"		24.90		2
486DX/33	FreeBSD-2.2-current	"		22.10		0
"		FreeBSD-2.2-current-prof"		26.40		0
486DX2/66	FreeBSD-2.2-current	1e6 write()s (+)21.20		0
"		Linux-1.2.13		"		11.69		2
486DX/33	FreeBSD-2.2-current	"		41.13		0
"		FreeBSD-2.2-current-prof"		51.05		0

(*) The load average was measured before the test.  It shouldn't affect the
    system time much provided the system time is accurate.  The system time is
    very accurate for FreeBSD but not very accurate for Linux when there are
    a lot of context switches.

(+) The writes were of 1 byte to /dev/null.

Linux doesn't actually have syscall.s.  In 1.2.8 it has `_lcall7' and
`_system_call' in entry.S.  These have more avoidable overheads than
FreeBSD's corresponding `_Xsyscall' and `_Xlinux_syscall' in exception.s.
However, FreeBSD loses by calling relatively inefficent C routines
syscall() and linux_syscall() to dispatch the syscall, and it often loses
by having to copyin() the syscall args (Linux passes them in registers).
The copyin() overhead is enough to make FreeBSD's setuid() slightly slower
than Linux's although FreeBSD's getpid() is slightly faster.

Profiling shows FreeBSD-2.2-current overheads on a 486DX2/33 to be about:

getpid():
	_Xsyscall:	2
	_syscall:	6
	_getpid:	4
	_doreti:	3	# end of _Xsyscall
	Total sys time:	15 usec
	Total usr time:	 4 usec

setuid(myid):
	_Xsyscall:	2
	_syscall:	5
	_copyin:	5
	_setuid:	1
	_crcopy:	3
	_doreti:	3
	Total sys time:	19 usec
	Total usr time:	 5 usec

gettimeofday(&tv, (struct timezone *)NULL):
	_Xsyscall:	2
	_syscall:	5
	_copyin:	5
	_gettimeofday:	1
	_microtime:	7
	_copyout:	4
	_doreti:	3
	Total sys time:	27 usec
	Total usr time:	 5 usec

write(1, "", 1):
	_Xsyscall:	2
	_syscall:	8
	_copyin:	6
	_write:		3
	_vn_write:	2
	_ufsspec_write:	1
	_spec_write:	1
	_mmrw:		5	# too many layers
	_ufs_lock:	8 (2 calls)	# too slow and called too much
	_ufs_unlock:	6 (2 calls)	# too slow and called too much
	_doreti:	3
	Total sys time:	46 usec
	Total usr time:	 6 usec

Bruce



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199508211209.WAA23103>