faster /etc/services

Niki Denev niki at totalterror.net
Mon May 21 08:16:08 UTC 2007


Edwin Groothuis wrote:
> 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
> 

I think there is cached(8) daemon in -current that does exactly this,
and more. Dunno if it will get in -stable.

--niki


More information about the freebsd-net mailing list