Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 21 May 2007 17:24:09 +0400
From:      Michael Bushkov <bushman@freebsd.org>
To:        freebsd-net@freebsd.org
Cc:        Edwin Groothuis <edwin@mavetju.org>, Anton Yuzhaninov <citrin@citrin.ru>
Subject:   Re: faster /etc/services
Message-ID:  <46519D79.7050306@freebsd.org>
In-Reply-To: <20070521120021.926FE16A46D@hub.freebsd.org>
References:  <20070521120021.926FE16A46D@hub.freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
Hi,
As far as I remember this topic has been already discussed.

There are basically 2 ways of speeding up /etc/services queries:
1. To use /etc/passwd-/pwd.db scheme - i.e. using BDB as the main data 
storage and allowing user to update it from /etc/services file by  request.
2. Use the separate caching source - such as cached(8).

The first solution will be very fast. But I'm not sure if it is not an 
overkill for /etc/services.

The second solution is already implemented in cached(8). There is, of 
course an overhead, but there is also an average 5-times performance 
improvement (details are in the "Cached performance analysis" section of 
this paper: http://asiabsdcon.org/papers/P06-paper.pdf). In my perforce 
branch there is an implemented "precache" feature for cached(8), which 
makes things even faster. I've implemented the file-monitoring option 
(which updates cache automatically in case of file change) there also. 
But they cannot been committed before some changes in libc are made. 
BTW, I've sent a patch with one of such changes for review to this 
thread 
(http://lists.freebsd.org/pipermail/freebsd-net/2007-May/014128.html), 
but unfortunately received no feedback.

Finally, I think that these solutions are pretty equal in terms of 
complexity and time. However, personally I think that cached(8) is more 
appropriate for this kind of task. But if we care about having this 
functionality in 6-stable, cached is not the choice, probably.

> EG> - Instead of reading and parsing /etc/services every time, use a
> EG>   hash or btree file a la the aliases database. A hash one (first
> EG>   key, next key) could be a replacement to use with getservent(),
> EG>   while a btree one could be be a replacement to use with getservbyname().
> EG>   This doesn't have the startup-penalty, but the sysadmin needs to
> EG>   keep track of changes in /etc/services and needs to rebuild it.
> 
> I think it will be better solution.
> /etc/services edited by sysadmin rarely and we can place comments in
> this file about hash.
> 
> EG> - Instead of reading and parsing /etc/services every time, open a
> EG>   socket and ask a daemon for the information. Which daemon is a
> EG>   good question, but it can automatically re-read the /etc/services
> EG>   file if it got changed.
> 
> Connection to external daemon is additional overhead.
> 
> Anyway, is there need to optimize getservbyname()? Is there any
> applications, which call getservbyname() on each connection/request?
> 
> IMHO /etc/services can be kept in current state.
> 
> -- WBR, Anton Yuzhaninov



-- 
With best regards,
Michael Bushkov
Southern Federal University



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