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