Size the NFS server dupreq cache on the basis of nmbclusters. On servers

with low nmbclusters, we tie up too many mbclusters in the NFS duplicate
request cache. This change limits the size of the dupreq cache to 1/2
the nmbclusters (and flaots in a range of [64, 2048]).

MFC after 2 weeks.

Reported by: Steve Kargl, David O'Brien
Tested by:   Steve Kargl
This commit is contained in:
Mohan Srinivasan 2006-06-23 00:42:26 +00:00
parent f8910b42c8
commit 5943f1a781
2 changed files with 22 additions and 4 deletions

View File

@ -49,6 +49,7 @@ __FBSDID("$FreeBSD$");
#include <sys/mutex.h>
#include <sys/socket.h>
#include <sys/socketvar.h> /* for sodupsockaddr */
#include <sys/eventhandler.h>
#include <netinet/in.h>
#include <nfs/rpcv2.h>
@ -57,7 +58,7 @@ __FBSDID("$FreeBSD$");
#include <nfsserver/nfsrvcache.h>
static long numnfsrvcache;
static long desirednfsrvcache = NFSRVCACHESIZ;
static long desirednfsrvcache;
#define NFSRCHASH(xid) \
(&nfsrvhashtbl[((xid) + ((xid) >> 24)) & nfsrvhash])
@ -122,15 +123,32 @@ static const int nfsv2_repstat[NFS_NPROCS] = {
FALSE,
};
/*
* Size the NFS server's duplicate request cache at 1/2 the nmbclsters, floating
* within a (64, 2048) range. This is to prevent all mbuf clusters being tied up
* in the NFS dupreq cache for small values of nmbclusters.
*/
static void
nfsrvcache_size_change(void *tag)
{
desirednfsrvcache = nmbclusters /2;
if (desirednfsrvcache > NFSRVCACHE_MAX_SIZE)
desirednfsrvcache = NFSRVCACHE_MAX_SIZE;
if (desirednfsrvcache < NFSRVCACHE_MIN_SIZE)
desirednfsrvcache = NFSRVCACHE_MIN_SIZE;
}
/*
* Initialize the server request cache list
*/
void
nfsrv_initcache(void)
{
nfsrvcache_size_change(NULL);
nfsrvhashtbl = hashinit(desirednfsrvcache, M_NFSD, &nfsrvhash);
TAILQ_INIT(&nfsrvlruhead);
EVENTHANDLER_REGISTER(nmbclusters_change, nfsrvcache_size_change, NULL,
EVENTHANDLER_PRI_FIRST);
}
/*

View File

@ -41,8 +41,8 @@
/*
* Definitions for the server recent request cache
*/
#define NFSRVCACHESIZ 2048
#define NFSRVCACHE_MAX_SIZE 2048
#define NFSRVCACHE_MIN_SIZE 64
struct nfsrvcache {
TAILQ_ENTRY(nfsrvcache) rc_lru; /* LRU chain */