faster /etc/services

Edwin Groothuis edwin at mavetju.org
Mon May 21 07:27:56 UTC 2007


Hello,

After the last patch I submitted with regarding to /etc/services,
I was asked if I could see if I could do something about the speed
of it. Personally I don't worry too much about it, my programs only
access getservbyname() only once per program :-)

I did some tests with it, and at this moment you got the speed for
telnet/tcp, which lives at the beginning of /etc/services:

	telnet/tcp
	     1 times - 0.000369 seconds
	    10 times - 0.000583
	   100 times - 0.006279
	  1000 times - 0.059566
	 10000 times - 0.590499
	100000 times - 5.591417

And dbbrowse/tcp, which lives at the end of /etc/services

	dbbrowse/tcp
	     1 times - 0.001748 seconds
	    10 times - 0.011674
	   100 times - 0.117460
	  1000 times - 1.172199
	 10000 times - 11.966367
	100000 times - 120

So... what can we do?

- Instead of reading and parsing /etc/services every time, read it
  only once and use a cached version for all further getservbyxxx()
  calls. This has a startup-penalty (once per application) and a
  memory penalty, but all next calls are faster, specially for
  services at the end of /etc/services.

- Instead of reading and parsing /etc/services every time, use a
  hash or btree file a la the aliases database. A hash one (first
  key, next key) could be a replacement to use with getservent(),
  while a btree one could be be a replacement to use with getservbyname().
  This doesn't have the startup-penalty, but the sysadmin needs to
  keep track of changes in /etc/services and needs to rebuild it.

- Instead of reading and parsing /etc/services every time, open a
  socket and ask a daemon for the information. Which daemon is a
  good question, but it can automatically re-read the /etc/services
  file if it got changed.

Other things to worry(?) about are YP/NIS. From what I've seen in
getservent() is that is happily intertwined with the /etc/services
code.

Anybody with comments or suggestions from earlier threads like this?

Edwin

-- 
Edwin Groothuis      |            Personal website: http://www.mavetju.org
edwin at mavetju.org    |              Weblog: http://www.mavetju.org/weblog/


More information about the freebsd-net mailing list