Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src User-level changes corrseponding to my latest kernel changes.
details: https://anonhg.NetBSD.org/src/rev/9f2d0d7e2f4c
branches: trunk
changeset: 494155:9f2d0d7e2f4c
user: perseant <perseant%NetBSD.org@localhost>
date: Mon Jul 03 01:49:11 2000 +0000
description:
User-level changes corrseponding to my latest kernel changes.
newfs_lfs gives lfs_minfreeseg a value of 1/8 of the total segments on
the disk, based on rough empirical data, but this should be refined in
the future.
diffstat:
libexec/lfs_cleanerd/cleanerd.c | 33 ++++++++++++++++++---------------
sbin/newfs_lfs/config.h | 17 ++++++++++-------
sbin/newfs_lfs/lfs.c | 24 ++++++++++++++++--------
3 files changed, 44 insertions(+), 30 deletions(-)
diffs (189 lines):
diff -r 8b39db9d3851 -r 9f2d0d7e2f4c libexec/lfs_cleanerd/cleanerd.c
--- a/libexec/lfs_cleanerd/cleanerd.c Mon Jul 03 01:47:48 2000 +0000
+++ b/libexec/lfs_cleanerd/cleanerd.c Mon Jul 03 01:49:11 2000 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: cleanerd.c,v 1.19 2000/06/21 01:58:52 perseant Exp $ */
+/* $NetBSD: cleanerd.c,v 1.20 2000/07/03 01:49:16 perseant Exp $ */
/*-
* Copyright (c) 1992, 1993
@@ -40,7 +40,7 @@
#if 0
static char sccsid[] = "@(#)cleanerd.c 8.5 (Berkeley) 6/10/95";
#else
-__RCSID("$NetBSD: cleanerd.c,v 1.19 2000/06/21 01:58:52 perseant Exp $");
+__RCSID("$NetBSD: cleanerd.c,v 1.20 2000/07/03 01:49:16 perseant Exp $");
#endif
#endif /* not lint */
@@ -312,17 +312,19 @@
int nsegs;
long options;
{
+ struct lfs *lfsp;
double loadavg[MAXLOADS];
time_t now;
u_long max_free_segs;
u_long db_per_seg;
+ lfsp = &fsp->fi_lfs;
/*
* Compute the maximum possible number of free segments, given the
* number of free blocks.
*/
- db_per_seg = fragstodb(&fsp->fi_lfs, fsp->fi_lfs.lfs_ssize);
- max_free_segs = (fsp->fi_statfsp->f_bfree / fsp->fi_lfs.lfs_ssize) >> fsp->fi_lfs.lfs_fbshift;
+ db_per_seg = fsbtodb(lfsp, lfsp->lfs_ssize);
+ max_free_segs = lfsp->lfs_bfree / db_per_seg + lfsp->lfs_minfreeseg;
/*
* We will clean if there are not enough free blocks or total clean
@@ -331,23 +333,24 @@
now = time((time_t *)NULL);
if(debug > 1) {
- syslog(LOG_DEBUG, "db_per_seg = %lu max_free_segs = %lu, bfree = %u avail = %d ",
- db_per_seg, max_free_segs, fsp->fi_lfs.lfs_bfree,
- fsp->fi_lfs.lfs_avail);
+ syslog(LOG_DEBUG, "db_per_seg = %lu bfree = %u avail = %d ",
+ db_per_seg, lfsp->lfs_bfree,
+ lfsp->lfs_avail);
syslog(LOG_DEBUG, "clean segs = %d, max_free_segs = %ld",
fsp->fi_cip->clean, max_free_segs);
- syslog(LOG_DEBUG, "clean = %d", fsp->fi_cip->clean);
}
- if ((fsp->fi_lfs.lfs_bfree - fsp->fi_lfs.lfs_avail > db_per_seg &&
- fsp->fi_lfs.lfs_avail < db_per_seg) ||
+ if ((lfsp->lfs_bfree - lfsp->lfs_avail > db_per_seg &&
+ lfsp->lfs_avail < (long)db_per_seg) ||
(fsp->fi_cip->clean < max_free_segs &&
- (fsp->fi_cip->clean <= MIN_SEGS(&fsp->fi_lfs) ||
+ (fsp->fi_cip->clean <= lfsp->lfs_minfreeseg ||
fsp->fi_cip->clean < max_free_segs * BUSY_LIM)))
{
if(debug)
- syslog(LOG_DEBUG, "Cleaner Running at %s (%d of %lu segments available)",
- ctime(&now), fsp->fi_cip->clean, max_free_segs);
+ syslog(LOG_DEBUG, "Cleaner Running at %s "
+ "(%d of %lu segments available, avail = %d)",
+ ctime(&now), fsp->fi_cip->clean, max_free_segs,
+ lfsp->lfs_avail);
clean_fs(fsp, cost_benefit, nsegs, options);
if(do_quit) {
if(debug)
@@ -448,8 +451,8 @@
}
/* If we relly need to clean a lot, do it now */
- if(fsp->fi_cip->clean < 2*MIN_FREE_SEGS)
- nsegs = MAX(nsegs,MIN_FREE_SEGS);
+ if(fsp->fi_cip->clean < 2 * fsp->fi_lfs.lfs_minfreeseg)
+ nsegs = MAX(nsegs, fsp->fi_lfs.lfs_minfreeseg);
/* But back down if we haven't got that many free to clean into */
if(fsp->fi_cip->clean < nsegs)
nsegs = fsp->fi_cip->clean;
diff -r 8b39db9d3851 -r 9f2d0d7e2f4c sbin/newfs_lfs/config.h
--- a/sbin/newfs_lfs/config.h Mon Jul 03 01:47:48 2000 +0000
+++ b/sbin/newfs_lfs/config.h Mon Jul 03 01:49:11 2000 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: config.h,v 1.2 2000/06/27 21:06:24 perseant Exp $ */
+/* $NetBSD: config.h,v 1.3 2000/07/03 01:49:11 perseant Exp $ */
/*-
* Copyright (c) 1991, 1993
@@ -53,15 +53,18 @@
#define DFL_BLKSIZE 8192
/*
+ * 1/DFL_MIN_FREE_SEGS gives the fraction of segments to be reserved for
+ * the cleaner. Experimental data show this number should be around
+ * 5-10.
+ */
+#define DFL_MIN_FREE_SEGS 8
+
+/*
* MINFREE gives the minimum acceptable percentage of file system
* blocks which may be free. If the freelist drops below this level
- * only the superuser may continue to allocate blocks. This may
- * be set to 0 if no reserve of free blocks is deemed necessary,
- * however throughput drops by (how many?) percent if the file system
- * is run at between 80% and 100% full; thus the default value of
- * fs_minfree is 20%.
+ * only the superuser may continue to allocate blocks.
*/
-#define MINFREE 20
+#define MINFREE 10
/*
* The following constants set the default block and segment size for a log
diff -r 8b39db9d3851 -r 9f2d0d7e2f4c sbin/newfs_lfs/lfs.c
--- a/sbin/newfs_lfs/lfs.c Mon Jul 03 01:47:48 2000 +0000
+++ b/sbin/newfs_lfs/lfs.c Mon Jul 03 01:49:11 2000 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: lfs.c,v 1.13 2000/06/27 21:06:25 perseant Exp $ */
+/* $NetBSD: lfs.c,v 1.14 2000/07/03 01:49:12 perseant Exp $ */
/*-
* Copyright (c) 1991, 1993
@@ -38,7 +38,7 @@
#if 0
static char sccsid[] = "@(#)lfs.c 8.5 (Berkeley) 5/24/95";
#else
-__RCSID("$NetBSD: lfs.c,v 1.13 2000/06/27 21:06:25 perseant Exp $");
+__RCSID("$NetBSD: lfs.c,v 1.14 2000/07/03 01:49:12 perseant Exp $");
#endif
#endif /* not lint */
@@ -149,6 +149,7 @@
/* dlfs_fsmnt */ { 0 },
/* dlfs_clean */ 0,
/* dlfs_dmeta */ 0,
+ /* dlfs_minfreeseg */ 0,
/* dlfs_pad */ { 0 },
/* dlfs_cksum */ 0
@@ -313,8 +314,11 @@
lfsp->lfs_nseg = lfsp->lfs_dsize / lfsp->lfs_ssize;
lfsp->lfs_nclean = lfsp->lfs_nseg - 1;
lfsp->lfs_maxfilesize = maxtable[lfsp->lfs_bshift] << lfsp->lfs_bshift;
+ lfsp->lfs_minfreeseg = lfsp->lfs_nseg / DFL_MIN_FREE_SEGS;
+ if (lfsp->lfs_minfreeseg < MIN_FREE_SEGS)
+ lfsp->lfs_minfreeseg = MIN_FREE_SEGS;
- if(lfsp->lfs_nseg < MIN_FREE_SEGS + 1
+ if(lfsp->lfs_nseg < lfsp->lfs_minfreeseg + 1
|| lfsp->lfs_nseg < LFS_MIN_SBINTERVAL + 1)
{
if(seg_size == 0 && ssize > (bsize<<1)) {
@@ -333,12 +337,17 @@
/*
* The number of free blocks is set from the number of segments
- * times the segment size - MIN_FREE_SEGS (that we never write
+ * times the segment size - lfs_minfreesegs (that we never write
* because we need to make sure the cleaner can run). Then
* we'll subtract off the room for the superblocks ifile entries
- * and segment usage table.
+ * and segment usage table, and half a block per segment that can't
+ * be written due to fragmentation.
*/
- lfsp->lfs_dsize = fsbtodb(lfsp, (lfsp->lfs_nseg - MIN_FREE_SEGS) * lfsp->lfs_ssize);
+ lfsp->lfs_dsize = fsbtodb(lfsp, (lfsp->lfs_nseg -
+ lfsp->lfs_minfreeseg) *
+ lfsp->lfs_ssize);
+ lfsp->lfs_dsize -= fsbtodb(lfsp, lfsp->lfs_nseg / 2);
+
lfsp->lfs_bfree = lfsp->lfs_dsize;
lfsp->lfs_segtabsz = SEGTABSIZE_SU(lfsp);
lfsp->lfs_cleansz = CLEANSIZE_SU(lfsp);
@@ -406,8 +415,7 @@
segp->su_flags = SEGUSE_SUPERBLOCK | SEGUSE_DIRTY;
lfsp->lfs_bfree -= LFS_SUMMARY_SIZE / lp->d_secsize;
lfsp->lfs_bfree -=
- fsbtodb(lfsp, lfsp->lfs_cleansz + lfsp->lfs_segtabsz + 4 +
- MIN_FREE_SEGS * lfsp->lfs_ssize);
+ fsbtodb(lfsp, lfsp->lfs_cleansz + lfsp->lfs_segtabsz + 4);
/*
* Now figure out the address of the ifile inode. The inode block
Home |
Main Index |
Thread Index |
Old Index