From patchwork Wed Nov 26 19:13:47 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Scott Mayhew X-Patchwork-Id: 5387481 Return-Path: X-Original-To: patchwork-linux-nfs@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 4770F9F2F5 for ; Wed, 26 Nov 2014 19:14:07 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 674FD201FB for ; Wed, 26 Nov 2014 19:14:06 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 5A41920204 for ; Wed, 26 Nov 2014 19:14:05 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751750AbaKZTOC (ORCPT ); Wed, 26 Nov 2014 14:14:02 -0500 Received: from mx1.redhat.com ([209.132.183.28]:41877 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751976AbaKZTOA (ORCPT ); Wed, 26 Nov 2014 14:14:00 -0500 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sAQJE0Tj016777 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Wed, 26 Nov 2014 14:14:00 -0500 Received: from tonberry.usersys.redhat.com (dhcp145-188.rdu.redhat.com [10.13.145.188]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sAQJDxq6018458 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 26 Nov 2014 14:14:00 -0500 Received: from tonberry.usersys.redhat.com (localhost [127.0.0.1]) by tonberry.usersys.redhat.com (8.14.8/8.14.5) with ESMTP id sAQJDxSH037751 for ; Wed, 26 Nov 2014 14:13:59 -0500 Received: (from smayhew@localhost) by tonberry.usersys.redhat.com (8.14.8/8.14.8/Submit) id sAQJDxmg037750 for linux-nfs@vger.kernel.org; Wed, 26 Nov 2014 14:13:59 -0500 From: Scott Mayhew To: linux-nfs@vger.kernel.org Subject: [nfs-utils PATCH v2 09/17] mountstats: Add support for -S/--since to the mountstats and ms-iostat commands Date: Wed, 26 Nov 2014 14:13:47 -0500 Message-Id: <1417029235-37675-10-git-send-email-smayhew@redhat.com> In-Reply-To: <1417029235-37675-1-git-send-email-smayhew@redhat.com> References: <1417029235-37675-1-git-send-email-smayhew@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 Sender: linux-nfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org X-Spam-Status: No, score=-6.9 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, T_RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Add support for -S/--since to the mountstats and ms-iostat commands to display the delta between a previous copy of /proc/self/mountstats and the current /proc/self/mountstats file. Can be combined with the -f option to show the statistics between two different points in time. Signed-off-by: Scott Mayhew --- tools/mountstats/mountstats.py | 50 +++++++++++++++++++++++++++++++----------- 1 file changed, 37 insertions(+), 13 deletions(-) diff --git a/tools/mountstats/mountstats.py b/tools/mountstats/mountstats.py index ddaa6c4..fac7853 100644 --- a/tools/mountstats/mountstats.py +++ b/tools/mountstats/mountstats.py @@ -548,11 +548,28 @@ def parse_stats_file(f): return ms_dict +def print_mountstats(stats, nfs_only, rpc_only): + if nfs_only: + stats.display_nfs_options() + stats.display_nfs_events() + stats.display_nfs_bytes() + elif rpc_only: + stats.display_rpc_generic_stats() + stats.display_rpc_op_stats() + else: + stats.display_nfs_options() + stats.display_nfs_bytes() + stats.display_rpc_generic_stats() + stats.display_rpc_op_stats() + def mountstats_command(args): """Mountstats command """ mountstats = parse_stats_file(args.infile) + if args.since: + old_mountstats = parse_stats_file(args.since) + for mp in args.mountpoints: if mp not in mountstats: print('Statistics for mount point %s not found' % mp) @@ -565,20 +582,19 @@ def mountstats_command(args): print('Mount point %s exists but is not an NFS mount' % mp) continue - if args.nfs_only: - stats.display_nfs_options() - stats.display_nfs_events() - stats.display_nfs_bytes() - elif args.rpc_only: - stats.display_rpc_generic_stats() - stats.display_rpc_op_stats() + if not args.since: + print_mountstats(stats, args.nfs_only, args.rpc_only) + elif args.since and mp not in old_mountstats: + print_mountstats(stats, args.nfs_only, args.rpc_only) else: - stats.display_nfs_options() - stats.display_nfs_bytes() - stats.display_rpc_generic_stats() - stats.display_rpc_op_stats() + old_stats = DeviceData() + old_stats.parse_stats(old_mountstats[mp]) + diff_stats = stats.compare_iostats(old_stats) + print_mountstats(diff_stats, args.nfs_only, args.rpc_only) args.infile.close() + if args.since: + args.since.close() def nfsstat_command(args): return @@ -601,6 +617,11 @@ def iostat_command(args): mountstats = parse_stats_file(args.infile) devices = args.mountpoints + if args.since: + old_mountstats = parse_stats_file(args.since) + else: + old_mountstats = None + # make certain devices contains only NFS mount points if len(devices) > 0: check = [] @@ -623,7 +644,6 @@ def iostat_command(args): print('No NFS mount points were found') return - old_mountstats = None sample_time = 0 if args.interval is None: @@ -648,6 +668,8 @@ def iostat_command(args): mountstats = parse_stats_file(args.infile) args.infile.close() + if args.since: + args.since.close() class ICMAction(argparse.Action): """Custom action to deal with interval, count, and mountpoints. @@ -667,7 +689,7 @@ class ICMAction(argparse.Action): try: intval = int(value) if namespace.infile.name != '/proc/self/mountstats': - raise argparse.ArgumentError(self, "not allowed with argument -f/--file") + raise argparse.ArgumentError(self, "not allowed with argument -f/--file or -S/--since") self._handle_int(namespace, intval) except ValueError: namespace.mountpoints.append(value) @@ -686,6 +708,8 @@ def main(): parser.add_argument('-f', '--file', default=open('/proc/self/mountstats', 'r'), type=argparse.FileType('r'), dest='infile', help='Read stats from %(dest)s instead of /proc/self/mountstats') + parser.add_argument('-S', '--since', type=argparse.FileType('r'), + help='Show difference between current stats and those in SINCE') prog = os.path.basename(sys.argv[0])