vBulletin Search Engine Optimization
| |||||||
| Register | FAQ | Members List | Calendar | Search | Today's Posts | Mark Forums Read |
| ||||
| Current behaviour of pwd_mkdb(8) in regards to how much ram to use for DB cache is (if I understand it correctly) to use 2M cache, up to the point where the input filesize is larger than 100k. If it is above 100k, it uses "filesize * 20" bytes, but only upto 12M, and from there it sticks to 12M regardless of how large the master.passwd file is. For my insanely large passwd's, this costs me real time, since the DB will trade memory usage for speed. I proposed a while ago to just remove the 12M ceiling but the responses were along the "think of them poor small machines", so here is another patch that goes: 1. Use 2M by default 2. If file is >100k, check how much physmem there is 3. If physmem is below 64M, cap at 12M ram usage 4. Otherwise use input filesize * 20 bytes. This halves the time on my 108k users master.passwd when run on MFS, I know it makes even more difference on machines with slow disks. Using /usr/bin/time -l on it shows the block output operations to lessen quite a bit if you get the correct cache size set. In case my current mailer mangles the diff, it is available here for laughs: http://people.su.se/~jj/obsd/pwd_mkdb.c.diff Index: pwd_mkdb.c ================================================== ================= RCS file: /usr/cvs//src/usr.sbin/pwd_mkdb/pwd_mkdb.c,v retrieving revision 1.39 diff -u -r1.39 pwd_mkdb.c --- pwd_mkdb.c 17 Mar 2008 20:30:16 -0000 1.39 +++ pwd_mkdb.c 5 May 2008 08:44:06 -0000 @@ -47,6 +47,7 @@ #include <sys/param.h> #include <sys/stat.h> +#include <sys/sysctl.h> #include <db.h> #include <err.h> @@ -190,8 +191,23 @@ error(pname); /* Tweak openinfo values for large passwd files. */ - if (st.st_size > (off_t)100*1024) - openinfo.cachesize = MIN(st.st_size * 20, (off_t)12*1024*1024); + if (st.st_size > (off_t)100*1024) { + int mib[2]; + size_t len; + int64_t physmem64; + mib[0]=CTL_HW; + mib[1]=HW_PHYSMEM64; + + len=sizeof(physmem64); + if (sysctl(mib, 2, &physmem64, &len, NULL, 0) == -1) + err(1, "Failed sysctl"); + if (physmem64 >= 64*1024*1024) { + openinfo.cachesize = st.st_size * 20; + } else { + openinfo.cachesize = + MIN(st.st_size * 20, (off_t)12*1024*1024); + } + } if (st.st_size / 128 > openinfo.nelem) openinfo.nelem = st.st_size / 128; / jj@ [demime 1.01d removed an attachment of type application/pgp-signature which had a name of signature.asc] |
| Thread Tools | |
| Display Modes | |
| |