2 * Unix SMB/CIFS implementation.
3 * Performance Counter Daemon
5 * Copyright (C) Marcin Krzysztof Porwit 2005
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
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., 675 Mass Ave, Cambridge, MA 02139, USA.
24 void init_diskdata_desc(PERF_DATA_BLOCK
*data
)
26 init_perf_counter(&(data
->diskInfo
.diskObjDesc
),
27 &(data
->diskInfo
.diskObjDesc
),
30 "The Logical Disk object consists of counters that show information about disks.",
33 init_perf_counter(&(data
->diskInfo
.freeMegs
),
34 &(data
->diskInfo
.diskObjDesc
),
37 "The amount of available disk space, in megabytes.",
38 PERF_SIZE_LARGE
| PERF_TYPE_NUMBER
| PERF_NUMBER_DECIMAL
| PERF_DISPLAY_NO_SUFFIX
,
40 init_perf_counter(&(data
->diskInfo
.writesPerSec
),
41 &(data
->diskInfo
.diskObjDesc
),
44 "The number of writes per second to that disk.",
45 PERF_SIZE_DWORD
| PERF_TYPE_COUNTER
| PERF_COUNTER_RATE
| PERF_DELTA_COUNTER
| PERF_DISPLAY_PER_SEC
,
47 init_perf_counter(&(data
->diskInfo
.readsPerSec
),
48 &(data
->diskInfo
.diskObjDesc
),
51 "The number of reads of that disk per second.",
52 PERF_SIZE_DWORD
| PERF_TYPE_COUNTER
| PERF_COUNTER_RATE
| PERF_DELTA_COUNTER
| PERF_DISPLAY_PER_SEC
,
57 void init_num_disks(PERF_DATA_BLOCK
*data
)
64 if(!(mtab
= fopen("/etc/mtab", "r")))
66 perror("init_disk_names: fopen");
73 while(fgets(buf
, sizeof(buf
), mtab
))
75 if(start
= strstr(buf
, "/dev/"))
77 if(start
= strstr(start
, "da"))
84 data
->diskInfo
.numDisks
= i
;
90 void init_disk_names(PERF_DATA_BLOCK
*data
)
97 if(!(mtab
= fopen("/etc/mtab", "r")))
99 perror("init_disk_names: fopen");
106 while(fgets(buf
, sizeof(buf
), mtab
))
108 if(start
= strstr(buf
, "/dev/"))
110 if(start
= strstr(start
, "da"))
113 stop
= strstr(start
, " ");
114 memcpy(data
->diskInfo
.mdata
[i
].name
, start
, stop
- start
);
116 stop
= strstr(start
, " ");
117 memcpy(data
->diskInfo
.mdata
[i
].mountpoint
, start
, stop
- start
);
128 void get_diskinfo(PERF_DATA_BLOCK
*data
)
132 struct statfs statfsbuf
;
134 char buf
[LARGE_BUF
], *start
;
136 long reads
, writes
, discard
;
138 diskstats
= fopen("/proc/diskstats", "r");
141 status
= fread(buf
, sizeof(char), LARGE_BUF
, diskstats
);
144 for(i
= 0; i
< data
->diskInfo
.numDisks
; i
++)
146 p
= &(data
->diskInfo
.data
[i
]);
147 status
= statfs(data
->diskInfo
.mdata
[i
].mountpoint
, &statfsbuf
);
148 p
->freeMegs
= (statfsbuf
.f_bfree
*statfsbuf
.f_bsize
)/1048576;
149 start
= strstr(buf
, data
->diskInfo
.mdata
[i
].name
);
150 start
+= strlen(data
->diskInfo
.mdata
[i
].name
) + 1;
151 num
= sscanf(start
, "%u %u %u %u",
156 p
->writesPerSec
= writes
;
157 p
->readsPerSec
= reads
;
158 fprintf(stderr
, "%s:\t%u\t%u\n",
159 data
->diskInfo
.mdata
[i
].mountpoint
,
164 void init_disk_data(PERF_DATA_BLOCK
*data
)
166 init_diskdata_desc(data
);
168 init_num_disks(data
);
170 data
->diskInfo
.mdata
= calloc(data
->diskInfo
.numDisks
, sizeof(DiskMetaData
));
171 if(!data
->diskInfo
.mdata
)
173 fatal("init_disk_data: out of memory");
176 init_disk_names(data
);
178 data
->diskInfo
.data
= calloc(data
->diskInfo
.numDisks
, sizeof(DiskData
));
179 if(!data
->diskInfo
.data
)
181 fatal("init_disk_data: out of memory");
189 void output_disk_desc(PERF_DATA_BLOCK
*data
, RuntimeSettings rt
)
191 output_perf_desc(data
->diskInfo
.diskObjDesc
, rt
);
192 output_perf_desc(data
->diskInfo
.freeMegs
, rt
);
193 output_perf_desc(data
->diskInfo
.writesPerSec
, rt
);
194 output_perf_desc(data
->diskInfo
.readsPerSec
, rt
);
195 output_num_instances(data
->diskInfo
.diskObjDesc
, data
->diskInfo
.numDisks
, rt
);
200 void output_diskinfo(PERF_DATA_BLOCK
*data
, RuntimeSettings rt
, int tdb_flags
)
204 output_perf_counter(data
->diskInfo
.freeMegs
,
205 data
->diskInfo
.data
[0].freeMegs
,
207 output_perf_counter(data
->diskInfo
.writesPerSec
,
208 (unsigned long long)data
->diskInfo
.data
[0].writesPerSec
,
210 output_perf_counter(data
->diskInfo
.readsPerSec
,
211 (unsigned long long)data
->diskInfo
.data
[0].readsPerSec
,
214 for(i
= 0; i
< data
->diskInfo
.numDisks
; i
++)
216 output_perf_instance(data
->diskInfo
.diskObjDesc
.index
,
218 (void *)&(data
->diskInfo
.data
[i
]),
220 data
->diskInfo
.mdata
[i
].mountpoint
,