Print this page
4953763 Need way to configure NFS window sizes without changing system wide defaults
6216670 NFS server needs a bigger transmit buffer
*** 126,135 ****
--- 126,148 ----
* Set the default for server delegation enablement and set per
* /etc/default/nfs configuration (if present).
*/
int nfs_server_delegation = NFS_SERVER_DELEGATION_DEFAULT;
+ /*
+ * Default values for TCP send and receive buffer size of NFS server
+ * connections.
+ *
+ * These values can be tuned by user via /etc/default/nfs configuration
+ * file by setting NFS_SERVER_SNDBUFSZ and NFS_SERVER_RCVBUFSZ.
+ *
+ * To force NFS connections to use system-wide default for TCP send and
+ * receive buffer, set NFS_SERVER_SNDBUFSZ and NFS_SERVER_RCVBUFSZ to 0.
+ */
+ int nfs_server_sndbufsz = 1048576;
+ int nfs_server_rcvbufsz = 1048576;
+
int
main(int ac, char *av[])
{
char *dir = "/";
int allflag = 0;
*** 137,147 ****
int opt_cnt = 0;
int maxservers = 1; /* zero allows inifinte number of threads */
int maxservers_set = 0;
int logmaxservers = 0;
int pid;
! int i;
char *provider = (char *)NULL;
char *df_provider = (char *)NULL;
struct protob *protobp0, *protobp;
NETSELDECL(proto) = NULL;
NETSELDECL(df_proto) = NULL;
--- 150,160 ----
int opt_cnt = 0;
int maxservers = 1; /* zero allows inifinte number of threads */
int maxservers_set = 0;
int logmaxservers = 0;
int pid;
! int i, bufsz;
char *provider = (char *)NULL;
char *df_provider = (char *)NULL;
struct protob *protobp0, *protobp;
NETSELDECL(proto) = NULL;
NETSELDECL(df_proto) = NULL;
*** 233,242 ****
--- 246,267 ----
if ((defval = defread("NFS_SERVER_DELEGATION=")) != NULL) {
if (strcmp(defval, "off") == 0) {
nfs_server_delegation = FALSE;
}
}
+ if ((defval = defread("NFS_SERVER_SNDBUFSZ=")) != NULL) {
+ errno = 0;
+ bufsz = strtol(defval, (char **)NULL, 10);
+ if (errno == 0)
+ nfs_server_sndbufsz = bufsz;
+ }
+ if ((defval = defread("NFS_SERVER_RCVBUFSZ=")) != NULL) {
+ errno = 0;
+ bufsz = strtol(defval, (char **)NULL, 10);
+ if (errno == 0)
+ nfs_server_rcvbufsz = bufsz;
+ }
/* close defaults file */
defopen(NULL);
}
*** 532,542 ****
NFS_ACL_V3 : nfs_server_vers_max;
protobp->program = NFS_ACL_PROGRAM;
protobp->next = (struct protob *)NULL;
if (allflag) {
! if (do_all(protobp0, nfssvc, 0) == -1) {
fprintf(stderr, "setnetconfig failed : %s",
strerror(errno));
exit(1);
}
} else if (proto) {
--- 557,568 ----
NFS_ACL_V3 : nfs_server_vers_max;
protobp->program = NFS_ACL_PROGRAM;
protobp->next = (struct protob *)NULL;
if (allflag) {
! if (do_all_setbuf(protobp0, nfssvc, 0, nfs_server_sndbufsz,
! nfs_server_rcvbufsz) == -1) {
fprintf(stderr, "setnetconfig failed : %s",
strerror(errno));
exit(1);
}
} else if (proto) {
*** 550,576 ****
goto done;
}
while (nconf = getnetconfig(nc)) {
if (strcmp(nconf->nc_proto, proto) == 0) {
protoFound = TRUE;
! do_one(nconf->nc_device, NULL,
! protobp0, nfssvc, 0);
}
}
(void) endnetconfig(nc);
if (protoFound == FALSE) {
fprintf(stderr,
"couldn't find netconfig entry for protocol %s",
proto);
}
} else if (provider)
! do_one(provider, proto, protobp0, nfssvc, 0);
else {
for (providerp = defaultproviders;
*providerp != NULL; providerp++) {
provider = *providerp;
! do_one(provider, NULL, protobp0, nfssvc, 0);
}
}
done:
free(protobp);
--- 576,605 ----
goto done;
}
while (nconf = getnetconfig(nc)) {
if (strcmp(nconf->nc_proto, proto) == 0) {
protoFound = TRUE;
! do_one_setbuf(nconf->nc_device, NULL,
! protobp0, nfssvc, 0,
! nfs_server_sndbufsz, nfs_server_rcvbufsz);
}
}
(void) endnetconfig(nc);
if (protoFound == FALSE) {
fprintf(stderr,
"couldn't find netconfig entry for protocol %s",
proto);
}
} else if (provider)
! do_one_setbuf(provider, proto, protobp0, nfssvc, 0,
! nfs_server_sndbufsz, nfs_server_rcvbufsz);
else {
for (providerp = defaultproviders;
*providerp != NULL; providerp++) {
provider = *providerp;
! do_one_setbuf(provider, NULL, protobp0, nfssvc, 0,
! nfs_server_sndbufsz, nfs_server_rcvbufsz);
}
}
done:
free(protobp);