Date: Thu, 19 Nov 1998 10:48:05 -0800 (PST) From: lem@cantv.net To: freebsd-gnats-submit@FreeBSD.ORG Subject: misc/8764: pwd_mkdb is slow on many users Message-ID: <199811191848.KAA04559@hub.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 8764
>Category: misc
>Synopsis: pwd_mkdb is slow on many users
>Confidential: no
>Severity: non-critical
>Priority: medium
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: change-request
>Submitter-Id: current-users
>Arrival-Date: Thu Nov 19 10:50:01 PST 1998
>Last-Modified:
>Originator: Luis Munoz
>Organization:
CANTV Servicios
>Release: 2.2.6-RELEASE
>Environment:
bash-2.01# uname -a
FreeBSD rs8s1.datacenter.cha.cantv.net 2.2.6-RELEASE FreeBSD 2.2.6-RELEASE #0: F
ri Aug 21 11:05:02 GMT 1998 root@myname.my.domain:/usr/src/sys/compile/CCSER
V i386
>Description:
On systems with large user counts (>= 50k), the time to rebuild
tha password database becomes quite large. One of our test systems
clocked 60+ minutes with 150k users. Increasing the buffer space
as suggested on one of the freebsd-* lists reduced this time to
44+ minutes, which is roughly a 25% improvement.
Probably further increasing cache could reduce the time by 50%.
>How-To-Repeat:
>Fix:
This is a patch for pwd_mkdb on i386 2.2.6-RELEASE. The patch allows
two new command-line options that reduce the time required to
update the password database. Those are documented in the man page
(after patches are applied :) In our text box, PII w256M RAM
and RAID disks, with 150k users, time to build a password database
went from 60+ minutes to 44+ minutes. Perhaps it could be improved
even more...
[If the patches do not work properly, please contact me directly
to have them sent via email -lem]
*** pwd_mkdb.8-orig Thu Nov 19 18:40:36 1998
--- pwd_mkdb.8 Wed Nov 18 22:18:11 1998
***************
*** 39,46 ****
--- 39,48 ----
.Nd "generate the password databases"
.Sh SYNOPSIS
.Nm pwd_mkdb
+ .Op Fl b Ar base size
.Op Fl c
.Op Fl p
+ .Op Fl s Ar cache size
.Op Fl d Ar directory
.Op Fl u Ar username
.Ar file
***************
*** 63,74 ****
--- 65,89 ----
.Pp
The options are as follows:
.Bl -tag -width flag
+ .It Fl b Ar base size
+ Use a factor to scale up certain parameters in the definition of
+ the database (see
+ .Xr hash 3 ) .
+ For large ammounts of users, this should be set to a rather large
+ factor, 64 or so, to speed up database creation. If left undefined
+ it defaults to reasonable values for around 500 users.
.It Fl c
Check if the password file is in the correct format. Do not
change, add, or remove any files.
.It Fl p
Create a Version 7 style password file and install it into
.Pa /etc/passwd .
+ .It Fl s Ar cache size
+ The database functions use a cache to speedup the process. This
+ flag allows the specification of a cache size. It's defined in
+ kilobytes. A larger cache tipically produces quicker processing
+ times. 8192 kilobytes provides plenty of space for larger user
+ databases.
.It Fl d Ar directory
Store databases into specified destination directory instead of
.Pa /etc .
*** pwd_mkdb.c-orig Wed Nov 18 21:34:59 1998
--- pwd_mkdb.c Wed Nov 18 22:08:49 1998
***************
*** 100,106 ****
DBT data, sdata, key;
FILE *fp, *oldfp;
sigset_t set;
! int ch, cnt, ypcnt, len, makeold, tfd, yp_enabled = 0;
char *p, *t;
char buf[MAX(MAXPATHLEN, LINE_MAX * 2)], tbuf[1024];
char sbuf[MAX(MAXPATHLEN, LINE_MAX * 2)];
--- 100,107 ----
DBT data, sdata, key;
FILE *fp, *oldfp;
sigset_t set;
! int cachesize, basesize, ch, cnt, ypcnt, len,
! makeold, tfd, yp_enabled = 0;
char *p, *t;
char buf[MAX(MAXPATHLEN, LINE_MAX * 2)], tbuf[1024];
char sbuf[MAX(MAXPATHLEN, LINE_MAX * 2)];
***************
*** 114,121 ****
strcpy(prefix, _PATH_PWD);
makeold = 0;
username = NULL;
! while ((ch = getopt(argc, argv, "cd:pu:v")) != -1)
switch(ch) {
case 'c': /* verify only */
cflag = 1;
break;
--- 115,127 ----
strcpy(prefix, _PATH_PWD);
makeold = 0;
username = NULL;
! basesize = 1; /* Default base size for DB */
! cachesize = 2048; /* Default cache size for DB */
! while ((ch = getopt(argc, argv, "s:b:cd:pu:v")) != -1)
switch(ch) {
+ case 'b': /* Set bucket size */
+ basesize = atoi(optarg);
+ break;
case 'c': /* verify only */
cflag = 1;
break;
***************
*** 125,130 ****
--- 131,139 ----
case 'p': /* create V7 "file.orig" */
makeold = 1;
break;
+ case 's': /* Set buffer/cache size */
+ cachesize = atoi(optarg);
+ break;
case 'u': /* only update this record */
username = optarg;
break;
***************
*** 139,144 ****
--- 148,173 ----
if (argc != 1 || (username && (*username == '+' || *username == '-')))
usage();
+ if (basesize <= 0) {
+ error("Base size must be an integer >= 0");
+ usage();
+ }
+
+ if (cachesize <= 0) {
+ error("Cache size must be an integer >= 0");
+ usage();
+ }
+
+ /* update the openinfo structure */
+
+ openinfo.bsize = (u_int) 4096 * basesize;
+ if (openinfo.bsize > 16384) {
+ openinfo.bsize = 16384;
+ }
+ openinfo.ffactor = (u_int) 32 * basesize;
+ openinfo.nelem = (u_int) 256 * basesize * basesize;
+ openinfo.cachesize = cachesize * 1024;
+
/*
* This could be changed to allow the user to interrupt.
* Probably not worth the effort.
***************
*** 577,582 ****
{
(void)fprintf(stderr,
! "usage: pwd_mkdb [-c] [-p] [-d <dest dir>] [-u <local username>] file\n");
exit(1);
}
--- 606,611 ----
{
(void)fprintf(stderr,
! "usage: pwd_mkdb [-b <size>] [-c] [-p] [-d <dest dir>] [-s <cache size>] [-u <local username>] file\n");
exit(1);
}
>Audit-Trail:
>Unformatted:
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199811191848.KAA04559>
