Relocate monitor-tools to stx-integ/tools/monitor-tools
Move content from stx-utils into stx-integ or stx-update Packages will be relocated to stx-update: enable-dev-patch extras stx-integ: config-files/ io-scheduler filesystem/ filesystem-scripts grub/ grubby logging/ logmgmt tools/ collector monitor-tools tools/engtools/ hostdata-collectors parsers utilities/ build-info branding (formerly wrs-branding) platform-util Change-Id: Id181ee00015b41c50c75250384e7fbf36a300c1c Story: 2002801 Task: 22687 Signed-off-by: Scott Little <scott.little@windriver.com>
This commit is contained in:
parent
7ca5359f3e
commit
1e75d19c9a
202
monitor-tools/LICENSE
Normal file
202
monitor-tools/LICENSE
Normal file
@ -0,0 +1,202 @@
|
||||
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright [yyyy] [name of copyright owner]
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
2
monitor-tools/centos/build_srpm.data
Normal file
2
monitor-tools/centos/build_srpm.data
Normal file
@ -0,0 +1,2 @@
|
||||
SRC_DIR=scripts
|
||||
TIS_PATCH_VER=0
|
34
monitor-tools/centos/monitor-tools.spec
Normal file
34
monitor-tools/centos/monitor-tools.spec
Normal file
@ -0,0 +1,34 @@
|
||||
Summary: Monitor tools package
|
||||
Name: monitor-tools
|
||||
Version: 1.0
|
||||
Release: %{tis_patch_ver}%{?_tis_dist}
|
||||
License: Apache-2.0
|
||||
Group: base
|
||||
Packager: Wind River <info@windriver.com>
|
||||
URL: unknown
|
||||
BuildArch: noarch
|
||||
Source: %name-%version.tar.gz
|
||||
#Requires: /usr/bin/perl
|
||||
|
||||
%description
|
||||
This package contains data collection tools to monitor host performance.
|
||||
Tools are general purpose engineering and debugging related. Includes
|
||||
overall memory, cpu occupancy, per-task cpu, per-task scheduling, per-task
|
||||
io.
|
||||
|
||||
%prep
|
||||
%autosetup
|
||||
|
||||
%install
|
||||
rm -rf $RPM_BUILD_ROOT
|
||||
%global _buildsubdir %{_builddir}/%{name}-%{version}
|
||||
install -d %{buildroot}/usr/bin
|
||||
install %{_buildsubdir}/memtop %{buildroot}/usr/bin
|
||||
install %{_buildsubdir}/schedtop %{buildroot}/usr/bin
|
||||
install %{_buildsubdir}/occtop %{buildroot}/usr/bin
|
||||
|
||||
%files
|
||||
%license LICENSE
|
||||
%defattr(-,root,root,-)
|
||||
/usr/bin/*
|
||||
|
202
monitor-tools/scripts/LICENSE
Normal file
202
monitor-tools/scripts/LICENSE
Normal file
@ -0,0 +1,202 @@
|
||||
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright [yyyy] [name of copyright owner]
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
344
monitor-tools/scripts/memtop
Executable file
344
monitor-tools/scripts/memtop
Executable file
@ -0,0 +1,344 @@
|
||||
#!/usr/bin/perl
|
||||
########################################################################
|
||||
#
|
||||
# Copyright (c) 2015 Wind River Systems, Inc.
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
#
|
||||
########################################################################
|
||||
#
|
||||
# Description:
|
||||
# This displays overall memory information per sample period.
|
||||
# Output includes total, used, avail, per-numa node breakdown of avail
|
||||
# and free hugepages memory.
|
||||
#
|
||||
# Usage: memtop OPTIONS
|
||||
# memtop [--delay=<seconds>] [--repeat=<num>] [--period=<seconds>] [--help]
|
||||
#
|
||||
|
||||
# Summarize high-level memory usage.
|
||||
use 5.10.0;
|
||||
use warnings;
|
||||
use strict;
|
||||
use Benchmark ':hireswallclock';
|
||||
use POSIX qw(strftime);
|
||||
use Data::Dumper;
|
||||
use File::Basename;
|
||||
use File::Spec ();
|
||||
use Time::HiRes qw(time usleep);
|
||||
use Carp qw(croak carp);
|
||||
|
||||
# IEC and SI constants
|
||||
use constant SI_k => 1.0E3;
|
||||
use constant SI_M => 1.0E6;
|
||||
use constant SI_G => 1.0E9;
|
||||
use constant Ki => 1024.0;
|
||||
use constant Mi => 1024.0*1024.0;
|
||||
use constant Gi => 1024.0*1024.0*1024.0;
|
||||
|
||||
# Name of this program
|
||||
our $TOOLNAME = basename($0);
|
||||
our $VERSION = "0.1";
|
||||
|
||||
# Argument list parameters
|
||||
our ($arg_debug,
|
||||
$arg_delay,
|
||||
$arg_repeat,
|
||||
$arg_period) = ();
|
||||
|
||||
# Globals
|
||||
our $t_0 = ();
|
||||
our $t_1 = ();
|
||||
our $t_elapsed = ();
|
||||
our $t_final = ();
|
||||
our $is_strict = ();
|
||||
our $num_nodes = ();
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
# MAIN Program
|
||||
#-------------------------------------------------------------------------------
|
||||
# benchmark variables
|
||||
my ($bd, $b0, $b1);
|
||||
|
||||
# Autoflush output
|
||||
select(STDERR);
|
||||
$| = 1;
|
||||
select(STDOUT); # default
|
||||
$| = 1;
|
||||
|
||||
# Parse input arguments and print tool usage if necessary
|
||||
&parse_memtop_args(
|
||||
\$::arg_debug,
|
||||
\$::arg_delay,
|
||||
\$::arg_repeat,
|
||||
\$::arg_period,
|
||||
);
|
||||
|
||||
# Print out some debugging information
|
||||
if (defined $::arg_debug) {
|
||||
$Data::Dumper::Indent = 1;
|
||||
}
|
||||
|
||||
# Strict vs non-strict memory accounting
|
||||
$::is_strict = &is_strict();
|
||||
|
||||
# Number of numa nodes
|
||||
$::num_nodes = &num_numa_nodes();
|
||||
|
||||
# Print tool header and selected options
|
||||
printf "%s %s -- ".
|
||||
"selected options: delay = %.3fs, repeat = %d, period = %.3fs, %s, unit = %s\n",
|
||||
$::TOOLNAME, $::VERSION,
|
||||
$::arg_delay, $::arg_repeat, $::arg_period,
|
||||
$::is_strict ? 'strict' : 'non-strict',
|
||||
'MiB';
|
||||
|
||||
# Capture timestamp
|
||||
$b0 = new Benchmark;
|
||||
|
||||
# Get current hires epoc timestamp
|
||||
$::t_1 = time();
|
||||
$::t_final = $::t_1 + $::arg_period;
|
||||
|
||||
# Set initial delay
|
||||
$::t_elapsed = $::arg_delay;
|
||||
|
||||
# Main loop
|
||||
my $delay = SI_M*$::arg_delay - 600.0;
|
||||
REPEAT_LOOP: for (my $rep=1; $rep <= $::arg_repeat; $rep++) {
|
||||
# Copy all state variables
|
||||
$::t_0 = $::t_1;
|
||||
|
||||
# Sleep for desired interarrival time
|
||||
usleep( $delay );
|
||||
|
||||
# Current hires epoc timestamp
|
||||
$::t_1 = time();
|
||||
|
||||
# Delta calculation
|
||||
$::t_elapsed = $::t_1 - $::t_0;
|
||||
|
||||
# Print summary
|
||||
&print_memory(\$::t_1);
|
||||
|
||||
# Exit if we have reached period
|
||||
last if ((defined $::t_final) && ($::t_1 > $::t_final));
|
||||
}
|
||||
|
||||
# Print that tool has finished
|
||||
print "done\n";
|
||||
|
||||
# Capture timestamp and report delta
|
||||
if (defined $::arg_debug) {
|
||||
$b1 = new Benchmark; $bd = Benchmark::timediff($b1, $b0);
|
||||
printf "processing time: %s\n", timestr($bd);
|
||||
}
|
||||
exit 0;
|
||||
|
||||
|
||||
################################################################################
|
||||
|
||||
# Parse input option arguments
|
||||
sub parse_memtop_args {
|
||||
(local *::arg_debug,
|
||||
local *::arg_delay,
|
||||
local *::arg_repeat,
|
||||
local *::arg_period,
|
||||
) = @_;
|
||||
|
||||
# Local variables
|
||||
my ($fail, $arg_help);
|
||||
|
||||
# Use the Argument processing module
|
||||
use Getopt::Long;
|
||||
|
||||
# Process input arguments
|
||||
$fail = 0;
|
||||
GetOptions(
|
||||
"debug:i", \$::arg_debug,
|
||||
"delay=f", \$::arg_delay,
|
||||
"repeat=i", \$::arg_repeat,
|
||||
"period=i", \$::arg_period,
|
||||
"help|h", \$arg_help
|
||||
) || GetOptionsMessage();
|
||||
|
||||
# Print help documentation if user has selected --help
|
||||
&ListHelp() if (defined $arg_help);
|
||||
|
||||
# Validate options
|
||||
if ((defined $::arg_repeat) && (defined $::arg_period)) {
|
||||
$fail = 1;
|
||||
warn "$::TOOLNAME: Input error: cannot specify both --repeat and --period options.\n";
|
||||
}
|
||||
if ((defined $::arg_delay) && ($::arg_delay < 0.01)) {
|
||||
$fail = 1;
|
||||
warn "$::TOOLNAME: Input error: --delay %f is less than 0.01.\n",
|
||||
$::arg_delay;
|
||||
}
|
||||
if (@::ARGV) {
|
||||
$fail = 1;
|
||||
warn "$::TOOLNAME: Input error: not expecting these options: '@::ARGV'.\n";
|
||||
}
|
||||
|
||||
# Set reasonable defaults
|
||||
$::arg_delay ||= 1.0;
|
||||
$::arg_repeat ||= 1;
|
||||
if ($::arg_period) {
|
||||
$::arg_repeat = $::arg_period / $::arg_delay;
|
||||
} else {
|
||||
$::arg_period = $::arg_delay * $::arg_repeat;
|
||||
}
|
||||
|
||||
# Upon missing or invalid options, print usage
|
||||
if ($fail == 1) {
|
||||
&Usage();
|
||||
exit 1;
|
||||
}
|
||||
}
|
||||
|
||||
# Print out a warning message and usage
|
||||
sub GetOptionsMessage {
|
||||
warn "$::TOOLNAME: Error processing input arguments.\n";
|
||||
&Usage();
|
||||
exit 1;
|
||||
}
|
||||
|
||||
# Print out program usage
|
||||
sub Usage {
|
||||
printf "Usage: $::TOOLNAME OPTIONS\n";
|
||||
printf " [--delay=<seconds>] [--repeat=<num>] [--period=<seconds>]\n";
|
||||
printf " [--help]\n";
|
||||
printf "\n";
|
||||
}
|
||||
|
||||
# Print tool help
|
||||
sub ListHelp {
|
||||
printf "$::TOOLNAME -- displays high memory usage at high level\n";
|
||||
&Usage();
|
||||
printf " --delay=<seconds> : output interval (seconds): default: 1.0\n";
|
||||
printf " --repeat=<num> : number of repeat samples: default: 1\n";
|
||||
printf " --period=<seconds> : overall tool duration (seconds): default: --\n";
|
||||
printf " --help : this help\n";
|
||||
printf "\n";
|
||||
exit 0;
|
||||
}
|
||||
|
||||
# Print memory summary
|
||||
sub print_memory {
|
||||
(local *::t_1) = @_;
|
||||
|
||||
# counter
|
||||
our $count;
|
||||
$::count++; $::count %= 15;
|
||||
|
||||
my ($file, $n);
|
||||
my %mem = ();
|
||||
my %node = ();
|
||||
|
||||
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst);
|
||||
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($::t_1);
|
||||
my $msec = 1000.0*($::t_1 - int($::t_1));
|
||||
|
||||
# Process all entries of MEMINFO
|
||||
$file = '/proc/meminfo';
|
||||
open(FILE, $file) || die "Cannot open file: $file ($!)";
|
||||
while($_ = <FILE>) {
|
||||
s/[\0\e\f\r\a]//g; chomp; # strip control characters if any
|
||||
if (/^(\S+):\s+(\d+)\b/) {
|
||||
$mem{$1} = $2;
|
||||
}
|
||||
}
|
||||
close(FILE);
|
||||
|
||||
# Process all entries of per-Node MEMINFO
|
||||
for ($n=0; $n < $::num_nodes; $n++) {
|
||||
$file = sprintf('/sys/devices/system/node/node%d/meminfo', $n);
|
||||
open(FILE, $file) || die "Cannot open file: $file ($!)";
|
||||
while($_ = <FILE>) {
|
||||
s/[\0\e\f\r\a]//g; chomp; # strip control characters if any
|
||||
if (/^Node\s+(\d+)\s+(\S+):\s+(\d+)\b/) {
|
||||
$node{$1}{$2} = $3;
|
||||
}
|
||||
}
|
||||
close(FILE);
|
||||
}
|
||||
|
||||
# Calculate available memory
|
||||
if ($::is_strict) {
|
||||
$mem{'Avail'} = $mem{'CommitLimit'} - $mem{'Committed_AS'};
|
||||
} else {
|
||||
$mem{'Avail'} = $mem{'MemFree'} +
|
||||
$mem{'Cached'} +
|
||||
$mem{'Buffers'} +
|
||||
$mem{'SReclaimable'};
|
||||
}
|
||||
$mem{'Used'} = $mem{'MemTotal'} - $mem{'Avail'};
|
||||
$mem{'Anon'} = $mem{'AnonPages'};
|
||||
for ($n=0; $n < $::num_nodes; $n++) {
|
||||
$node{$n}{'Avail'} = $node{$n}{'MemFree'} +
|
||||
$node{$n}{'FilePages'} +
|
||||
$node{$n}{'SReclaimable'};
|
||||
$node{$n}{'HFree'} = $node{$n}{'HugePages_Free'} * $mem{'Hugepagesize'};
|
||||
}
|
||||
|
||||
# Print heading every so often
|
||||
if ($::count == 1) {
|
||||
printf "%s ".
|
||||
"%8s %8s %8s %7s %6s %6s %8s %8s %7s %7s %8s %8s",
|
||||
'yyyy-mm-dd hh:mm:ss.fff',
|
||||
'Tot', 'Used', 'Free', 'Ca', 'Buf', 'Slab', 'CAS', 'CLim', 'Dirty', 'WBack', 'Anon', 'Avail';
|
||||
for ($n=0; $n < $::num_nodes; $n++) {
|
||||
printf " %8s %8s", sprintf('%d:Avail', $n), sprintf('%d:HFree', $n);
|
||||
}
|
||||
printf "\n";
|
||||
}
|
||||
|
||||
# Print one line memory summary
|
||||
printf "%4d-%02d-%02d %02d:%02d:%02d.%03d ".
|
||||
"%8.1f %8.1f %8.1f %7.1f %6.1f %6.1f %8.1f %8.1f %7.1f %7.1f %8.1f %8.1f",
|
||||
1900+$year, 1+$mon, $mday, $hour, $min, $sec, $msec,
|
||||
$mem{'MemTotal'}/Ki,
|
||||
$mem{'Used'}/Ki,
|
||||
$mem{'MemFree'}/Ki,
|
||||
$mem{'Cached'}/Ki,
|
||||
$mem{'Buffers'}/Ki,
|
||||
$mem{'Slab'}/Ki,
|
||||
$mem{'Committed_AS'}/Ki,
|
||||
$mem{'CommitLimit'}/Ki,
|
||||
$mem{'Dirty'}/Ki,
|
||||
$mem{'Writeback'}/Ki,
|
||||
$mem{'Anon'}/Ki,
|
||||
$mem{'Avail'}/Ki;
|
||||
for ($n=0; $n < $::num_nodes; $n++) {
|
||||
printf " %8.1f %8.1f", $node{$n}{'Avail'}/Ki, $node{$n}{'HFree'}/Ki;
|
||||
}
|
||||
printf "\n";
|
||||
|
||||
}
|
||||
|
||||
sub num_numa_nodes {
|
||||
my $file = '/proc/cpuinfo';
|
||||
my %nodes = ();
|
||||
open(FILE, $file) || die "Cannot open file: $file ($!)";
|
||||
while($_ = <FILE>) {
|
||||
s/[\0\e\f\r\a]//g; chomp; # strip control characters if any
|
||||
if (/^physical\s+id\s+:\s+(\d+)\b/) {
|
||||
$nodes{$1} = 1;
|
||||
}
|
||||
}
|
||||
close(FILE);
|
||||
return scalar keys %nodes;
|
||||
}
|
||||
|
||||
sub is_strict {
|
||||
my $value = 0;
|
||||
my $file = '/proc/sys/vm/overcommit_memory';
|
||||
open(FILE, $file) || die "Cannot open file: $file ($!)";
|
||||
$_ = <FILE>;
|
||||
$value = /(\d+)/;
|
||||
close(FILE);
|
||||
return ($value == 2) ? 1 : 0;
|
||||
}
|
||||
|
||||
1;
|
592
monitor-tools/scripts/occtop
Executable file
592
monitor-tools/scripts/occtop
Executable file
@ -0,0 +1,592 @@
|
||||
#!/usr/bin/perl
|
||||
########################################################################
|
||||
#
|
||||
# Copyright (c) 2015-2016 Wind River Systems, Inc.
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
#
|
||||
########################################################################
|
||||
#
|
||||
# Description:
|
||||
# This displays per-core occupancy information per sample period.
|
||||
# Output includes total occupancy, and per-core occupancy based on
|
||||
# hi-resolution timings.
|
||||
#
|
||||
# Usage: occtop OPTIONS
|
||||
# [--delay=<seconds>] [--repeat=<num>] [--period=<seconds>]
|
||||
# [--header=<num>]
|
||||
# [--help]
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Data::Dumper;
|
||||
use POSIX qw(uname strftime);
|
||||
use Time::HiRes qw(clock_gettime usleep CLOCK_MONOTONIC CLOCK_REALTIME);
|
||||
|
||||
use Benchmark ':hireswallclock';
|
||||
use Carp qw(croak carp);
|
||||
|
||||
# Define toolname
|
||||
our $TOOLNAME = "occtop";
|
||||
our $VERSION = "0.1";
|
||||
|
||||
# Constants
|
||||
use constant SI_k => 1.0E3;
|
||||
use constant SI_M => 1.0E6;
|
||||
use constant SI_G => 1.0E9;
|
||||
use constant Ki => 1024.0;
|
||||
use constant Mi => 1024.0*1024.0;
|
||||
use constant Gi => 1024.0*1024.0*1024.0;
|
||||
|
||||
# Globals
|
||||
our %percpu_0 = ();
|
||||
our %percpu_1 = ();
|
||||
our %D_percpu = ();
|
||||
our %loadavg = ();
|
||||
our $D_total = 0.0;
|
||||
our $tm_0 = 0.0;
|
||||
our $tm_1 = 0.0;
|
||||
our $tr_0 = 0.0;
|
||||
our $tr_1 = 0.0;
|
||||
our $tm_elapsed = 0.0;
|
||||
our $tm_final = 0.0;
|
||||
our $uptime = 0.0;
|
||||
our $num_cpus = 1;
|
||||
our $num_tasks = 0;
|
||||
our $num_blk = 0;
|
||||
our $print_host = 1;
|
||||
our $is_schedstat = 1;
|
||||
our $USER_HZ = 100; # no easy way to get this
|
||||
our $CLOCK_NS = SI_G / $USER_HZ;
|
||||
|
||||
# Argument list parameters
|
||||
our ($arg_debug,
|
||||
$arg_delay,
|
||||
$arg_repeat,
|
||||
$arg_period,
|
||||
$arg_header,
|
||||
) = ();
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
# MAIN Program
|
||||
#-------------------------------------------------------------------------------
|
||||
my $MIN_DELAY = 0.001;
|
||||
my $MAX_DELAY = 0.001;
|
||||
|
||||
# benchmark variables
|
||||
my ($bd, $b0, $b1);
|
||||
|
||||
# Autoflush output
|
||||
select(STDERR);
|
||||
$| = 1;
|
||||
select(STDOUT); # default
|
||||
$| = 1;
|
||||
|
||||
# Parse input arguments and print tool usage if necessary
|
||||
&parse_occtop_args(
|
||||
\$::arg_debug,
|
||||
\$::arg_delay,
|
||||
\$::arg_repeat,
|
||||
\$::arg_period,
|
||||
\$::arg_header,
|
||||
);
|
||||
|
||||
# Print out some debugging information
|
||||
if (defined $::arg_debug) {
|
||||
$Data::Dumper::Indent = 1;
|
||||
}
|
||||
|
||||
# Check for schedstat support; fallback to stats
|
||||
$is_schedstat = -e '/proc/schedstat' ? 1 : 0;
|
||||
|
||||
# Print out selected options
|
||||
printf "selected options: delay = %.3fs, repeat = %d, header = %d, source = %s\n",
|
||||
$::arg_delay, $::arg_repeat, $::arg_header, $is_schedstat ? 'schedstat' : 'jiffie';
|
||||
|
||||
# Capture timestamp
|
||||
$b0 = new Benchmark;
|
||||
|
||||
# Get number of logical cpus
|
||||
&get_num_logical_cpus(\$::num_cpus);
|
||||
|
||||
|
||||
# Get current hires epoc timestamp
|
||||
$::tm_1 = clock_gettime(CLOCK_MONOTONIC);
|
||||
$::tr_1 = clock_gettime(CLOCK_REALTIME);
|
||||
$::tm_final = $::tm_1 + $::arg_delay*$::arg_repeat;
|
||||
|
||||
# Set initial delay
|
||||
$::tm_elapsed = $::arg_delay;
|
||||
$MAX_DELAY = $::arg_delay + $MIN_DELAY;
|
||||
|
||||
# Get overall per-cpu stats
|
||||
if ($is_schedstat) {
|
||||
&read_schedstat(\%::percpu_1);
|
||||
} else {
|
||||
&read_stat(\%::percpu_1);
|
||||
}
|
||||
|
||||
# Main loop
|
||||
REPEAT_LOOP: for (my $repeat=1; $repeat <= $::arg_repeat; $repeat++) {
|
||||
|
||||
# copy all state variables
|
||||
%::tm_0 = (); %::tr_0 = (); %::percpu_0 = ();
|
||||
$::tm_0 = $::tm_1; $::tr_0 = $::tr_1;
|
||||
foreach my $cpu (keys %::percpu_1) { $::percpu_0{$cpu} = $::percpu_1{$cpu}; }
|
||||
|
||||
# estimate sleep delay to achieve desired interarrival by subtracting out
|
||||
# the measured cpu runtime of the tool.
|
||||
my $delay = $::arg_delay;
|
||||
$delay = $MIN_DELAY if ($delay < $MIN_DELAY);
|
||||
$delay = $MAX_DELAY if ($delay > $MAX_DELAY);
|
||||
usleep( SI_M*$delay );
|
||||
|
||||
# Collect current state
|
||||
$::tm_1 = (); $::tr_1 = (); %::percpu_1 = ();
|
||||
# Get current hires epoc timestamp
|
||||
$::tm_1 = clock_gettime(CLOCK_MONOTONIC);
|
||||
$::tr_1 = clock_gettime(CLOCK_REALTIME);
|
||||
# Get overall per-cpu stats
|
||||
if ($is_schedstat) {
|
||||
&read_schedstat(\%::percpu_1);
|
||||
} else {
|
||||
&read_stat(\%::percpu_1);
|
||||
}
|
||||
|
||||
# Get current uptime
|
||||
&get_uptime(\$::uptime);
|
||||
# Get current loadavg
|
||||
&get_loadavg(\%::loadavg, \$::runq, \$::num_tasks);
|
||||
# Get current processes blocked
|
||||
&get_blocked(\$::num_blk);
|
||||
|
||||
# Delta calculation
|
||||
%::D_percpu = ();
|
||||
$::tm_elapsed = $tm_1 - $tm_0;
|
||||
foreach my $cpu (keys %::percpu_1) {
|
||||
$::D_percpu{$cpu}{'runtime'} = ($::percpu_1{$cpu} - $::percpu_0{$cpu})/1.0E6;
|
||||
if ($::tm_elapsed > 0.0) {
|
||||
$::D_percpu{$cpu}{'occ'} = 100.0*$D_percpu{$cpu}{'runtime'}/1.0E3/$::tm_elapsed;
|
||||
} else {
|
||||
$::D_percpu{$cpu}{'occ'} = 0.0;
|
||||
}
|
||||
}
|
||||
|
||||
# Print tool header
|
||||
if ($repeat == 1) {
|
||||
&occtop_header(
|
||||
\$::tr_1,
|
||||
\$::uptime,
|
||||
\%::loadavg,
|
||||
\$::runq,
|
||||
\$::num_blk,
|
||||
\$::num_tasks,
|
||||
\$::print_host,
|
||||
);
|
||||
}
|
||||
|
||||
# Print one-liner summary
|
||||
&print_occtop(
|
||||
\$::tr_1,
|
||||
\$::num_cpus,
|
||||
\%::D_percpu,
|
||||
\$::arg_header,
|
||||
);
|
||||
|
||||
# exit repeat loop if we have exceeded overall time
|
||||
last if ($::tm_1 > $::tm_final);
|
||||
|
||||
} # REPEAT LOOP
|
||||
|
||||
# Print that tool has finished
|
||||
print "done\n";
|
||||
|
||||
# Capture timestamp and report delta
|
||||
$b1 = new Benchmark; $bd = Benchmark::timediff($b1, $b0);
|
||||
printf "processing time: %s\n", timestr($bd);
|
||||
exit 0;
|
||||
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
|
||||
# Parse per-cpu hi-resolution scheduling stats
|
||||
sub read_schedstat
|
||||
{
|
||||
(local *::percpu) = @_;
|
||||
my ($version, $timestamp);
|
||||
my ($cpu, $cputime);
|
||||
my ($fh, $file);
|
||||
|
||||
%::percpu = ();
|
||||
|
||||
# parse /proc/schedstat
|
||||
$file = '/proc/schedstat';
|
||||
open($fh, $file) || croak "Cannot open file: $file ($!)";
|
||||
$_ = <$fh>; ($version) = /^version\s+(\d+)/;
|
||||
$_ = <$fh>; ($timestamp) = /^timestamp\s+(\d+)/;
|
||||
|
||||
if ($version == 15) {
|
||||
LOOP_SCHEDSTAT: while (<$fh>) {
|
||||
# version 15: cputime is 7th field
|
||||
if (/^cpu(\d+)\s+\d+\s+\d+\s+\d+\s+\d+\s+\d+\s+\d+\s+(\d+)\s+/) {
|
||||
$cpu = $1; $cputime = $2;
|
||||
$::percpu{$cpu} = $cputime;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
croak "schedstat version: $version method not implemented.";
|
||||
}
|
||||
close($fh);
|
||||
}
|
||||
|
||||
# Parse per-cpu jiffie stats; cputime excludes iowait.
|
||||
sub read_stat
|
||||
{
|
||||
(local *::percpu) = @_;
|
||||
my ($cpu, $cputime);
|
||||
my ($user, $sys, $nice, $idle, $iowt, $hirq, $sirq);
|
||||
my ($fh, $file);
|
||||
|
||||
%::percpu = ();
|
||||
|
||||
# parse /proc/stat
|
||||
$file = '/proc/stat';
|
||||
open($fh, $file) || croak "Cannot open file: $file ($!)";
|
||||
LOOP_STAT: while (<$fh>) {
|
||||
if (/^cpu(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+/) {
|
||||
$cpu =$1; $user = $2; $sys = $3; $nice = $4; $idle = $5; $iowt = $6; $hirq = $7; $sirq = $8;
|
||||
$cputime = $CLOCK_NS * ($user + $sys + $nice + $iowt + $hirq + $sirq);
|
||||
$::percpu{$cpu} = $cputime;
|
||||
}
|
||||
}
|
||||
close($fh);
|
||||
}
|
||||
|
||||
# Parse load-average from /proc/loadavg
|
||||
sub get_loadavg
|
||||
{
|
||||
(local *::loadavg, local *::runq, *::num_tasks) = @_;
|
||||
|
||||
$::loadavg{'1'} = 0.0;
|
||||
$::loadavg{'5'} = 0.0;
|
||||
$::loadavg{'15'} = 0.0;
|
||||
$::runq = 0;
|
||||
$::num_tasks = 0;
|
||||
|
||||
my $file = '/proc/loadavg';
|
||||
open(my $fh, $file) || croak "Cannot open file: $file ($!)";
|
||||
$_ = <$fh>;
|
||||
if (/^(\S+)\s+(\S+)\s+(\S+)\s+(\d+)\/(\d+)\s+\d+/) {
|
||||
$::loadavg{'1'} = $1;
|
||||
$::loadavg{'5'} = $2;
|
||||
$::loadavg{'15'} = $3;
|
||||
$::runq = $4;
|
||||
$::num_tasks = $5;
|
||||
}
|
||||
close($fh);
|
||||
}
|
||||
|
||||
# Parse blocked from /proc/stat
|
||||
sub get_blocked
|
||||
{
|
||||
(local *::num_blk) = @_;
|
||||
|
||||
$::num_blk = 0;
|
||||
|
||||
my $file = '/proc/stat';
|
||||
open(my $fh, $file) || croak "Cannot open file: $file ($!)";
|
||||
while ($_ = <$fh>) {
|
||||
if (/^procs_blocked\s+(\d+)/) {
|
||||
$::num_blk = $1;
|
||||
}
|
||||
}
|
||||
close($fh);
|
||||
}
|
||||
|
||||
# Parse uptime from /proc/uptime
|
||||
sub get_uptime
|
||||
{
|
||||
(local *::uptime) = @_;
|
||||
$::uptime = 0.0;
|
||||
|
||||
my $file = '/proc/uptime';
|
||||
open(my $fh, $file) || croak "Cannot open file: $file ($!)";
|
||||
$_ = <$fh>;
|
||||
if (/^(\S+)\s+\S+/) {
|
||||
$::uptime = $1;
|
||||
}
|
||||
close($fh);
|
||||
}
|
||||
|
||||
# Get number of online logical cpus
|
||||
sub get_num_logical_cpus {
|
||||
(local *::num_cpus) = @_;
|
||||
$::num_cpus = 0;
|
||||
|
||||
my $file = "/proc/cpuinfo";
|
||||
open(my $fh, $file) || croak "Cannot open file: $file ($!)";
|
||||
LOOP_CPUINFO: while (<$fh>) {
|
||||
if (/^[Pp]rocessor\s+:\s\d+/) {
|
||||
$::num_cpus++;
|
||||
}
|
||||
}
|
||||
close($fh);
|
||||
}
|
||||
|
||||
# Print occupancy summary
|
||||
sub print_occtop {
|
||||
(local *::tr_1,
|
||||
local *::num_cpus,
|
||||
local *::D_percpu,
|
||||
local *::arg_header,
|
||||
) = @_;
|
||||
|
||||
# counter
|
||||
our $count;
|
||||
$::count++; $::count %= $::arg_header;
|
||||
$::count = 1 if ($::arg_header == 1);
|
||||
|
||||
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst);
|
||||
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($::tr_1);
|
||||
my $msec = 1000.0*($::tr_1 - int($::tr_1));
|
||||
|
||||
# Print heading every so often
|
||||
if ($::count == 1) {
|
||||
printf "%s ".
|
||||
"%7s ",
|
||||
'yyyy-mm-dd hh:mm:ss.fff',
|
||||
'total';
|
||||
for (my $cpu=0; $cpu < $::num_cpus; $cpu++) {
|
||||
printf "%5s ", $cpu;
|
||||
}
|
||||
print "\n";
|
||||
}
|
||||
|
||||
# Print one summary
|
||||
my $occ_total = 0.0;
|
||||
for (my $cpu=0; $cpu < $::num_cpus; $cpu++) {
|
||||
$occ_total += $::D_percpu{$cpu}{'occ'};
|
||||
}
|
||||
printf "%4d-%02d-%02d %02d:%02d:%02d.%03d ".
|
||||
"%7.1f ",
|
||||
1900+$year, 1+$mon, $mday, $hour, $min, $sec, $msec,
|
||||
$occ_total;
|
||||
for (my $cpu=0; $cpu < $::num_cpus; $cpu++) {
|
||||
printf "%5.1f ", $::D_percpu{$cpu}{'occ'};
|
||||
}
|
||||
print "\n";
|
||||
}
|
||||
|
||||
# Print header
|
||||
sub occtop_header {
|
||||
(local *::tr_1,
|
||||
local *::uptime,
|
||||
local *::loadavg,
|
||||
local *::runq,
|
||||
local *::num_blk,
|
||||
local *::num_tasks,
|
||||
local *::print_host,
|
||||
) = @_;
|
||||
|
||||
# process epoch to get current timestamp
|
||||
my $mm_in_s = 60;
|
||||
my $hh_in_s = 60*60;
|
||||
my $dd_in_s = 24*60*60;
|
||||
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst);
|
||||
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($::tr_1);
|
||||
my $msec = 1000.0*($::tr_1 - int($::tr_1));
|
||||
|
||||
# convert uptime to elapsed <d>:<hh>:<mm>:<ss>
|
||||
my ($up, $up_dd, $up_hh, $up_mm, $up_ss);
|
||||
$up = int($::uptime);
|
||||
$up_dd = int($up/$dd_in_s);
|
||||
$up -= $dd_in_s*$up_dd;
|
||||
$up_hh = int($up/$hh_in_s);
|
||||
$up -= $hh_in_s*$up_hh;
|
||||
$up_mm = int($up/$mm_in_s);
|
||||
$up -= $mm_in_s*$up_mm;
|
||||
$up_ss = $up;
|
||||
|
||||
#occtop -- 2014/03/03 02:00:21.357 ldavg:0.07, 0.09, 0.08 runq:1 nproc:440 up:6:13:00:56
|
||||
printf "%s %s -- ".
|
||||
"%4d-%02d-%02d %02d:%02d:%02d.%03d ".
|
||||
"ldavg:%.2f, %.2f, %.2f runq:%d blk:%d nproc:%d ".
|
||||
"up:%d:%02d:%02d:%02d\n",
|
||||
$::TOOLNAME, $::VERSION,
|
||||
1900+$year, 1+$mon, $mday, $hour, $min, $sec, $msec,
|
||||
$::loadavg{'1'}, $::loadavg{'5'}, $::loadavg{'15'},
|
||||
$::runq, $::num_blk, $::num_tasks,
|
||||
$up_dd, $up_hh, $up_mm, $up_ss;
|
||||
|
||||
return if (!($::print_host));
|
||||
|
||||
# After first print, disable print host information
|
||||
$::print_host = 0;
|
||||
|
||||
# Get host specific information
|
||||
my ($OSTYPE, $NODENAME, $OSRELEASE, $version, $MACHINE);
|
||||
($OSTYPE, $NODENAME, $OSRELEASE, $version, $MACHINE) = POSIX::uname();
|
||||
my ($NODETYPE, $SUBFUNCTION, $BUILDINFO) = ('-', '-', '-');
|
||||
my ($SW_VERSION, $BUILD_ID) = ('-', '-');
|
||||
|
||||
# Get platform nodetype and subfunction
|
||||
PLATFORM: {
|
||||
my $file = "/etc/platform/platform.conf";
|
||||
open(FILE, $file) || next;
|
||||
while($_ = <FILE>) {
|
||||
s/[\0\e\f\r\a]//g; chomp; # strip control characters if any
|
||||
if (/^nodetype=(\S+)/) {
|
||||
$NODETYPE = $1;
|
||||
}
|
||||
if (/^subfunction=(\S+)/) {
|
||||
$SUBFUNCTION = $1;
|
||||
}
|
||||
}
|
||||
close(FILE);
|
||||
}
|
||||
|
||||
# Get loadbuild info
|
||||
BUILD: {
|
||||
my $file = "/etc/build.info";
|
||||
open(FILE, $file) || next;
|
||||
while($_ = <FILE>) {
|
||||
s/[\0\e\f\r\a]//g; chomp; # strip control characters if any
|
||||
if (/^SW_VERSION=\"([^"]+)\"/) {
|
||||
$SW_VERSION = $1;
|
||||
}
|
||||
if (/^BUILD_ID=\"([^"]+)\"/) {
|
||||
$BUILD_ID = $1;
|
||||
}
|
||||
}
|
||||
close(FILE);
|
||||
}
|
||||
$BUILDINFO = join(' ', $SW_VERSION, $BUILD_ID);
|
||||
|
||||
# Parse /proc/cpuinfo to get specific processor info
|
||||
my ($n_cpu, $model_name, $cpu_MHz) = (0, '-', 0);
|
||||
CPUINFO: {
|
||||
my $file = "/proc/cpuinfo";
|
||||
open(FILE, $file) || croak "Cannot open file: $file ($!)";
|
||||
while($_ = <FILE>) {
|
||||
s/[\0\e\f\r\a]//g; chomp; # strip control characters if any
|
||||
if (/^[Pp]rocessor\s+:\s+\d+/) {
|
||||
$n_cpu++;
|
||||
} elsif (/^model name\s+:\s+(.*)$/) {
|
||||
$_ = $1; s/\s+/ /g;
|
||||
$model_name = $_;
|
||||
} elsif (/^cpu MHz\s+:\s+(\S+)/) {
|
||||
$cpu_MHz = $1;
|
||||
} elsif (/^bogomips\s+:\s+(\S+)/) {
|
||||
$cpu_MHz = $1 if ($cpu_MHz == 0);
|
||||
}
|
||||
}
|
||||
close(FILE);
|
||||
}
|
||||
|
||||
printf " host:%s nodetype:%s subfunction:%s\n",
|
||||
$NODENAME, $NODETYPE, $SUBFUNCTION;
|
||||
printf " arch:%s processor:%s speed:%.0f #CPUs:%d\n",
|
||||
$MACHINE, $model_name, $cpu_MHz, $n_cpu;
|
||||
printf " %s %s build:%s\n", $OSTYPE, $OSRELEASE, $BUILDINFO;
|
||||
|
||||
}
|
||||
|
||||
# Parse and validate command line arguments
|
||||
sub parse_occtop_args {
|
||||
(local *::arg_debug,
|
||||
local *::arg_delay,
|
||||
local *::arg_repeat,
|
||||
local *::arg_period,
|
||||
local *::arg_header,
|
||||
) = @_;
|
||||
|
||||
# Local variables
|
||||
my ($fail, $arg_help);
|
||||
|
||||
# Use the Argument processing module
|
||||
use Getopt::Long;
|
||||
|
||||
# Print usage if no arguments
|
||||
if (!@::ARGV) {
|
||||
&Usage();
|
||||
exit 0;
|
||||
}
|
||||
|
||||
# Process input arguments
|
||||
$fail = 0;
|
||||
GetOptions(
|
||||
"debug:i", \$::arg_debug,
|
||||
"delay=f", \$::arg_delay,
|
||||
"period=i", \$::arg_period,
|
||||
"repeat=i", \$::arg_repeat,
|
||||
"header:i", \$::arg_header,
|
||||
"help|h", \$arg_help
|
||||
) || GetOptionsMessage();
|
||||
|
||||
# Print help documentation if user has selected --help
|
||||
&ListHelp() if (defined $arg_help);
|
||||
|
||||
# Validate options
|
||||
if ((defined $::arg_repeat) && (defined $::arg_period)) {
|
||||
$fail = 1;
|
||||
warn "$::TOOLNAME: Input error: cannot specify both --repeat and --period options.\n";
|
||||
}
|
||||
if ((defined $::arg_delay) && ($::arg_delay < 0.01)) {
|
||||
$fail = 1;
|
||||
warn "$::TOOLNAME: Input error: --delay %f is less than 0.01.\n",
|
||||
$::arg_delay;
|
||||
}
|
||||
if (@::ARGV) {
|
||||
$fail = 1;
|
||||
warn "$::TOOLNAME: Input error: not expecting these options: '@::ARGV'.\n";
|
||||
}
|
||||
|
||||
# Set reasonable defaults
|
||||
$::arg_header ||= 15;
|
||||
$::arg_delay ||= 1.0;
|
||||
$::arg_repeat ||= 1;
|
||||
if ($::arg_period) {
|
||||
$::arg_repeat = $::arg_period / $::arg_delay;
|
||||
} else {
|
||||
$::arg_period = $::arg_delay * $::arg_repeat;
|
||||
}
|
||||
|
||||
# Upon missing or invalid options, print usage
|
||||
if ($fail == 1) {
|
||||
&Usage();
|
||||
exit 1;
|
||||
}
|
||||
}
|
||||
|
||||
# Print out a warning message and usage
|
||||
sub GetOptionsMessage {
|
||||
warn "$::TOOLNAME: Error processing input arguments.\n";
|
||||
&Usage();
|
||||
exit 1;
|
||||
}
|
||||
|
||||
# Print out program usage
|
||||
sub Usage {
|
||||
printf "Usage: $::TOOLNAME OPTIONS\n";
|
||||
printf " [--delay=<seconds>] [--repeat=<num>] [--period=<seconds>]\n";
|
||||
printf " [--header=<num>]\n";
|
||||
printf " [--help]\n";
|
||||
|
||||
printf "\n";
|
||||
}
|
||||
|
||||
# Print tool help
|
||||
sub ListHelp {
|
||||
printf "$::TOOLNAME -- display hi-resolution per-cpu occupancy\n";
|
||||
&Usage();
|
||||
printf "Options: miscellaneous\n";
|
||||
printf " --delay=<seconds> : output interval (seconds): default: 1.0\n";
|
||||
printf " --repeat=<num> : number of repeat samples: default: 1\n";
|
||||
printf " --period=<seconds> : overall tool duration (seconds): default: --\n";
|
||||
printf " --header=<num> : print header every num samples: default: 15\n";
|
||||
printf " --help : this help\n";
|
||||
exit 0;
|
||||
}
|
||||
|
||||
1;
|
1312
monitor-tools/scripts/schedtop
Executable file
1312
monitor-tools/scripts/schedtop
Executable file
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user