2007-07-31 21:55:13

by david m. richter

[permalink] [raw]
Subject: [PATCH 7/7] nfsstat: add -D/--diff-stat

Add -D/--diff-stat: instead of immediately displaying total
collected NFS stats and exiting, nfsstat will take a snapshot of current
statistics and pause until the user hits ^C, at which point it takes a
second snapshot and then prints out the difference of the two; i.e.,
only the statistics collected during the pause.

Signed-off-by: David M. Richter <[email protected]>

---
utils/nfsstat/nfsstat.c | 93 ++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 91 insertions(+), 2 deletions(-)

diff --git a/utils/nfsstat/nfsstat.c b/utils/nfsstat/nfsstat.c
index ab6bce7..c9a2f7d 100644
--- a/utils/nfsstat/nfsstat.c
+++ b/utils/nfsstat/nfsstat.c
@@ -20,6 +20,8 @@
#include <string.h>
#include <fcntl.h>
#include <errno.h>
+#include <signal.h>
+#include <time.h>

#define MAXNRVALS 32

@@ -153,6 +155,11 @@ static int mounts(const char *);

static void get_stats(const char *, statinfo *, int *, int, const char *);
static int has_stats(const unsigned int *);
+static void copy_stats(statinfo *, statinfo *);
+static void diff_stats(statinfo *, statinfo *);
+static void unpause(int);
+
+static time_t starttime;

#define PRNT_CALLS 0x0001
#define PRNT_RPC 0x0002
@@ -191,6 +198,7 @@ void usage(char *name)
-v, --verbose, --all\tSame as '-o all'\n\
-r, --rpc\t\tShow RPC statistics\n\
-n, --nfs\t\tShow NFS statistics\n\
+ -D, --diff-stat\tSaves stats, pauses, diffs current and saved\n\
--version\t\tShow program version\n\
--help\t\tWhat you just did\n\
\n", name);
@@ -211,6 +219,7 @@ static struct option longopts[] =
{ "zero", 0, 0, 'z' },
{ "help", 0, 0, '\1' },
{ "version", 0, 0, '\2' },
+ { "diff-stat", 0, 0, 'D' },
{ NULL, 0, 0, 0 }
};

@@ -220,16 +229,22 @@ main(int argc, char **argv)
int opt_all = 0,
opt_srv = 0,
opt_clt = 0,
- opt_prt = 0;
+ opt_prt = 0,
+ opt_diffstat = 0;
int c;
char *progname;

+ struct sigaction act = {
+ .sa_handler = unpause,
+ .sa_flags = SA_ONESHOT,
+ };
+
if ((progname = strrchr(argv[0], '/')))
progname++;
else
progname = argv[0];

- while ((c = getopt_long(argc, argv, "234acmno:vrsz\1\2", longopts, NULL)) != EOF) {
+ while ((c = getopt_long(argc, argv, "234acmno:Dvrsz\1\2", longopts, NULL)) != EOF) {
switch (c) {
case 'a':
fprintf(stderr, "nfsstat: nfs acls are not yet supported.\n");
@@ -259,6 +274,9 @@ main(int argc, char **argv)
return 2;
}
break;
+ case 'D':
+ opt_diffstat = 1;
+ break;
case '2':
case '3':
case '4':
@@ -319,6 +337,29 @@ main(int argc, char **argv)
if (opt_clt)
get_stats(NFSCLTSTAT, cltinfo, &opt_clt, opt_srv, "Client");

+ /* save stat snapshots; wait for signal; then diff current and saved stats */
+ if (opt_diffstat) {
+ starttime = time(NULL);
+ printf("Collecting statistics; press CTRL-C to view results from interval (i.e., from pause to CTRL-C).\n");
+ if (opt_srv)
+ copy_stats(srvinfo_tmp, srvinfo);
+ if (opt_clt)
+ copy_stats(cltinfo_tmp, cltinfo);
+ if (sigaction(SIGINT, &act, NULL) != 0) {
+ fprintf(stderr, "Error: couldn't register for signal and pause.\n");
+ return 1;
+ }
+ pause();
+ if (opt_srv) {
+ get_stats(NFSSRVSTAT, srvinfo, &opt_srv, opt_clt, "Server");
+ diff_stats(srvinfo, srvinfo_tmp);
+ }
+ if (opt_clt) {
+ get_stats(NFSCLTSTAT, cltinfo, &opt_clt, opt_srv, "Client");
+ diff_stats(cltinfo, cltinfo_tmp);
+ }
+ }
+
if (opt_srv) {
if (opt_prt & PRNT_NET) {
print_numbers(
@@ -593,3 +634,51 @@ has_stats(const unsigned int *info)
{
return (info[0] && info[info[0] + 1] != info[0]);
}
+
+/* clone 'src' to 'dest' */
+static void
+copy_stats(struct statinfo *dest, struct statinfo *src)
+{
+ int i, j;
+
+ for (i = 0; src[i].tag; i++) {
+ dest[i].tag = src[i].tag;
+ dest[i].nrvals = src[i].nrvals;
+ for (j = 0; j < dest[i].nrvals; j++)
+ dest[i].valptr[j] = src[i].valptr[j];
+ }
+}
+
+/*
+ * take the difference of each individual stat value in 'new' and 'old'
+ * and store the results back into 'new'
+ */
+static void
+diff_stats(struct statinfo *new, struct statinfo *old)
+{
+ int i, j, is_srv, should_diff;
+
+ is_srv = (new == srvinfo);
+ for (i = 0; old[i].tag; i++) {
+ for (j = 0; j < new[i].nrvals; j++) {
+ /* skip items in valptr that shouldn't be changed */
+ should_diff = (i < (3 + is_srv) || j > 0);
+ if (should_diff)
+ new[i].valptr[j] -= old[i].valptr[j];
+ }
+ }
+}
+
+static void
+unpause(int sig)
+{
+ double time_diff;
+ int minutes, seconds;
+ time_t endtime;
+
+ endtime = time(NULL);
+ time_diff = difftime(endtime, starttime);
+ minutes = time_diff / 60;
+ seconds = (int)time_diff % 60;
+ printf("Signal received; displaying (only) statistics gathered over the last %d minutes, %d seconds:\n\n", minutes, seconds);
+}
--
1.4.4

-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
NFS maillist - [email protected]
https://lists.sourceforge.net/lists/listinfo/nfs


2007-08-07 21:19:28

by Steinar H. Gunderson

[permalink] [raw]
Subject: Re: [PATCH 7/7] nfsstat: add -D/--diff-stat

On Tue, Jul 31, 2007 at 05:39:49PM -0400, david m. richter wrote:
> + double time_diff;

Unfortunately, this breaks the build on alpha. For some reason, configure.ac
does

case $host in
alpha*)
ARCHFLAGS="-mno-fp-regs -ffixed-8" ;;
*)
ARCHFLAGS="" ;;
esac

which essentially means that you cannot use any floating-point in the program
at all, according to the Debian alpha porters.

Either this snippet must be removed for alpha (I presume it was put in for a
reason at some point, but I have no idea what this reason was, and if it's
still valid), or the code must be rewritten not to use floating-point.

/* Steinar */
--
Homepage: http://www.sesse.net/

-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
NFS maillist - [email protected]
https://lists.sourceforge.net/lists/listinfo/nfs

2007-08-07 21:29:45

by david m. richter

[permalink] [raw]
Subject: Re: [PATCH 7/7] nfsstat: add -D/--diff-stat

On Tue, 7 Aug 2007, Steinar H. Gunderson wrote:

> On Tue, Jul 31, 2007 at 05:39:49PM -0400, david m. richter wrote:
> > + double time_diff;
>
> Unfortunately, this breaks the build on alpha. For some reason, configure.ac
> does
>
> case $host in
> alpha*)
> ARCHFLAGS="-mno-fp-regs -ffixed-8" ;;
> *)
> ARCHFLAGS="" ;;
> esac
>
> which essentially means that you cannot use any floating-point in the program
> at all, according to the Debian alpha porters.
>
> Either this snippet must be removed for alpha (I presume it was put in for a
> reason at some point, but I have no idea what this reason was, and if it's
> still valid), or the code must be rewritten not to use floating-point.
>
> /* Steinar */


ach, that's too bad; thanks for finding it. that double is only
used in one spot, in a "helpful" message that isn't important; we could
remove it. i'll look at it right now.

does anyone know the reason behind no-floating-point-on-Alpha?

thanks,

d
.

-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
NFS maillist - [email protected]
https://lists.sourceforge.net/lists/listinfo/nfs

2007-08-07 21:54:04

by Steinar H. Gunderson

[permalink] [raw]
Subject: Re: [PATCH 7/7] nfsstat: add -D/--diff-stat

On Tue, Aug 07, 2007 at 05:26:13PM -0400, david m. richter wrote:
> does anyone know the reason behind no-floating-point-on-Alpha?

It seems to have been added as part of this changelog entry (slightly munged
in git, perhaps something went wrong from the CVS import):

2005-12-20 Kevin Coffman <[email protected]> NeilBrown <[email protected]>
Substantial Makefile/configure rewrite.
Run 'autogen.sh' to create "Makefile.in" etc.

Also add -D_FILE_OFFSET_BITS=64 to CPP_FLAGS so that mountd can
stat and export files larger than 2Gig.

1.0.8-rc2 released

I sort of suspect it was just copied blindly from somewhere...

/* Steinar */
--
Homepage: http://www.sesse.net/

-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
NFS maillist - [email protected]
https://lists.sourceforge.net/lists/listinfo/nfs

2007-08-07 22:08:17

by Kevin Coffman

[permalink] [raw]
Subject: Re: [PATCH 7/7] nfsstat: add -D/--diff-stat

On 8/7/07, Steinar H. Gunderson <[email protected]> wrote:
> On Tue, Aug 07, 2007 at 05:26:13PM -0400, david m. richter wrote:
> > does anyone know the reason behind no-floating-point-on-Alpha?
>
> It seems to have been added as part of this changelog entry (slightly munged
> in git, perhaps something went wrong from the CVS import):
>
> 2005-12-20 Kevin Coffman <[email protected]> NeilBrown <[email protected]>
> Substantial Makefile/configure rewrite.
> Run 'autogen.sh' to create "Makefile.in" etc.
>
> Also add -D_FILE_OFFSET_BITS=64 to CPP_FLAGS so that mountd can
> stat and export files larger than 2Gig.
>
> 1.0.8-rc2 released
>
> I sort of suspect it was just copied blindly from somewhere...

Actually, it was copied carefully from the old config.mk.in :-)
It was in config.mk.in from the beginning, AFAICT.

-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
NFS maillist - [email protected]
https://lists.sourceforge.net/lists/listinfo/nfs

2007-08-07 22:15:18

by david m. richter

[permalink] [raw]
Subject: Re: [PATCH 7/7] nfsstat: add -D/--diff-stat

On Tue, 7 Aug 2007, Kevin Coffman wrote:

> On 8/7/07, Steinar H. Gunderson <[email protected]> wrote:
> > On Tue, Aug 07, 2007 at 05:26:13PM -0400, david m. richter wrote:
> > > does anyone know the reason behind no-floating-point-on-Alpha?
> >
> > It seems to have been added as part of this changelog entry (slightly munged
> > in git, perhaps something went wrong from the CVS import):
> >
> > 2005-12-20 Kevin Coffman <[email protected]> NeilBrown <[email protected]>
> > Substantial Makefile/configure rewrite.
> > Run 'autogen.sh' to create "Makefile.in" etc.
> >
> > Also add -D_FILE_OFFSET_BITS=64 to CPP_FLAGS so that mountd can
> > stat and export files larger than 2Gig.
> >
> > 1.0.8-rc2 released
> >
> > I sort of suspect it was just copied blindly from somewhere...
>
> Actually, it was copied carefully from the old config.mk.in :-)
> It was in config.mk.in from the beginning, AFAICT.

i'm curious -- is this something that can be removed from the
build stuff, then? (i haven't an Alpha on which to test..)

-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
NFS maillist - [email protected]
https://lists.sourceforge.net/lists/listinfo/nfs

2007-08-07 23:31:43

by Kevin Coffman

[permalink] [raw]
Subject: Re: [PATCH 7/7] nfsstat: add -D/--diff-stat

On 8/7/07, david m. richter <[email protected]> wrote:
> On Tue, 7 Aug 2007, Kevin Coffman wrote:
>
> > On 8/7/07, Steinar H. Gunderson <[email protected]> wrote:
> > > On Tue, Aug 07, 2007 at 05:26:13PM -0400, david m. richter wrote:
> > > > does anyone know the reason behind no-floating-point-on-Alpha?
> > >
> > > It seems to have been added as part of this changelog entry (slightly munged
> > > in git, perhaps something went wrong from the CVS import):
> > >
> > > 2005-12-20 Kevin Coffman <[email protected]> NeilBrown <[email protected]>
> > > Substantial Makefile/configure rewrite.
> > > Run 'autogen.sh' to create "Makefile.in" etc.
> > >
> > > Also add -D_FILE_OFFSET_BITS=64 to CPP_FLAGS so that mountd can
> > > stat and export files larger than 2Gig.
> > >
> > > 1.0.8-rc2 released
> > >
> > > I sort of suspect it was just copied blindly from somewhere...
> >
> > Actually, it was copied carefully from the old config.mk.in :-)
> > It was in config.mk.in from the beginning, AFAICT.
>
> i'm curious -- is this something that can be removed from the
> build stuff, then? (i haven't an Alpha on which to test..)

I've been looking back at the history. These alpha flags came from
the knfsd code. Looking at today's linux kernel code, it still has
these flags in arch/alpha/Makefile. Whether they are required for
user-land code, I don't know. (Whether they are req'd or really used
for kernel code, or are just some LCD thing, I don't know.)

-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
NFS maillist - [email protected]
https://lists.sourceforge.net/lists/listinfo/nfs

2007-08-09 01:25:24

by NeilBrown

[permalink] [raw]
Subject: Re: [PATCH 7/7] nfsstat: add -D/--diff-stat

On Tuesday August 7, [email protected] wrote:
> On Tue, Jul 31, 2007 at 05:39:49PM -0400, david m. richter wrote:
> > + double time_diff;
>
> Unfortunately, this breaks the build on alpha. For some reason, configure.ac
> does
>
> case $host in
> alpha*)
> ARCHFLAGS="-mno-fp-regs -ffixed-8" ;;
> *)
> ARCHFLAGS="" ;;
> esac
>
> which essentially means that you cannot use any floating-point in the program
> at all, according to the Debian alpha porters.
>
> Either this snippet must be removed for alpha (I presume it was put in for a
> reason at some point, but I have no idea what this reason was, and if it's
> still valid), or the code must be rewritten not to use floating-point.


I have removed this snippet. It is clearly only needed for kernel
code, not for regular user-space programs.

Thanks,
NeilBrown

-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
NFS maillist - [email protected]
https://lists.sourceforge.net/lists/listinfo/nfs