2
KSysGuard, the KDE System Guard
4
Copyright (c) 1999, 2000 Chris Schlaeger <cs@kde.org>
6
Solaris support by Torsten Kasch <tk@Genetik.Uni-Bielefeld.DE>
8
This program is free software; you can redistribute it and/or
9
modify it under the terms of version 2 of the GNU General Public
10
License as published by the Free Software Foundation.
12
This program is distributed in the hope that it will be useful,
13
but WITHOUT ANY WARRANTY; without even the implied warranty of
14
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
GNU General Public License for more details.
17
You should have received a copy of the GNU General Public License
18
along with this program; if not, write to the Free Software
19
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
27
#include <sys/types.h>
33
#include "ksysguardd.h"
37
#define MAX_CPU_COUNT 512
38
double loadavg1 = 0.0;
39
double loadavg5 = 0.0;
40
double loadavg15 = 0.0;
41
double idle_load = 0.0;
45
uint64_t cpu_nsecs_idle;
46
uint64_t cpu_nsecs_kernel;
47
uint64_t cpu_nsecs_user;
48
uint64_t cpu_nsecs_wait;
55
static cpu_loadinfo cpu_load[MAX_CPU_COUNT];
57
void initLoadAvg( struct SensorModul* sm ) {
61
registerMonitor( "cpu/system/loadavg1", "float", printLoadAvg1, printLoadAvg1Info, sm );
62
registerMonitor( "cpu/system/loadavg5", "float", printLoadAvg5, printLoadAvg5Info, sm );
63
registerMonitor( "cpu/system/loadavg15", "float", printLoadAvg15, printLoadAvg15Info, sm );
64
registerMonitor( "cpu/system/idle", "float", printCPUIdle, printCPUIdleInfo, sm );
66
/* Monitor names changed from kde3 => kde4. Remain compatible with legacy requests when possible. */
67
registerLegacyMonitor( "cpu/loadavg1", "float", printLoadAvg1, printLoadAvg1Info, sm );
68
registerLegacyMonitor( "cpu/loadavg5", "float", printLoadAvg5, printLoadAvg5Info, sm );
69
registerLegacyMonitor( "cpu/loadavg15", "float", printLoadAvg15, printLoadAvg15Info, sm );
70
registerLegacyMonitor( "cpu/idle", "float", printCPUIdle, printCPUIdleInfo, sm );
72
for (id=0; id<MAX_CPU_COUNT; id++) {
73
cpu_load[id].ks_instance = -1;
74
cpu_load[id].cpu_nsecs_idle = 0;
75
cpu_load[id].cpu_nsecs_kernel = 0;
76
cpu_load[id].cpu_nsecs_user = 0;
77
cpu_load[id].cpu_nsecs_wait = 0;
78
cpu_load[id].idle_load = 0;
79
cpu_load[id].kernel_load = 0;
80
cpu_load[id].user_load = 0;
81
cpu_load[id].wait_load = 0;
84
nproc = sysconf(_SC_NPROCESSORS_ONLN);
85
for (id=0; id<nproc; id++) {
87
sprintf( cmdName, "cpu/cpu%d/user", id );
88
registerMonitor( cmdName, "float", printCPUxUser, printCPUxUserInfo, sm );
89
sprintf( cmdName, "cpu/cpu%d/sys", id );
90
registerMonitor( cmdName, "float", printCPUxKernel, printCPUxKernelInfo, sm );
91
sprintf( cmdName, "cpu/cpu%d/TotalLoad", id );
92
registerMonitor( cmdName, "float", printCPUxTotalLoad, printCPUxTotalLoadInfo, sm );
93
sprintf( cmdName, "cpu/cpu%d/idle", id );
94
registerMonitor( cmdName, "float", printCPUxIdle, printCPUxIdleInfo, sm );
95
sprintf( cmdName, "cpu/cpu%d/wait", id );
96
registerMonitor( cmdName, "float", printCPUxWait, printCPUxWaitInfo, sm );
102
void exitLoadAvg( void ) {
104
removeMonitor("cpu/system/loadavg1");
105
removeMonitor("cpu/system/loadavg5");
106
removeMonitor("cpu/system/loadavg15");
107
removeMonitor("cpu/system/idle");
109
/* These were registered as legacy monitors */
110
removeMonitor("cpu/loadavg1");
111
removeMonitor("cpu/loadavg5");
112
removeMonitor("cpu/loadavg15");
113
removeMonitor("cpu/idle");
117
int updateLoadAvg( void ) {
122
kstat_named_t *kdata;
127
* get a kstat handle and update the user's kstat chain
129
if( (kctl = kstat_open()) == NULL )
131
while( kstat_chain_update( kctl ) != 0 )
134
for (i=0; i<MAX_CPU_COUNT && cpu_load[i].ks_instance != -1; i++) {
135
cpu_load[i].idle_load = 0;
136
cpu_load[i].kernel_load = 0;
137
cpu_load[i].user_load = 0;
138
cpu_load[i].wait_load = 0;
142
* traverse the kstat chain to find the appropriate statistics
144
/* if( (ksp = kstat_lookup( kctl, "unix", 0, "system_misc" )) == NULL )
146
for (ksp = kctl->kc_chain; ksp; ksp = ksp->ks_next) {
147
if (strcmp(ksp->ks_module, "unix") == 0 &&
148
strcmp(ksp->ks_name, "system_misc") == 0) {
150
if( kstat_read( kctl, ksp, NULL ) == -1 )
156
kdata = (kstat_named_t *) kstat_data_lookup( ksp, "avenrun_1min" );
158
loadavg1 = LOAD( kdata->value.ui32 );
159
kdata = (kstat_named_t *) kstat_data_lookup( ksp, "avenrun_5min" );
161
loadavg5 = LOAD( kdata->value.ui32 );
162
kdata = (kstat_named_t *) kstat_data_lookup( ksp, "avenrun_15min" );
164
loadavg15 = LOAD( kdata->value.ui32 );
166
} else if (strcmp(ksp->ks_module, "cpu") == 0 &&
167
strcmp(ksp->ks_name, "sys") == 0) {
171
for (i=0; i<MAX_CPU_COUNT; i++) {
172
if (cpu_load[i].ks_instance == ksp->ks_instance) {
176
if (cpu_load[i].ks_instance == -1) {
177
cpu_load[i].ks_instance = ksp->ks_instance;
183
uint64_t curr_cpu_nsecs_idle, curr_cpu_nsecs_kernel;
184
uint64_t curr_cpu_nsecs_user, curr_cpu_nsecs_wait;
187
if( kstat_read( kctl, ksp, NULL ) == -1 )
190
kdata = (kstat_named_t *) kstat_data_lookup( ksp, "cpu_nsec_idle" );
192
curr_cpu_nsecs_idle = LOAD( kdata->value.ui64 );
193
kdata = (kstat_named_t *) kstat_data_lookup( ksp, "cpu_nsec_kernel" );
195
curr_cpu_nsecs_kernel = LOAD( kdata->value.ui64 );
196
kdata = (kstat_named_t *) kstat_data_lookup( ksp, "cpu_nsec_user" );
198
curr_cpu_nsecs_user = LOAD( kdata->value.ui64 );
199
kdata = (kstat_named_t *) kstat_data_lookup( ksp, "cpu_nsec_wait" );
201
curr_cpu_nsecs_wait = LOAD( kdata->value.ui64 );
204
cpu_load[i].cpu_nsecs_idle = curr_cpu_nsecs_idle;
205
cpu_load[i].cpu_nsecs_kernel = curr_cpu_nsecs_kernel;
206
cpu_load[i].cpu_nsecs_user = curr_cpu_nsecs_user;
207
cpu_load[i].cpu_nsecs_wait = curr_cpu_nsecs_wait;
211
totalNsecs = (curr_cpu_nsecs_idle - cpu_load[i].cpu_nsecs_idle) +
212
(curr_cpu_nsecs_kernel - cpu_load[i].cpu_nsecs_kernel) +
213
(curr_cpu_nsecs_user - cpu_load[i].cpu_nsecs_user) +
214
(curr_cpu_nsecs_wait - cpu_load[i].cpu_nsecs_wait);
216
if (totalNsecs > 10) {
217
cpu_load[i].idle_load =
218
(100.0 * (curr_cpu_nsecs_idle - cpu_load[i].cpu_nsecs_idle)) \
220
cpu_load[i].kernel_load =
221
(100.0 * (curr_cpu_nsecs_kernel - cpu_load[i].cpu_nsecs_kernel)) \
223
cpu_load[i].user_load =
224
(100.0 * (curr_cpu_nsecs_user - cpu_load[i].cpu_nsecs_user)) \
226
cpu_load[i].wait_load =
227
(100.0 * (curr_cpu_nsecs_wait - cpu_load[i].cpu_nsecs_wait)) \
230
cpu_load[i].cpu_nsecs_idle = curr_cpu_nsecs_idle;
231
cpu_load[i].cpu_nsecs_kernel = curr_cpu_nsecs_kernel;
232
cpu_load[i].cpu_nsecs_user = curr_cpu_nsecs_user;
233
cpu_load[i].cpu_nsecs_wait = curr_cpu_nsecs_wait;
238
nproc = sysconf(_SC_NPROCESSORS_ONLN);
240
for (id=0; id<nproc; id++) {
241
idle_load += cpu_load[i].idle_load;
243
idle_load = idle_load / nproc;
247
#endif /* ! HAVE_KSTAT */
252
void printLoadAvg1Info( const char *cmd ) {
253
fprintf(CurrentClient, "avnrun 1min\t0\t0\n" );
256
void printLoadAvg1( const char *cmd ) {
257
fprintf(CurrentClient, "%f\n", loadavg1 );
260
void printLoadAvg5Info( const char *cmd ) {
261
fprintf(CurrentClient, "avnrun 5min\t0\t0\n" );
264
void printLoadAvg5( const char *cmd ) {
265
fprintf(CurrentClient, "%f\n", loadavg5 );
268
void printLoadAvg15Info( const char *cmd ) {
269
fprintf(CurrentClient, "avnrun 15min\t0\t0\n" );
272
void printLoadAvg15( const char *cmd ) {
273
fprintf(CurrentClient, "%f\n", loadavg15 );
276
void printCPUxUser( const char* cmd ) {
279
sscanf( cmd + 7, "%d", &id );
280
fprintf(CurrentClient, "%f\n", cpu_load[ id ].user_load );
283
void printCPUxUserInfo( const char* cmd ) {
286
sscanf( cmd + 7, "%d", &id );
287
fprintf(CurrentClient, "CPU %d User Load\t0\t100\t%%\n", id );
290
void printCPUxKernel( const char* cmd ) {
293
sscanf( cmd + 7, "%d", &id );
294
fprintf(CurrentClient, "%f\n", cpu_load[ id ].kernel_load );
297
void printCPUxKernelInfo( const char* cmd ) {
300
sscanf( cmd + 7, "%d", &id );
301
fprintf(CurrentClient, "CPU %d System Load\t0\t100\t%%\n", id );
304
void printCPUxTotalLoad( const char* cmd ) {
307
sscanf( cmd + 7, "%d", &id );
308
fprintf(CurrentClient, "%f\n", cpu_load[ id ].user_load + \
309
cpu_load[ id ].kernel_load + cpu_load[ id ].wait_load );
312
void printCPUxTotalLoadInfo( const char* cmd ) {
315
sscanf( cmd + 7, "%d", &id );
316
fprintf(CurrentClient, "CPU %d Total Load\t0\t100\t%%\n", id );
319
void printCPUIdle( const char* cmd ) {
320
fprintf(CurrentClient, "%f\n", idle_load );
323
void printCPUIdleInfo( const char* cmd ) {
324
fprintf(CurrentClient, "CPU Idle Load\t0\t100\t%%\n" );
327
void printCPUxIdle( const char* cmd ) {
330
sscanf( cmd + 7, "%d", &id );
331
fprintf(CurrentClient, "%f\n", cpu_load[ id ].idle_load );
334
void printCPUxIdleInfo( const char* cmd ) {
337
sscanf( cmd + 7, "%d", &id );
338
fprintf(CurrentClient, "CPU %d Idle Load\t0\t100\t%%\n", id );
341
void printCPUxWait( const char* cmd )
345
sscanf( cmd + 7, "%d", &id );
346
fprintf(CurrentClient, "%f\n", cpu_load[ id ].wait_load );
349
void printCPUxWaitInfo( const char* cmd )
353
sscanf( cmd + 7, "%d", &id );
354
fprintf(CurrentClient, "CPU %d Wait Load\t0\t100\t%%\n", id );