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>