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
7e8bdbf732
commit
9e02357329
@ -114,3 +114,4 @@ config-files/io-scheduler
|
|||||||
tools/collector
|
tools/collector
|
||||||
grub/grubby
|
grub/grubby
|
||||||
utilities/platform-util
|
utilities/platform-util
|
||||||
|
tools/monitor-tools
|
||||||
|
202
tools/monitor-tools/LICENSE
Normal file
202
tools/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
tools/monitor-tools/centos/build_srpm.data
Normal file
2
tools/monitor-tools/centos/build_srpm.data
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
SRC_DIR=scripts
|
||||||
|
TIS_PATCH_VER=0
|
34
tools/monitor-tools/centos/monitor-tools.spec
Normal file
34
tools/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
tools/monitor-tools/scripts/LICENSE
Normal file
202
tools/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
tools/monitor-tools/scripts/memtop
Executable file
344
tools/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
tools/monitor-tools/scripts/occtop
Executable file
592
tools/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
tools/monitor-tools/scripts/schedtop
Executable file
1312
tools/monitor-tools/scripts/schedtop
Executable file
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user