Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mobile
Path: blob/master/src/hotspot/os/aix/libperfstat_aix.hpp
40930 views
1
/*
2
* Copyright (c) 2012, 2018 SAP SE. All rights reserved.
3
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4
*
5
* This code is free software; you can redistribute it and/or modify it
6
* under the terms of the GNU General Public License version 2 only, as
7
* published by the Free Software Foundation.
8
*
9
* This code is distributed in the hope that it will be useful, but WITHOUT
10
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12
* version 2 for more details (a copy is included in the LICENSE file that
13
* accompanied this code).
14
*
15
* You should have received a copy of the GNU General Public License version
16
* 2 along with this work; if not, write to the Free Software Foundation,
17
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18
*
19
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20
* or visit www.oracle.com if you need additional information or have any
21
* questions.
22
*
23
*/
24
25
// Encapsulates the libperfstat library.
26
//
27
// The purpose of this code is to dynamically load the libperfstat library
28
// instead of statically linking against it. The libperfstat library is an
29
// AIX-specific library which only exists on AIX, not on PASE. If I want to
30
// share binaries between AIX and PASE, I cannot directly link against libperfstat.so.
31
32
#ifndef OS_AIX_LIBPERFSTAT_AIX_HPP
33
#define OS_AIX_LIBPERFSTAT_AIX_HPP
34
35
#include <sys/types.h>
36
#include <stdlib.h>
37
38
///////////////////////////////////////////////////////////////////////////////////////////////
39
// These are excerpts from the AIX 5.3, 6.1, 7.1 libperfstat.h -
40
// this is all we need from libperfstat.h and I want to avoid having to include <libperfstat.h>
41
//
42
// Note: I define all structures as if I were to include libperfstat.h on an AIX 5.2
43
// build machine.
44
//
45
// The ratio behind that is that if I would build on an AIX 5.2 build machine,
46
// include libperfstat.h and hard-link against libperfstat.a, the program should
47
// work without recompilation on all newer AIX versions.
48
//
49
50
#define IDENTIFIER_LENGTH 64 /* length of strings included in the structures */
51
52
53
typedef struct { /* structure element identifier */
54
char name[IDENTIFIER_LENGTH]; /* name of the identifier */
55
} perfstat_id_t;
56
57
#define CEC_ID_LEN 40 /* CEC identifier length */
58
#define MAXCORRALNAMELEN 25 /* length of the wpar name */
59
#define FIRST_WPARNAME "" /* pseudo-name for the first WPAR */
60
#define FIRST_WPARID -1 /* pseudo-id for the first WPAR */
61
62
typedef unsigned short cid_t; /* workload partition identifier */
63
64
typedef struct { /* Virtual memory utilization */
65
u_longlong_t virt_total; /* total virtual memory (in 4KB pages) */
66
u_longlong_t real_total; /* total real memory (in 4KB pages) */
67
u_longlong_t real_free; /* free real memory (in 4KB pages) */
68
u_longlong_t real_pinned; /* real memory which is pinned (in 4KB pages) */
69
u_longlong_t real_inuse; /* real memory which is in use (in 4KB pages) */
70
u_longlong_t pgbad; /* number of bad pages */
71
u_longlong_t pgexct; /* number of page faults */
72
u_longlong_t pgins; /* number of pages paged in */
73
u_longlong_t pgouts; /* number of pages paged out */
74
u_longlong_t pgspins; /* number of page ins from paging space */
75
u_longlong_t pgspouts; /* number of page outs from paging space */
76
u_longlong_t scans; /* number of page scans by clock */
77
u_longlong_t cycles; /* number of page replacement cycles */
78
u_longlong_t pgsteals; /* number of page steals */
79
u_longlong_t numperm; /* number of frames used for files (in 4KB pages) */
80
u_longlong_t pgsp_total; /* total paging space (in 4KB pages) */
81
u_longlong_t pgsp_free; /* free paging space (in 4KB pages) */
82
u_longlong_t pgsp_rsvd; /* reserved paging space (in 4KB pages) */
83
u_longlong_t real_system; /* real memory used by system segments (in 4KB pages). This is the sum of all the used pages in segment marked for system usage.
84
* Since segment classifications are not always guaranteed to be accurate, this number is only an approximation. */
85
u_longlong_t real_user; /* real memory used by non-system segments (in 4KB pages). This is the sum of all pages used in segments not marked for system usage.
86
* Since segment classifications are not always guaranteed to be accurate, this number is only an approximation. */
87
u_longlong_t real_process; /* real memory used by process segments (in 4KB pages). This is real_total-real_free-numperm-real_system. Since real_system is an
88
* approximation, this number is too. */
89
u_longlong_t virt_active; /* Active virtual pages. Virtual pages are considered active if they have been accessed */
90
91
} perfstat_memory_total_t;
92
93
typedef struct { /* global cpu information AIX 5.3 < TL10 */
94
int ncpus; /* number of active logical processors */
95
int ncpus_cfg; /* number of configured processors */
96
char description[IDENTIFIER_LENGTH]; /* processor description (type/official name) */
97
u_longlong_t processorHZ; /* processor speed in Hz */
98
u_longlong_t user; /* raw total number of clock ticks spent in user mode */
99
u_longlong_t sys; /* raw total number of clock ticks spent in system mode */
100
u_longlong_t idle; /* raw total number of clock ticks spent idle */
101
u_longlong_t wait; /* raw total number of clock ticks spent waiting for I/O */
102
u_longlong_t pswitch; /* number of process switches (change in currently running process) */
103
u_longlong_t syscall; /* number of system calls executed */
104
u_longlong_t sysread; /* number of read system calls executed */
105
u_longlong_t syswrite; /* number of write system calls executed */
106
u_longlong_t sysfork; /* number of forks system calls executed */
107
u_longlong_t sysexec; /* number of execs system calls executed */
108
u_longlong_t readch; /* number of characters tranferred with read system call */
109
u_longlong_t writech; /* number of characters tranferred with write system call */
110
u_longlong_t devintrs; /* number of device interrupts */
111
u_longlong_t softintrs; /* number of software interrupts */
112
time_t lbolt; /* number of ticks since last reboot */
113
u_longlong_t loadavg[3]; /* (1<<SBITS) times the average number of runnables processes during the last 1, 5 and 15 minutes.
114
* To calculate the load average, divide the numbers by (1<<SBITS). SBITS is defined in <sys/proc.h>. */
115
u_longlong_t runque; /* length of the run queue (processes ready) */
116
u_longlong_t swpque; /* ength of the swap queue (processes waiting to be paged in) */
117
u_longlong_t bread; /* number of blocks read */
118
u_longlong_t bwrite; /* number of blocks written */
119
u_longlong_t lread; /* number of logical read requests */
120
u_longlong_t lwrite; /* number of logical write requests */
121
u_longlong_t phread; /* number of physical reads (reads on raw devices) */
122
u_longlong_t phwrite; /* number of physical writes (writes on raw devices) */
123
u_longlong_t runocc; /* updated whenever runque is updated, i.e. the runqueue is occupied.
124
* This can be used to compute the simple average of ready processes */
125
u_longlong_t swpocc; /* updated whenever swpque is updated. i.e. the swpqueue is occupied.
126
* This can be used to compute the simple average processes waiting to be paged in */
127
u_longlong_t iget; /* number of inode lookups */
128
u_longlong_t namei; /* number of vnode lookup from a path name */
129
u_longlong_t dirblk; /* number of 512-byte block reads by the directory search routine to locate an entry for a file */
130
u_longlong_t msg; /* number of IPC message operations */
131
u_longlong_t sema; /* number of IPC semaphore operations */
132
u_longlong_t rcvint; /* number of tty receive interrupts */
133
u_longlong_t xmtint; /* number of tyy transmit interrupts */
134
u_longlong_t mdmint; /* number of modem interrupts */
135
u_longlong_t tty_rawinch; /* number of raw input characters */
136
u_longlong_t tty_caninch; /* number of canonical input characters (always zero) */
137
u_longlong_t tty_rawoutch; /* number of raw output characters */
138
u_longlong_t ksched; /* number of kernel processes created */
139
u_longlong_t koverf; /* kernel process creation attempts where:
140
* -the user has forked to their maximum limit
141
* -the configuration limit of processes has been reached */
142
u_longlong_t kexit; /* number of kernel processes that became zombies */
143
u_longlong_t rbread; /* number of remote read requests */
144
u_longlong_t rcread; /* number of cached remote reads */
145
u_longlong_t rbwrt; /* number of remote writes */
146
u_longlong_t rcwrt; /* number of cached remote writes */
147
u_longlong_t traps; /* number of traps */
148
int ncpus_high; /* index of highest processor online */
149
u_longlong_t puser; /* raw number of physical processor tics in user mode */
150
u_longlong_t psys; /* raw number of physical processor tics in system mode */
151
u_longlong_t pidle; /* raw number of physical processor tics idle */
152
u_longlong_t pwait; /* raw number of physical processor tics waiting for I/O */
153
u_longlong_t decrintrs; /* number of decrementer tics interrupts */
154
u_longlong_t mpcrintrs; /* number of mpc's received interrupts */
155
u_longlong_t mpcsintrs; /* number of mpc's sent interrupts */
156
u_longlong_t phantintrs; /* number of phantom interrupts */
157
u_longlong_t idle_donated_purr; /* number of idle cycles donated by a dedicated partition enabled for donation */
158
u_longlong_t idle_donated_spurr; /* number of idle spurr cycles donated by a dedicated partition enabled for donation */
159
u_longlong_t busy_donated_purr; /* number of busy cycles donated by a dedicated partition enabled for donation */
160
u_longlong_t busy_donated_spurr; /* number of busy spurr cycles donated by a dedicated partition enabled for donation */
161
u_longlong_t idle_stolen_purr; /* number of idle cycles stolen by the hypervisor from a dedicated partition */
162
u_longlong_t idle_stolen_spurr; /* number of idle spurr cycles stolen by the hypervisor from a dedicated partition */
163
u_longlong_t busy_stolen_purr; /* number of busy cycles stolen by the hypervisor from a dedicated partition */
164
u_longlong_t busy_stolen_spurr; /* number of busy spurr cycles stolen by the hypervisor from a dedicated partition */
165
short iowait; /* number of processes that are asleep waiting for buffered I/O */
166
short physio; /* number of processes waiting for raw I/O */
167
longlong_t twait; /* number of threads that are waiting for filesystem direct(cio) */
168
u_longlong_t hpi; /* number of hypervisor page-ins */
169
u_longlong_t hpit; /* Time spent in hypervisor page-ins (in nanoseconds) */
170
} perfstat_cpu_total_t_53;
171
172
typedef struct { /* global cpu information AIX 6.1|5.3 > TL09 */
173
int ncpus; /* number of active logical processors */
174
int ncpus_cfg; /* number of configured processors */
175
char description[IDENTIFIER_LENGTH]; /* processor description (type/official name) */
176
u_longlong_t processorHZ; /* processor speed in Hz */
177
u_longlong_t user; /* raw total number of clock ticks spent in user mode */
178
u_longlong_t sys; /* raw total number of clock ticks spent in system mode */
179
u_longlong_t idle; /* raw total number of clock ticks spent idle */
180
u_longlong_t wait; /* raw total number of clock ticks spent waiting for I/O */
181
u_longlong_t pswitch; /* number of process switches (change in currently running process) */
182
u_longlong_t syscall; /* number of system calls executed */
183
u_longlong_t sysread; /* number of read system calls executed */
184
u_longlong_t syswrite; /* number of write system calls executed */
185
u_longlong_t sysfork; /* number of forks system calls executed */
186
u_longlong_t sysexec; /* number of execs system calls executed */
187
u_longlong_t readch; /* number of characters tranferred with read system call */
188
u_longlong_t writech; /* number of characters tranferred with write system call */
189
u_longlong_t devintrs; /* number of device interrupts */
190
u_longlong_t softintrs; /* number of software interrupts */
191
time_t lbolt; /* number of ticks since last reboot */
192
u_longlong_t loadavg[3]; /* (1<<SBITS) times the average number of runnables processes during the last 1, 5 and 15 minutes.
193
* To calculate the load average, divide the numbers by (1<<SBITS). SBITS is defined in <sys/proc.h>. */
194
u_longlong_t runque; /* length of the run queue (processes ready) */
195
u_longlong_t swpque; /* length of the swap queue (processes waiting to be paged in) */
196
u_longlong_t bread; /* number of blocks read */
197
u_longlong_t bwrite; /* number of blocks written */
198
u_longlong_t lread; /* number of logical read requests */
199
u_longlong_t lwrite; /* number of logical write requests */
200
u_longlong_t phread; /* number of physical reads (reads on raw devices) */
201
u_longlong_t phwrite; /* number of physical writes (writes on raw devices) */
202
u_longlong_t runocc; /* updated whenever runque is updated, i.e. the runqueue is occupied.
203
* This can be used to compute the simple average of ready processes */
204
u_longlong_t swpocc; /* updated whenever swpque is updated. i.e. the swpqueue is occupied.
205
* This can be used to compute the simple average processes waiting to be paged in */
206
u_longlong_t iget; /* number of inode lookups */
207
u_longlong_t namei; /* number of vnode lookup from a path name */
208
u_longlong_t dirblk; /* number of 512-byte block reads by the directory search routine to locate an entry for a file */
209
u_longlong_t msg; /* number of IPC message operations */
210
u_longlong_t sema; /* number of IPC semaphore operations */
211
u_longlong_t rcvint; /* number of tty receive interrupts */
212
u_longlong_t xmtint; /* number of tyy transmit interrupts */
213
u_longlong_t mdmint; /* number of modem interrupts */
214
u_longlong_t tty_rawinch; /* number of raw input characters */
215
u_longlong_t tty_caninch; /* number of canonical input characters (always zero) */
216
u_longlong_t tty_rawoutch; /* number of raw output characters */
217
u_longlong_t ksched; /* number of kernel processes created */
218
u_longlong_t koverf; /* kernel process creation attempts where:
219
* -the user has forked to their maximum limit
220
* -the configuration limit of processes has been reached */
221
u_longlong_t kexit; /* number of kernel processes that became zombies */
222
u_longlong_t rbread; /* number of remote read requests */
223
u_longlong_t rcread; /* number of cached remote reads */
224
u_longlong_t rbwrt; /* number of remote writes */
225
u_longlong_t rcwrt; /* number of cached remote writes */
226
u_longlong_t traps; /* number of traps */
227
int ncpus_high; /* index of highest processor online */
228
u_longlong_t puser; /* raw number of physical processor tics in user mode */
229
u_longlong_t psys; /* raw number of physical processor tics in system mode */
230
u_longlong_t pidle; /* raw number of physical processor tics idle */
231
u_longlong_t pwait; /* raw number of physical processor tics waiting for I/O */
232
u_longlong_t decrintrs; /* number of decrementer tics interrupts */
233
u_longlong_t mpcrintrs; /* number of mpc's received interrupts */
234
u_longlong_t mpcsintrs; /* number of mpc's sent interrupts */
235
u_longlong_t phantintrs; /* number of phantom interrupts */
236
u_longlong_t idle_donated_purr; /* number of idle cycles donated by a dedicated partition enabled for donation */
237
u_longlong_t idle_donated_spurr; /* number of idle spurr cycles donated by a dedicated partition enabled for donation */
238
u_longlong_t busy_donated_purr; /* number of busy cycles donated by a dedicated partition enabled for donation */
239
u_longlong_t busy_donated_spurr; /* number of busy spurr cycles donated by a dedicated partition enabled for donation */
240
u_longlong_t idle_stolen_purr; /* number of idle cycles stolen by the hypervisor from a dedicated partition */
241
u_longlong_t idle_stolen_spurr; /* number of idle spurr cycles stolen by the hypervisor from a dedicated partition */
242
u_longlong_t busy_stolen_purr; /* number of busy cycles stolen by the hypervisor from a dedicated partition */
243
u_longlong_t busy_stolen_spurr; /* number of busy spurr cycles stolen by the hypervisor from a dedicated partition */
244
short iowait; /* number of processes that are asleep waiting for buffered I/O */
245
short physio; /* number of processes waiting for raw I/O */
246
longlong_t twait; /* number of threads that are waiting for filesystem direct(cio) */
247
u_longlong_t hpi; /* number of hypervisor page-ins */
248
u_longlong_t hpit; /* Time spent in hypervisor page-ins (in nanoseconds) */
249
u_longlong_t puser_spurr; /* number of spurr cycles spent in user mode */
250
u_longlong_t psys_spurr; /* number of spurr cycles spent in kernel mode */
251
u_longlong_t pidle_spurr; /* number of spurr cycles spent in idle mode */
252
u_longlong_t pwait_spurr; /* number of spurr cycles spent in wait mode */
253
int spurrflag; /* set if running in spurr mode */
254
} perfstat_cpu_total_t_61;
255
256
typedef struct { /* global cpu information AIX 7.1 */
257
int ncpus; /* number of active logical processors */
258
int ncpus_cfg; /* number of configured processors */
259
char description[IDENTIFIER_LENGTH]; /* processor description (type/official name) */
260
u_longlong_t processorHZ; /* processor speed in Hz */
261
u_longlong_t user; /* raw total number of clock ticks spent in user mode */
262
u_longlong_t sys; /* raw total number of clock ticks spent in system mode */
263
u_longlong_t idle; /* raw total number of clock ticks spent idle */
264
u_longlong_t wait; /* raw total number of clock ticks spent waiting for I/O */
265
u_longlong_t pswitch; /* number of process switches (change in currently running process) */
266
u_longlong_t syscall; /* number of system calls executed */
267
u_longlong_t sysread; /* number of read system calls executed */
268
u_longlong_t syswrite; /* number of write system calls executed */
269
u_longlong_t sysfork; /* number of forks system calls executed */
270
u_longlong_t sysexec; /* number of execs system calls executed */
271
u_longlong_t readch; /* number of characters tranferred with read system call */
272
u_longlong_t writech; /* number of characters tranferred with write system call */
273
u_longlong_t devintrs; /* number of device interrupts */
274
u_longlong_t softintrs; /* number of software interrupts */
275
time_t lbolt; /* number of ticks since last reboot */
276
u_longlong_t loadavg[3]; /* (1<<SBITS) times the average number of runnables processes during the last 1, 5 and 15 minutes.
277
* To calculate the load average, divide the numbers by (1<<SBITS). SBITS is defined in <sys/proc.h>. */
278
u_longlong_t runque; /* length of the run queue (processes ready) */
279
u_longlong_t swpque; /* ength of the swap queue (processes waiting to be paged in) */
280
u_longlong_t bread; /* number of blocks read */
281
u_longlong_t bwrite; /* number of blocks written */
282
u_longlong_t lread; /* number of logical read requests */
283
u_longlong_t lwrite; /* number of logical write requests */
284
u_longlong_t phread; /* number of physical reads (reads on raw devices) */
285
u_longlong_t phwrite; /* number of physical writes (writes on raw devices) */
286
u_longlong_t runocc; /* updated whenever runque is updated, i.e. the runqueue is occupied.
287
* This can be used to compute the simple average of ready processes */
288
u_longlong_t swpocc; /* updated whenever swpque is updated. i.e. the swpqueue is occupied.
289
* This can be used to compute the simple average processes waiting to be paged in */
290
u_longlong_t iget; /* number of inode lookups */
291
u_longlong_t namei; /* number of vnode lookup from a path name */
292
u_longlong_t dirblk; /* number of 512-byte block reads by the directory search routine to locate an entry for a file */
293
u_longlong_t msg; /* number of IPC message operations */
294
u_longlong_t sema; /* number of IPC semaphore operations */
295
u_longlong_t rcvint; /* number of tty receive interrupts */
296
u_longlong_t xmtint; /* number of tyy transmit interrupts */
297
u_longlong_t mdmint; /* number of modem interrupts */
298
u_longlong_t tty_rawinch; /* number of raw input characters */
299
u_longlong_t tty_caninch; /* number of canonical input characters (always zero) */
300
u_longlong_t tty_rawoutch; /* number of raw output characters */
301
u_longlong_t ksched; /* number of kernel processes created */
302
u_longlong_t koverf; /* kernel process creation attempts where:
303
* -the user has forked to their maximum limit
304
* -the configuration limit of processes has been reached */
305
u_longlong_t kexit; /* number of kernel processes that became zombies */
306
u_longlong_t rbread; /* number of remote read requests */
307
u_longlong_t rcread; /* number of cached remote reads */
308
u_longlong_t rbwrt; /* number of remote writes */
309
u_longlong_t rcwrt; /* number of cached remote writes */
310
u_longlong_t traps; /* number of traps */
311
int ncpus_high; /* index of highest processor online */
312
u_longlong_t puser; /* raw number of physical processor tics in user mode */
313
u_longlong_t psys; /* raw number of physical processor tics in system mode */
314
u_longlong_t pidle; /* raw number of physical processor tics idle */
315
u_longlong_t pwait; /* raw number of physical processor tics waiting for I/O */
316
u_longlong_t decrintrs; /* number of decrementer tics interrupts */
317
u_longlong_t mpcrintrs; /* number of mpc's received interrupts */
318
u_longlong_t mpcsintrs; /* number of mpc's sent interrupts */
319
u_longlong_t phantintrs; /* number of phantom interrupts */
320
u_longlong_t idle_donated_purr; /* number of idle cycles donated by a dedicated partition enabled for donation */
321
u_longlong_t idle_donated_spurr; /* number of idle spurr cycles donated by a dedicated partition enabled for donation */
322
u_longlong_t busy_donated_purr; /* number of busy cycles donated by a dedicated partition enabled for donation */
323
u_longlong_t busy_donated_spurr; /* number of busy spurr cycles donated by a dedicated partition enabled for donation */
324
u_longlong_t idle_stolen_purr; /* number of idle cycles stolen by the hypervisor from a dedicated partition */
325
u_longlong_t idle_stolen_spurr; /* number of idle spurr cycles stolen by the hypervisor from a dedicated partition */
326
u_longlong_t busy_stolen_purr; /* number of busy cycles stolen by the hypervisor from a dedicated partition */
327
u_longlong_t busy_stolen_spurr; /* number of busy spurr cycles stolen by the hypervisor from a dedicated partition */
328
short iowait; /* number of processes that are asleep waiting for buffered I/O */
329
short physio; /* number of processes waiting for raw I/O */
330
longlong_t twait; /* number of threads that are waiting for filesystem direct(cio) */
331
u_longlong_t hpi; /* number of hypervisor page-ins */
332
u_longlong_t hpit; /* Time spent in hypervisor page-ins (in nanoseconds) */
333
u_longlong_t puser_spurr; /* number of spurr cycles spent in user mode */
334
u_longlong_t psys_spurr; /* number of spurr cycles spent in kernel mode */
335
u_longlong_t pidle_spurr; /* number of spurr cycles spent in idle mode */
336
u_longlong_t pwait_spurr; /* number of spurr cycles spent in wait mode */
337
int spurrflag; /* set if running in spurr mode */
338
u_longlong_t version; /* version number (1, 2, etc.,) */
339
/* >>>>> END OF STRUCTURE DEFINITION <<<<< */
340
/* #define CURR_VERSION_CPU_TOTAL 1 Incremented by one for every new release *
341
* of perfstat_cpu_total_t data structure */
342
} perfstat_cpu_total_t_71;
343
344
typedef struct { /* global cpu information AIX 7.2 / 6.1 TL6 (see oslevel -r) */
345
int ncpus; /* number of active logical processors */
346
int ncpus_cfg; /* number of configured processors */
347
char description[IDENTIFIER_LENGTH]; /* processor description (type/official name) */
348
u_longlong_t processorHZ; /* processor speed in Hz */
349
u_longlong_t user; /* raw total number of clock ticks spent in user mode */
350
u_longlong_t sys; /* raw total number of clock ticks spent in system mode */
351
u_longlong_t idle; /* raw total number of clock ticks spent idle */
352
u_longlong_t wait; /* raw total number of clock ticks spent waiting for I/O */
353
u_longlong_t pswitch; /* number of process switches (change in currently running process) */
354
u_longlong_t syscall; /* number of system calls executed */
355
u_longlong_t sysread; /* number of read system calls executed */
356
u_longlong_t syswrite; /* number of write system calls executed */
357
u_longlong_t sysfork; /* number of forks system calls executed */
358
u_longlong_t sysexec; /* number of execs system calls executed */
359
u_longlong_t readch; /* number of characters tranferred with read system call */
360
u_longlong_t writech; /* number of characters tranferred with write system call */
361
u_longlong_t devintrs; /* number of device interrupts */
362
u_longlong_t softintrs; /* number of software interrupts */
363
time_t lbolt; /* number of ticks since last reboot */
364
u_longlong_t loadavg[3]; /* (1<<SBITS) times the average number of runnables processes during the last 1, 5 and 15 minutes. */
365
/* To calculate the load average, divide the numbers by (1<<SBITS). SBITS is defined in <sys/proc.h>. */
366
u_longlong_t runque; /* length of the run queue (processes ready) */
367
u_longlong_t swpque; /* ength of the swap queue (processes waiting to be paged in) */
368
u_longlong_t bread; /* number of blocks read */
369
u_longlong_t bwrite; /* number of blocks written */
370
u_longlong_t lread; /* number of logical read requests */
371
u_longlong_t lwrite; /* number of logical write requests */
372
u_longlong_t phread; /* number of physical reads (reads on raw devices) */
373
u_longlong_t phwrite; /* number of physical writes (writes on raw devices) */
374
u_longlong_t runocc; /* updated whenever runque is updated, i.e. the runqueue is occupied.
375
* This can be used to compute the simple average of ready processes */
376
u_longlong_t swpocc; /* updated whenever swpque is updated. i.e. the swpqueue is occupied.
377
* This can be used to compute the simple average processes waiting to be paged in */
378
u_longlong_t iget; /* number of inode lookups */
379
u_longlong_t namei; /* number of vnode lookup from a path name */
380
u_longlong_t dirblk; /* number of 512-byte block reads by the directory search routine to locate an entry for a file */
381
u_longlong_t msg; /* number of IPC message operations */
382
u_longlong_t sema; /* number of IPC semaphore operations */
383
u_longlong_t rcvint; /* number of tty receive interrupts */
384
u_longlong_t xmtint; /* number of tyy transmit interrupts */
385
u_longlong_t mdmint; /* number of modem interrupts */
386
u_longlong_t tty_rawinch; /* number of raw input characters */
387
u_longlong_t tty_caninch; /* number of canonical input characters (always zero) */
388
u_longlong_t tty_rawoutch;/* number of raw output characters */
389
u_longlong_t ksched; /* number of kernel processes created */
390
u_longlong_t koverf; /* kernel process creation attempts where:
391
* -the user has forked to their maximum limit
392
* -the configuration limit of processes has been reached */
393
u_longlong_t kexit; /* number of kernel processes that became zombies */
394
u_longlong_t rbread; /* number of remote read requests */
395
u_longlong_t rcread; /* number of cached remote reads */
396
u_longlong_t rbwrt; /* number of remote writes */
397
u_longlong_t rcwrt; /* number of cached remote writes */
398
u_longlong_t traps; /* number of traps */
399
int ncpus_high; /* index of highest processor online */
400
u_longlong_t puser; /* raw number of physical processor tics in user mode */
401
u_longlong_t psys; /* raw number of physical processor tics in system mode */
402
u_longlong_t pidle; /* raw number of physical processor tics idle */
403
u_longlong_t pwait; /* raw number of physical processor tics waiting for I/O */
404
u_longlong_t decrintrs; /* number of decrementer tics interrupts */
405
u_longlong_t mpcrintrs; /* number of mpc's received interrupts */
406
u_longlong_t mpcsintrs; /* number of mpc's sent interrupts */
407
u_longlong_t phantintrs; /* number of phantom interrupts */
408
u_longlong_t idle_donated_purr; /* number of idle cycles donated by a dedicated partition enabled for donation */
409
u_longlong_t idle_donated_spurr;/* number of idle spurr cycles donated by a dedicated partition enabled for donation */
410
u_longlong_t busy_donated_purr; /* number of busy cycles donated by a dedicated partition enabled for donation */
411
u_longlong_t busy_donated_spurr;/* number of busy spurr cycles donated by a dedicated partition enabled for donation */
412
u_longlong_t idle_stolen_purr; /* number of idle cycles stolen by the hypervisor from a dedicated partition */
413
u_longlong_t idle_stolen_spurr; /* number of idle spurr cycles stolen by the hypervisor from a dedicated partition */
414
u_longlong_t busy_stolen_purr; /* number of busy cycles stolen by the hypervisor from a dedicated partition */
415
u_longlong_t busy_stolen_spurr; /* number of busy spurr cycles stolen by the hypervisor from a dedicated partition */
416
short iowait; /* number of processes that are asleep waiting for buffered I/O */
417
short physio; /* number of processes waiting for raw I/O */
418
longlong_t twait; /* number of threads that are waiting for filesystem direct(cio) */
419
u_longlong_t hpi; /* number of hypervisor page-ins */
420
u_longlong_t hpit; /* Time spent in hypervisor page-ins (in nanoseconds) */
421
u_longlong_t puser_spurr; /* number of spurr cycles spent in user mode */
422
u_longlong_t psys_spurr; /* number of spurr cycles spent in kernel mode */
423
u_longlong_t pidle_spurr; /* number of spurr cycles spent in idle mode */
424
u_longlong_t pwait_spurr; /* number of spurr cycles spent in wait mode */
425
int spurrflag; /* set if running in spurr mode */
426
u_longlong_t version; /* version number (1, 2, etc.,) */
427
u_longlong_t tb_last; /*time base counter */
428
u_longlong_t purr_coalescing; /* If the calling partition is
429
* authorized to see pool wide statistics then
430
* PURR cycles consumed to coalesce data
431
* else set to zero.*/
432
u_longlong_t spurr_coalescing; /* If the calling partition is
433
* authorized to see pool wide statistics then
434
* SPURR cycles consumed to coalesce data
435
* else set to zero.*/
436
437
/* >>>>> END OF STRUCTURE DEFINITION <<<<< */
438
#define CURR_VERSION_CPU_TOTAL 2 /* Incremented by one for every new release *
439
* of perfstat_cpu_total_t data structure */
440
} perfstat_cpu_total_t_72;
441
442
443
typedef union {
444
uint w;
445
struct {
446
unsigned smt_capable :1; /* OS supports SMT mode */
447
unsigned smt_enabled :1; /* SMT mode is on */
448
unsigned lpar_capable :1; /* OS supports logical partitioning */
449
unsigned lpar_enabled :1; /* logical partitioning is on */
450
unsigned shared_capable :1; /* OS supports shared processor LPAR */
451
unsigned shared_enabled :1; /* partition runs in shared mode */
452
unsigned dlpar_capable :1; /* OS supports dynamic LPAR */
453
unsigned capped :1; /* partition is capped */
454
unsigned kernel_is_64 :1; /* kernel is 64 bit */
455
unsigned pool_util_authority :1; /* pool utilization available */
456
unsigned donate_capable :1; /* capable of donating cycles */
457
unsigned donate_enabled :1; /* enabled for donating cycles */
458
unsigned ams_capable:1; /* 1 = AMS(Active Memory Sharing) capable, 0 = Not AMS capable */
459
unsigned ams_enabled:1; /* 1 = AMS(Active Memory Sharing) enabled, 0 = Not AMS enabled */
460
unsigned power_save:1; /* 1 = Power saving mode is enabled */
461
unsigned ame_enabled:1; /* Active Memory Expansion is enabled */
462
unsigned shared_extended :1;
463
unsigned spare :15; /* reserved for future usage */
464
} b;
465
} perfstat_partition_type_t;
466
467
typedef struct { /* partition total information AIX 5.3 < TL6 */
468
char name[IDENTIFIER_LENGTH]; /* name of the logical partition */
469
perfstat_partition_type_t type; /* set of bits describing the partition */
470
int lpar_id; /* logical partition identifier */
471
int group_id; /* identifier of the LPAR group this partition is a member of */
472
int pool_id; /* identifier of the shared pool of physical processors this partition is a member of */
473
int online_cpus; /* number of virtual CPUs currently online on the partition */
474
int max_cpus; /* maximum number of virtual CPUs this parition can ever have */
475
int min_cpus; /* minimum number of virtual CPUs this partition must have */
476
u_longlong_t online_memory; /* amount of memory currently online */
477
u_longlong_t max_memory; /* maximum amount of memory this partition can ever have */
478
u_longlong_t min_memory; /* minimum amount of memory this partition must have */
479
int entitled_proc_capacity; /* number of processor units this partition is entitled to receive */
480
int max_proc_capacity; /* maximum number of processor units this partition can ever have */
481
int min_proc_capacity; /* minimum number of processor units this partition must have */
482
int proc_capacity_increment; /* increment value to the entitled capacity */
483
int unalloc_proc_capacity; /* number of processor units currently unallocated in the shared processor pool this partition belongs to */
484
int var_proc_capacity_weight; /* partition priority weight to receive extra capacity */
485
int unalloc_var_proc_capacity_weight; /* number of variable processor capacity weight units currently unallocated in the shared processor pool this partition belongs to */
486
int online_phys_cpus_sys; /* number of physical CPUs currently active in the system containing this partition */
487
int max_phys_cpus_sys; /* maximum possible number of physical CPUs in the system containing this partition */
488
int phys_cpus_pool; /* number of the physical CPUs currently in the shared processor pool this partition belong to */
489
u_longlong_t puser; /* raw number of physical processor tics in user mode */
490
u_longlong_t psys; /* raw number of physical processor tics in system mode */
491
u_longlong_t pidle; /* raw number of physical processor tics idle */
492
u_longlong_t pwait; /* raw number of physical processor tics waiting for I/O */
493
u_longlong_t pool_idle_time; /* number of clock tics a processor in the shared pool was idle */
494
u_longlong_t phantintrs; /* number of phantom interrupts received by the partition */
495
u_longlong_t invol_virt_cswitch; /* number involuntary virtual CPU context switches */
496
u_longlong_t vol_virt_cswitch; /* number voluntary virtual CPU context switches */
497
u_longlong_t timebase_last; /* most recently cpu time base */
498
u_longlong_t reserved_pages; /* Currenlty number of 16GB pages. Cannot participate in DR operations */
499
u_longlong_t reserved_pagesize; /* Currently 16GB pagesize Cannot participate in DR operations */
500
} perfstat_partition_total_t_53_5;
501
502
typedef struct { /* partition total information AIX 5.3 < TL10 */
503
char name[IDENTIFIER_LENGTH]; /* name of the logical partition */
504
perfstat_partition_type_t type; /* set of bits describing the partition */
505
int lpar_id; /* logical partition identifier */
506
int group_id; /* identifier of the LPAR group this partition is a member of */
507
int pool_id; /* identifier of the shared pool of physical processors this partition is a member of */
508
int online_cpus; /* number of virtual CPUs currently online on the partition */
509
int max_cpus; /* maximum number of virtual CPUs this parition can ever have */
510
int min_cpus; /* minimum number of virtual CPUs this partition must have */
511
u_longlong_t online_memory; /* amount of memory currently online */
512
u_longlong_t max_memory; /* maximum amount of memory this partition can ever have */
513
u_longlong_t min_memory; /* minimum amount of memory this partition must have */
514
int entitled_proc_capacity; /* number of processor units this partition is entitled to receive */
515
int max_proc_capacity; /* maximum number of processor units this partition can ever have */
516
int min_proc_capacity; /* minimum number of processor units this partition must have */
517
int proc_capacity_increment; /* increment value to the entitled capacity */
518
int unalloc_proc_capacity; /* number of processor units currently unallocated in the shared processor pool this partition belongs to */
519
int var_proc_capacity_weight; /* partition priority weight to receive extra capacity */
520
int unalloc_var_proc_capacity_weight; /* number of variable processor capacity weight units currently unallocated in the shared processor pool this partition belongs to */
521
int online_phys_cpus_sys; /* number of physical CPUs currently active in the system containing this partition */
522
int max_phys_cpus_sys; /* maximum possible number of physical CPUs in the system containing this partition */
523
int phys_cpus_pool; /* number of the physical CPUs currently in the shared processor pool this partition belong to */
524
u_longlong_t puser; /* raw number of physical processor tics in user mode */
525
u_longlong_t psys; /* raw number of physical processor tics in system mode */
526
u_longlong_t pidle; /* raw number of physical processor tics idle */
527
u_longlong_t pwait; /* raw number of physical processor tics waiting for I/O */
528
u_longlong_t pool_idle_time; /* number of clock tics a processor in the shared pool was idle */
529
u_longlong_t phantintrs; /* number of phantom interrupts received by the partition */
530
u_longlong_t invol_virt_cswitch; /* number involuntary virtual CPU context switches */
531
u_longlong_t vol_virt_cswitch; /* number voluntary virtual CPU context switches */
532
u_longlong_t timebase_last; /* most recently cpu time base */
533
u_longlong_t reserved_pages; /* Currenlty number of 16GB pages. Cannot participate in DR operations */
534
u_longlong_t reserved_pagesize; /* Currently 16GB pagesize Cannot participate in DR operations */
535
u_longlong_t idle_donated_purr; /* number of idle cycles donated by a dedicated partition enabled for donation */
536
u_longlong_t idle_donated_spurr; /* number of idle spurr cycles donated by a dedicated partition enabled for donation */
537
u_longlong_t busy_donated_purr; /* number of busy cycles donated by a dedicated partition enabled for donation */
538
u_longlong_t busy_donated_spurr; /* number of busy spurr cycles donated by a dedicated partition enabled for donation */
539
u_longlong_t idle_stolen_purr; /* number of idle cycles stolen by the hypervisor from a dedicated partition */
540
u_longlong_t idle_stolen_spurr; /* number of idle spurr cycles stolen by the hypervisor from a dedicated partition */
541
u_longlong_t busy_stolen_purr; /* number of busy cycles stolen by the hypervisor from a dedicated partition */
542
u_longlong_t busy_stolen_spurr; /* number of busy spurr cycles stolen by the hypervisor from a dedicated partition */
543
u_longlong_t shcpus_in_sys; /* Number of physical processors allocated for shared processor use */
544
u_longlong_t max_pool_capacity; /* Maximum processor capacity of partitions pool */
545
u_longlong_t entitled_pool_capacity; /* Entitled processor capacity of partitions pool */
546
u_longlong_t pool_max_time; /* Summation of maximum time that could be consumed by the pool (nano seconds) */
547
u_longlong_t pool_busy_time; /* Summation of busy (non-idle) time accumulated across all partitions in the pool (nano seconds) */
548
u_longlong_t pool_scaled_busy_time; /* Scaled summation of busy (non-idle) time accumulated across all partitions in the pool (nano seconds) */
549
u_longlong_t shcpu_tot_time; /* Summation of total time across all physical processors allocated for shared processor use (nano seconds) */
550
u_longlong_t shcpu_busy_time; /* Summation of busy (non-idle) time accumulated across all shared processor partitions (nano seconds) */
551
u_longlong_t shcpu_scaled_busy_time; /* Scaled summation of busy time accumulated across all shared processor partitions (nano seconds) */
552
int ams_pool_id; /* AMS pool id of the pool the LPAR belongs to */
553
int var_mem_weight; /* variable memory capacity weight */
554
u_longlong_t iome; /* I/O memory entitlement of the partition in bytes*/
555
u_longlong_t pmem; /* Physical memory currently backing the partition's logical memory in bytes*/
556
u_longlong_t hpi; /* number of hypervisor page-ins */
557
u_longlong_t hpit; /* Time spent in hypervisor page-ins (in nanoseconds)*/
558
u_longlong_t hypv_pagesize; /* Hypervisor page size in KB*/
559
} perfstat_partition_total_t_53;
560
561
typedef struct { /* partition total information AIX 6.1|5.3 > TL09 */
562
char name[IDENTIFIER_LENGTH]; /* name of the logical partition */
563
perfstat_partition_type_t type; /* set of bits describing the partition */
564
int lpar_id; /* logical partition identifier */
565
int group_id; /* identifier of the LPAR group this partition is a member of */
566
int pool_id; /* identifier of the shared pool of physical processors this partition is a member of */
567
int online_cpus; /* number of virtual CPUs currently online on the partition */
568
int max_cpus; /* maximum number of virtual CPUs this parition can ever have */
569
int min_cpus; /* minimum number of virtual CPUs this partition must have */
570
u_longlong_t online_memory; /* amount of memory currently online */
571
u_longlong_t max_memory; /* maximum amount of memory this partition can ever have */
572
u_longlong_t min_memory; /* minimum amount of memory this partition must have */
573
int entitled_proc_capacity; /* number of processor units this partition is entitled to receive */
574
int max_proc_capacity; /* maximum number of processor units this partition can ever have */
575
int min_proc_capacity; /* minimum number of processor units this partition must have */
576
int proc_capacity_increment; /* increment value to the entitled capacity */
577
int unalloc_proc_capacity; /* number of processor units currently unallocated in the shared processor pool this partition belongs to */
578
int var_proc_capacity_weight; /* partition priority weight to receive extra capacity */
579
int unalloc_var_proc_capacity_weight; /* number of variable processor capacity weight units currently unallocated in the shared processor pool this partition belongs to */
580
int online_phys_cpus_sys; /* number of physical CPUs currently active in the system containing this partition */
581
int max_phys_cpus_sys; /* maximum possible number of physical CPUs in the system containing this partition */
582
int phys_cpus_pool; /* number of the physical CPUs currently in the shared processor pool this partition belong to */
583
u_longlong_t puser; /* raw number of physical processor tics in user mode */
584
u_longlong_t psys; /* raw number of physical processor tics in system mode */
585
u_longlong_t pidle; /* raw number of physical processor tics idle */
586
u_longlong_t pwait; /* raw number of physical processor tics waiting for I/O */
587
u_longlong_t pool_idle_time; /* number of clock tics a processor in the shared pool was idle */
588
u_longlong_t phantintrs; /* number of phantom interrupts received by the partition */
589
u_longlong_t invol_virt_cswitch; /* number involuntary virtual CPU context switches */
590
u_longlong_t vol_virt_cswitch; /* number voluntary virtual CPU context switches */
591
u_longlong_t timebase_last; /* most recently cpu time base */
592
u_longlong_t reserved_pages; /* Currenlty number of 16GB pages. Cannot participate in DR operations */
593
u_longlong_t reserved_pagesize; /* Currently 16GB pagesize Cannot participate in DR operations */
594
u_longlong_t idle_donated_purr; /* number of idle cycles donated by a dedicated partition enabled for donation */
595
u_longlong_t idle_donated_spurr; /* number of idle spurr cycles donated by a dedicated partition enabled for donation */
596
u_longlong_t busy_donated_purr; /* number of busy cycles donated by a dedicated partition enabled for donation */
597
u_longlong_t busy_donated_spurr; /* number of busy spurr cycles donated by a dedicated partition enabled for donation */
598
u_longlong_t idle_stolen_purr; /* number of idle cycles stolen by the hypervisor from a dedicated partition */
599
u_longlong_t idle_stolen_spurr; /* number of idle spurr cycles stolen by the hypervisor from a dedicated partition */
600
u_longlong_t busy_stolen_purr; /* number of busy cycles stolen by the hypervisor from a dedicated partition */
601
u_longlong_t busy_stolen_spurr; /* number of busy spurr cycles stolen by the hypervisor from a dedicated partition */
602
u_longlong_t shcpus_in_sys; /* Number of physical processors allocated for shared processor use */
603
u_longlong_t max_pool_capacity; /* Maximum processor capacity of partitions pool */
604
u_longlong_t entitled_pool_capacity; /* Entitled processor capacity of partitions pool */
605
u_longlong_t pool_max_time; /* Summation of maximum time that could be consumed by the pool (nano seconds) */
606
u_longlong_t pool_busy_time; /* Summation of busy (non-idle) time accumulated across all partitions in the pool (nano seconds) */
607
u_longlong_t pool_scaled_busy_time; /* Scaled summation of busy (non-idle) time accumulated across all partitions in the pool (nano seconds) */
608
u_longlong_t shcpu_tot_time; /* Summation of total time across all physical processors allocated for shared processor use (nano seconds) */
609
u_longlong_t shcpu_busy_time; /* Summation of busy (non-idle) time accumulated across all shared processor partitions (nano seconds) */
610
u_longlong_t shcpu_scaled_busy_time; /* Scaled summation of busy time accumulated across all shared processor partitions (nano seconds) */
611
int ams_pool_id; /* AMS pool id of the pool the LPAR belongs to */
612
int var_mem_weight; /* variable memory capacity weight */
613
u_longlong_t iome; /* I/O memory entitlement of the partition in bytes*/
614
u_longlong_t pmem; /* Physical memory currently backing the partition's logical memory in bytes*/
615
u_longlong_t hpi; /* number of hypervisor page-ins */
616
u_longlong_t hpit; /* Time spent in hypervisor page-ins (in nanoseconds)*/
617
u_longlong_t hypv_pagesize; /* Hypervisor page size in KB*/
618
uint online_lcpus; /* number of online logical cpus */
619
uint smt_thrds; /* number of hardware threads that are running */
620
u_longlong_t puser_spurr; /* number of spurr cycles spent in user mode */
621
u_longlong_t psys_spurr; /* number of spurr cycles spent in kernel mode */
622
u_longlong_t pidle_spurr; /* number of spurr cycles spent in idle mode */
623
u_longlong_t pwait_spurr; /* number of spurr cycles spent in wait mode */
624
int spurrflag; /* set if running in spurr mode */
625
} perfstat_partition_total_t_61;
626
627
typedef struct { /* partition total information AIX 7.1 */
628
char name[IDENTIFIER_LENGTH]; /* name of the logical partition */
629
perfstat_partition_type_t type; /* set of bits describing the partition */
630
int lpar_id; /* logical partition identifier */
631
int group_id; /* identifier of the LPAR group this partition is a member of */
632
int pool_id; /* identifier of the shared pool of physical processors this partition is a member of */
633
int online_cpus; /* number of virtual CPUs currently online on the partition */
634
int max_cpus; /* maximum number of virtual CPUs this parition can ever have */
635
int min_cpus; /* minimum number of virtual CPUs this partition must have */
636
u_longlong_t online_memory; /* amount of memory currently online */
637
u_longlong_t max_memory; /* maximum amount of memory this partition can ever have */
638
u_longlong_t min_memory; /* minimum amount of memory this partition must have */
639
int entitled_proc_capacity; /* number of processor units this partition is entitled to receive */
640
int max_proc_capacity; /* maximum number of processor units this partition can ever have */
641
int min_proc_capacity; /* minimum number of processor units this partition must have */
642
int proc_capacity_increment; /* increment value to the entitled capacity */
643
int unalloc_proc_capacity; /* number of processor units currently unallocated in the shared processor pool this partition belongs to */
644
int var_proc_capacity_weight; /* partition priority weight to receive extra capacity */
645
int unalloc_var_proc_capacity_weight; /* number of variable processor capacity weight units currently unallocated in the shared processor pool this partition belongs to */
646
int online_phys_cpus_sys; /* number of physical CPUs currently active in the system containing this partition */
647
int max_phys_cpus_sys; /* maximum possible number of physical CPUs in the system containing this partition */
648
int phys_cpus_pool; /* number of the physical CPUs currently in the shared processor pool this partition belong to */
649
u_longlong_t puser; /* raw number of physical processor tics in user mode */
650
u_longlong_t psys; /* raw number of physical processor tics in system mode */
651
u_longlong_t pidle; /* raw number of physical processor tics idle */
652
u_longlong_t pwait; /* raw number of physical processor tics waiting for I/O */
653
u_longlong_t pool_idle_time; /* number of clock tics a processor in the shared pool was idle */
654
u_longlong_t phantintrs; /* number of phantom interrupts received by the partition */
655
u_longlong_t invol_virt_cswitch; /* number involuntary virtual CPU context switches */
656
u_longlong_t vol_virt_cswitch; /* number voluntary virtual CPU context switches */
657
u_longlong_t timebase_last; /* most recently cpu time base */
658
u_longlong_t reserved_pages; /* Currenlty number of 16GB pages. Cannot participate in DR operations */
659
u_longlong_t reserved_pagesize; /* Currently 16GB pagesize Cannot participate in DR operations */
660
u_longlong_t idle_donated_purr; /* number of idle cycles donated by a dedicated partition enabled for donation */
661
u_longlong_t idle_donated_spurr; /* number of idle spurr cycles donated by a dedicated partition enabled for donation */
662
u_longlong_t busy_donated_purr; /* number of busy cycles donated by a dedicated partition enabled for donation */
663
u_longlong_t busy_donated_spurr; /* number of busy spurr cycles donated by a dedicated partition enabled for donation */
664
u_longlong_t idle_stolen_purr; /* number of idle cycles stolen by the hypervisor from a dedicated partition */
665
u_longlong_t idle_stolen_spurr; /* number of idle spurr cycles stolen by the hypervisor from a dedicated partition */
666
u_longlong_t busy_stolen_purr; /* number of busy cycles stolen by the hypervisor from a dedicated partition */
667
u_longlong_t busy_stolen_spurr; /* number of busy spurr cycles stolen by the hypervisor from a dedicated partition */
668
u_longlong_t shcpus_in_sys; /* Number of physical processors allocated for shared processor use */
669
u_longlong_t max_pool_capacity; /* Maximum processor capacity of partitions pool */
670
u_longlong_t entitled_pool_capacity; /* Entitled processor capacity of partitions pool */
671
u_longlong_t pool_max_time; /* Summation of maximum time that could be consumed by the pool (nano seconds) */
672
u_longlong_t pool_busy_time; /* Summation of busy (non-idle) time accumulated across all partitions in the pool (nano seconds) */
673
u_longlong_t pool_scaled_busy_time; /* Scaled summation of busy (non-idle) time accumulated across all partitions in the pool (nano seconds) */
674
u_longlong_t shcpu_tot_time; /* Summation of total time across all physical processors allocated for shared processor use (nano seconds) */
675
u_longlong_t shcpu_busy_time; /* Summation of busy (non-idle) time accumulated across all shared processor partitions (nano seconds) */
676
u_longlong_t shcpu_scaled_busy_time; /* Scaled summation of busy time accumulated across all shared processor partitions (nano seconds) */
677
int ams_pool_id; /* AMS pool id of the pool the LPAR belongs to */
678
int var_mem_weight; /* variable memory capacity weight */
679
u_longlong_t iome; /* I/O memory entitlement of the partition in bytes*/
680
u_longlong_t pmem; /* Physical memory currently backing the partition's logical memory in bytes*/
681
u_longlong_t hpi; /* number of hypervisor page-ins */
682
u_longlong_t hpit; /* Time spent in hypervisor page-ins (in nanoseconds)*/
683
u_longlong_t hypv_pagesize; /* Hypervisor page size in KB*/
684
uint online_lcpus; /* number of online logical cpus */
685
uint smt_thrds; /* number of hardware threads that are running */
686
u_longlong_t puser_spurr; /* number of spurr cycles spent in user mode */
687
u_longlong_t psys_spurr; /* number of spurr cycles spent in kernel mode */
688
u_longlong_t pidle_spurr; /* number of spurr cycles spent in idle mode */
689
u_longlong_t pwait_spurr; /* number of spurr cycles spent in wait mode */
690
int spurrflag; /* set if running in spurr mode */
691
char hardwareid[CEC_ID_LEN]; /* CEC Identifier */
692
uint power_save_mode; /* Power save mode for the LPAR. Introduced through LI 53K PRF : Feature 728 292*/
693
ushort ame_version; /* AME Version */
694
u_longlong_t true_memory; /* True Memory Size in 4KB pages */
695
u_longlong_t expanded_memory; /* Expanded Memory Size in 4KB pages */
696
u_longlong_t target_memexp_factr; /* Target Memory Expansion Factor scaled by 100 */
697
u_longlong_t current_memexp_factr; /* Current Memory Expansion Factor scaled by 100 */
698
u_longlong_t target_cpool_size; /* Target Compressed Pool Size in bytes */
699
u_longlong_t max_cpool_size; /* Max Size of Compressed Pool in bytes */
700
u_longlong_t min_ucpool_size; /* Min Size of Uncompressed Pool in bytes */
701
u_longlong_t ame_deficit_size; /*Deficit memory size in bytes */
702
u_longlong_t version; /* version number (1, 2, etc.,) */
703
u_longlong_t cmcs_total_time; /* Total CPU time spent due to active memory expansion */
704
} perfstat_partition_total_t_71;
705
706
typedef struct { /* partition total information AIX 7.1 >= TL1*/
707
char name[IDENTIFIER_LENGTH]; /* name of the logical partition */
708
perfstat_partition_type_t type; /* set of bits describing the partition */
709
int lpar_id; /* logical partition identifier */
710
int group_id; /* identifier of the LPAR group this partition is a member of */
711
int pool_id; /* identifier of the shared pool of physical processors this partition is a member of */
712
int online_cpus; /* number of virtual CPUs currently online on the partition */
713
int max_cpus; /* maximum number of virtual CPUs this parition can ever have */
714
int min_cpus; /* minimum number of virtual CPUs this partition must have */
715
u_longlong_t online_memory; /* amount of memory currently online */
716
u_longlong_t max_memory; /* maximum amount of memory this partition can ever have */
717
u_longlong_t min_memory; /* minimum amount of memory this partition must have */
718
int entitled_proc_capacity; /* number of processor units this partition is entitled to receive */
719
int max_proc_capacity; /* maximum number of processor units this partition can ever have */
720
int min_proc_capacity; /* minimum number of processor units this partition must have */
721
int proc_capacity_increment; /* increment value to the entitled capacity */
722
int unalloc_proc_capacity; /* number of processor units currently unallocated in the shared processor pool this partition belongs to */
723
int var_proc_capacity_weight; /* partition priority weight to receive extra capacity */
724
int unalloc_var_proc_capacity_weight; /* number of variable processor capacity weight units currently unallocated in the shared processor pool this partition belongs to */
725
int online_phys_cpus_sys; /* number of physical CPUs currently active in the system containing this partition */
726
int max_phys_cpus_sys; /* maximum possible number of physical CPUs in the system containing this partition */
727
int phys_cpus_pool; /* number of the physical CPUs currently in the shared processor pool this partition belong to */
728
u_longlong_t puser; /* raw number of physical processor tics in user mode */
729
u_longlong_t psys; /* raw number of physical processor tics in system mode */
730
u_longlong_t pidle; /* raw number of physical processor tics idle */
731
u_longlong_t pwait; /* raw number of physical processor tics waiting for I/O */
732
u_longlong_t pool_idle_time; /* number of clock tics a processor in the shared pool was idle */
733
u_longlong_t phantintrs; /* number of phantom interrupts received by the partition */
734
u_longlong_t invol_virt_cswitch; /* number involuntary virtual CPU context switches */
735
u_longlong_t vol_virt_cswitch; /* number voluntary virtual CPU context switches */
736
u_longlong_t timebase_last; /* most recently cpu time base */
737
u_longlong_t reserved_pages; /* Currenlty number of 16GB pages. Cannot participate in DR operations */
738
u_longlong_t reserved_pagesize; /* Currently 16GB pagesize Cannot participate in DR operations */
739
u_longlong_t idle_donated_purr; /* number of idle cycles donated by a dedicated partition enabled for donation */
740
u_longlong_t idle_donated_spurr; /* number of idle spurr cycles donated by a dedicated partition enabled for donation */
741
u_longlong_t busy_donated_purr; /* number of busy cycles donated by a dedicated partition enabled for donation */
742
u_longlong_t busy_donated_spurr; /* number of busy spurr cycles donated by a dedicated partition enabled for donation */
743
u_longlong_t idle_stolen_purr; /* number of idle cycles stolen by the hypervisor from a dedicated partition */
744
u_longlong_t idle_stolen_spurr; /* number of idle spurr cycles stolen by the hypervisor from a dedicated partition */
745
u_longlong_t busy_stolen_purr; /* number of busy cycles stolen by the hypervisor from a dedicated partition */
746
u_longlong_t busy_stolen_spurr; /* number of busy spurr cycles stolen by the hypervisor from a dedicated partition */
747
u_longlong_t shcpus_in_sys; /* Number of physical processors allocated for shared processor use */
748
u_longlong_t max_pool_capacity; /* Maximum processor capacity of partitions pool */
749
u_longlong_t entitled_pool_capacity; /* Entitled processor capacity of partitions pool */
750
u_longlong_t pool_max_time; /* Summation of maximum time that could be consumed by the pool (nano seconds) */
751
u_longlong_t pool_busy_time; /* Summation of busy (non-idle) time accumulated across all partitions in the pool (nano seconds) */
752
u_longlong_t pool_scaled_busy_time; /* Scaled summation of busy (non-idle) time accumulated across all partitions in the pool (nano seconds) */
753
u_longlong_t shcpu_tot_time; /* Summation of total time across all physical processors allocated for shared processor use (nano seconds) */
754
u_longlong_t shcpu_busy_time; /* Summation of busy (non-idle) time accumulated across all shared processor partitions (nano seconds) */
755
u_longlong_t shcpu_scaled_busy_time; /* Scaled summation of busy time accumulated across all shared processor partitions (nano seconds) */
756
int ams_pool_id; /* AMS pool id of the pool the LPAR belongs to */
757
int var_mem_weight; /* variable memory capacity weight */
758
u_longlong_t iome; /* I/O memory entitlement of the partition in bytes*/
759
u_longlong_t pmem; /* Physical memory currently backing the partition's logical memory in bytes*/
760
u_longlong_t hpi; /* number of hypervisor page-ins */
761
u_longlong_t hpit; /* Time spent in hypervisor page-ins (in nanoseconds)*/
762
u_longlong_t hypv_pagesize; /* Hypervisor page size in KB*/
763
uint online_lcpus; /* number of online logical cpus */
764
uint smt_thrds; /* number of hardware threads that are running */
765
u_longlong_t puser_spurr; /* number of spurr cycles spent in user mode */
766
u_longlong_t psys_spurr; /* number of spurr cycles spent in kernel mode */
767
u_longlong_t pidle_spurr; /* number of spurr cycles spent in idle mode */
768
u_longlong_t pwait_spurr; /* number of spurr cycles spent in wait mode */
769
int spurrflag; /* set if running in spurr mode */
770
char hardwareid[CEC_ID_LEN]; /* CEC Identifier */
771
uint power_save_mode; /* Power save mode for the LPAR. Introduced through LI 53K PRF : Feature 728 292*/
772
ushort ame_version; /* AME Version */
773
u_longlong_t true_memory; /* True Memory Size in 4KB pages */
774
u_longlong_t expanded_memory; /* Expanded Memory Size in 4KB pages */
775
u_longlong_t target_memexp_factr; /* Target Memory Expansion Factor scaled by 100 */
776
u_longlong_t current_memexp_factr; /* Current Memory Expansion Factor scaled by 100 */
777
u_longlong_t target_cpool_size; /* Target Compressed Pool Size in bytes */
778
u_longlong_t max_cpool_size; /* Max Size of Compressed Pool in bytes */
779
u_longlong_t min_ucpool_size; /* Min Size of Uncompressed Pool in bytes */
780
u_longlong_t ame_deficit_size; /*Deficit memory size in bytes */
781
u_longlong_t version; /* version number (1, 2, etc.,) */
782
u_longlong_t cmcs_total_time; /* Total CPU time spent due to active memory expansion */
783
u_longlong_t purr_coalescing; /* If the calling partition is authorized to see pool wide statistics then PURR cycles consumed to coalesce data else set to zero.*/
784
u_longlong_t spurr_coalescing; /* If the calling partition is authorized to see pool wide statistics then SPURR cycles consumed to coalesce data else set to zero.*/
785
u_longlong_t MemPoolSize; /* Indicates the memory pool size of the pool that the partition belongs to (in bytes)., mpsz */
786
u_longlong_t IOMemEntInUse; /* I/O memory entitlement of the LPAR in use in bytes. iomu */
787
u_longlong_t IOMemEntFree; /* free I/O memory entitlement in bytes. iomf */
788
u_longlong_t IOHighWaterMark; /* high water mark of I/O memory entitlement usage in bytes. iohwn */
789
u_longlong_t purr_counter; /* number of purr cycles spent in user + kernel mode */
790
u_longlong_t spurr_counter; /* number of spurr cycles spent in user + kernel mode */
791
792
/* Marketing Requirement(MR): MR1124083744 */
793
u_longlong_t real_free; /* free real memory (in 4KB pages) */
794
u_longlong_t real_avail; /* number of pages available for user application (memfree + numperm - minperm - minfree) */
795
/* >>>>> END OF STRUCTURE DEFINITION <<<<< */
796
#define CURR_VERSION_PARTITION_TOTAL 5 /* Incremented by one for every new release *
797
* of perfstat_partition_total_t data structure */
798
} perfstat_partition_total_t_71_1;
799
800
typedef union { /* WPAR Type & Flags */
801
uint w;
802
struct {
803
unsigned app_wpar :1; /* Application WPAR */
804
unsigned cpu_rset :1; /* WPAR restricted to CPU resource set */
805
unsigned cpu_xrset:1; /* WPAR restricted to CPU Exclusive resource set */
806
unsigned cpu_limits :1; /* CPU resource limits enforced */
807
unsigned mem_limits :1; /* Memory resource limits enforced */
808
unsigned spare :27; /* reserved for future usage */
809
} b;
810
} perfstat_wpar_type_t;
811
812
typedef struct { /* Workload partition Information AIX 5.3 & 6.1*/
813
char name[MAXCORRALNAMELEN+1]; /* name of the Workload Partition */
814
perfstat_wpar_type_t type; /* set of bits describing the wpar */
815
cid_t wpar_id; /* workload partition identifier */
816
uint online_cpus; /* Number of Virtual CPUs in partition rset or number of virtual CPUs currently online on the Global partition*/
817
int cpu_limit; /* CPU limit in 100ths of % - 1..10000 */
818
int mem_limit; /* Memory limit in 100ths of % - 1..10000 */
819
u_longlong_t online_memory; /* amount of memory currently online in Global Partition */
820
int entitled_proc_capacity; /* number of processor units this partition is entitled to receive */
821
} perfstat_wpar_total_t_61;
822
823
typedef struct { /* Workload partition Information AIX 7.1*/
824
char name[MAXCORRALNAMELEN+1]; /* name of the Workload Partition */
825
perfstat_wpar_type_t type; /* set of bits describing the wpar */
826
cid_t wpar_id; /* workload partition identifier */
827
uint online_cpus; /* Number of Virtual CPUs in partition rset or number of virtual CPUs currently online on the Global partition*/
828
int cpu_limit; /* CPU limit in 100ths of % - 1..10000 */
829
int mem_limit; /* Memory limit in 100ths of % - 1..10000 */
830
u_longlong_t online_memory; /* amount of memory currently online in Global Partition */
831
int entitled_proc_capacity; /* number of processor units this partition is entitled to receive */
832
u_longlong_t version; /* version number (1, 2, etc.,) */
833
/* >>>>> END OF STRUCTURE DEFINITION <<<<< */
834
#define CURR_VERSION_WPAR_TOTAL 1 /* Incremented by one for every new release *
835
* of perfstat_wpar_total_t data structure */
836
} perfstat_wpar_total_t_71;
837
838
typedef void * rsethandle_t; /* Type to identify a resource set handle: rsethandle_t */
839
840
typedef enum { WPARNAME, WPARID, RSETHANDLE } wparid_specifier; /* Type of wparid_specifier */
841
842
typedef struct { /* WPAR identifier */
843
wparid_specifier spec; /* Specifier to choose wpar id or name */
844
union {
845
cid_t wpar_id; /* WPAR ID */
846
rsethandle_t rset; /* Rset Handle */
847
char wparname[MAXCORRALNAMELEN+1]; /* WPAR NAME */
848
} u;
849
char name[IDENTIFIER_LENGTH]; /* name of the structure element identifier */
850
} perfstat_id_wpar_t;
851
852
853
854
// end: libperfstat.h (AIX 5.2, 5.3, 6.1, 7.1)
855
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
856
857
#define PERFSTAT_PARTITON_TOTAL_T_LATEST perfstat_partition_total_t_71_1/* latest perfstat_partition_total_t structure */
858
#define PERFSTAT_CPU_TOTAL_T_LATEST perfstat_cpu_total_t_72 /* latest perfstat_cpu_total_t structure */
859
#define PERFSTAT_WPAR_TOTAL_T_LATEST perfstat_wpar_total_t_71 /* latest perfstat_wpar_total_t structure */
860
861
class libperfstat {
862
863
public:
864
865
// Load the libperfstat library (must be in LIBPATH).
866
// Returns true if succeeded, false if error.
867
static bool init();
868
static void cleanup();
869
870
// Direct wrappers for the libperfstat functionality. All they do is
871
// to call the functions with the same name via function pointers.
872
// Get all available data also on newer AIX versions (PERFSTAT_CPU_TOTAL_T_LATEST).
873
static int perfstat_cpu_total(perfstat_id_t *name, PERFSTAT_CPU_TOTAL_T_LATEST* userbuff,
874
int sizeof_userbuff, int desired_number);
875
876
static int perfstat_memory_total(perfstat_id_t *name, perfstat_memory_total_t* userbuff,
877
int sizeof_userbuff, int desired_number);
878
879
static int perfstat_partition_total(perfstat_id_t *name, PERFSTAT_PARTITON_TOTAL_T_LATEST* userbuff,
880
int sizeof_userbuff, int desired_number);
881
882
static void perfstat_reset();
883
884
static int perfstat_wpar_total(perfstat_id_wpar_t *name, PERFSTAT_WPAR_TOTAL_T_LATEST* userbuff,
885
int sizeof_userbuff, int desired_number);
886
887
static cid_t wpar_getcid();
888
889
890
////////////////////////////////////////////////////////////////
891
// The convenience functions get_partitioninfo(), get_cpuinfo(), get_wparinfo() return
892
// information about partition, cpu and wpars, respectivly. They can be used without
893
// regard for which OS release we are on. On older AIX release, some output structure
894
// members will be 0.
895
896
// Result struct for get_partitioninfo().
897
struct partitioninfo_t {
898
// partition type info
899
unsigned smt_capable :1; /* OS supports SMT mode */
900
unsigned smt_enabled :1; /* SMT mode is on */
901
unsigned lpar_capable :1; /* OS supports logical partitioning */
902
unsigned lpar_enabled :1; /* logical partitioning is on */
903
unsigned shared_capable :1; /* OS supports shared processor LPAR */
904
unsigned shared_enabled :1; /* partition runs in shared mode */
905
unsigned dlpar_capable :1; /* OS supports dynamic LPAR */
906
unsigned capped :1; /* partition is capped */
907
unsigned kernel_is_64 :1; /* kernel is 64 bit */
908
unsigned pool_util_authority :1; /* pool utilization available */
909
unsigned donate_capable :1; /* capable of donating cycles */
910
unsigned donate_enabled :1; /* enabled for donating cycles */
911
unsigned ams_capable:1; /* 1 = AMS(Active Memory Sharing) capable, 0 = Not AMS capable */
912
unsigned ams_enabled:1; /* 1 = AMS(Active Memory Sharing) enabled, 0 = Not AMS enabled */
913
unsigned power_save:1; /* 1 = Power saving mode is enabled */
914
unsigned ame_enabled:1; /* Active Memory Expansion is enabled */
915
// partition total info
916
int online_cpus; /* number of virtual CPUs currently online on the partition */
917
int entitled_proc_capacity; /* number of processor units this partition is entitled to receive */
918
int var_proc_capacity_weight; /* partition priority weight to receive extra capacity */
919
int phys_cpus_pool; /* number of the physical CPUs currently in the shared processor pool this partition belong to */
920
int pool_id; /* identifier of the shared pool of physical processors this partition is a member of */
921
u_longlong_t entitled_pool_capacity; /* Entitled processor capacity of partitions pool */
922
char name[IDENTIFIER_LENGTH]; /* name of the logical partition */
923
924
u_longlong_t timebase_last; /* most recently cpu time base (an incremented long int on PowerPC) */
925
u_longlong_t pool_idle_time; /* pool idle time = number of clock tics a processor in the shared pool was idle */
926
u_longlong_t pcpu_tics_user; /* raw number of physical processor tics in user mode */
927
u_longlong_t pcpu_tics_sys; /* raw number of physical processor tics in system mode */
928
u_longlong_t pcpu_tics_idle; /* raw number of physical processor tics idle */
929
u_longlong_t pcpu_tics_wait; /* raw number of physical processor tics waiting for I/O */
930
931
u_longlong_t true_memory; /* True Memory Size in 4KB pages */
932
u_longlong_t expanded_memory; /* Expanded Memory Size in 4KB pages */
933
u_longlong_t target_memexp_factr; /* Target Memory Expansion Factor scaled by 100 */
934
u_longlong_t current_memexp_factr; /* Current Memory Expansion Factor scaled by 100 */
935
u_longlong_t cmcs_total_time; /* Total CPU time spent due to active memory expansion */
936
};
937
938
// Result struct for get_cpuinfo().
939
struct cpuinfo_t {
940
char description[IDENTIFIER_LENGTH]; // processor description (type/official name)
941
u_longlong_t processorHZ; // processor speed in Hz
942
int ncpus; // number of active logical processors
943
double loadavg[3]; // (1<<SBITS) times the average number of runnables processes during the last 1, 5 and 15 minutes.
944
// To calculate the load average, divide the numbers by (1<<SBITS). SBITS is defined in <sys/proc.h>.
945
unsigned long long user_clock_ticks; // raw total number of clock ticks spent in user mode
946
unsigned long long sys_clock_ticks; // raw total number of clock ticks spent in system mode
947
unsigned long long idle_clock_ticks; // raw total number of clock ticks spent idle
948
unsigned long long wait_clock_ticks; // raw total number of clock ticks spent waiting for I/O
949
};
950
951
// Result struct for get_wparinfo().
952
struct wparinfo_t {
953
char name[MAXCORRALNAMELEN+1]; /* name of the Workload Partition */
954
unsigned short wpar_id; /* workload partition identifier */
955
unsigned app_wpar :1; /* Application WPAR */
956
unsigned cpu_rset :1; /* WPAR restricted to CPU resource set */
957
unsigned cpu_xrset:1; /* WPAR restricted to CPU Exclusive resource set */
958
unsigned cpu_limits :1; /* CPU resource limits enforced */
959
unsigned mem_limits :1; /* Memory resource limits enforced */
960
int cpu_limit; /* CPU limit in 100ths of % - 1..10000 */
961
int mem_limit; /* Memory limit in 100ths of % - 1..10000 */
962
};
963
964
static bool get_partitioninfo(partitioninfo_t* ppi);
965
static bool get_cpuinfo(cpuinfo_t* pci);
966
static bool get_wparinfo(wparinfo_t* pwi);
967
};
968
969
#endif // OS_AIX_LIBPERFSTAT_AIX_HPP
970
971