VERSION: Bump version up to 4.9.3...
[Samba.git] / examples / perfcounter / perf_writer_disk.c
blob18a63a4f476fd5d9306faa4a9d0f3c8e8e783498
1 /*
2 * Unix SMB/CIFS implementation.
3 * Performance Counter Daemon
5 * Copyright (C) Marcin Krzysztof Porwit 2005
6 *
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 3 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, see <http://www.gnu.org/licenses/>.
21 #include "perf.h"
23 void init_diskdata_desc(PERF_DATA_BLOCK *data)
25 init_perf_counter(&(data->diskInfo.diskObjDesc),
26 &(data->diskInfo.diskObjDesc),
27 get_counter_id(data),
28 "Logical Disk",
29 "The Logical Disk object consists of counters that show information about disks.",
31 PERF_OBJECT);
32 init_perf_counter(&(data->diskInfo.freeMegs),
33 &(data->diskInfo.diskObjDesc),
34 get_counter_id(data),
35 "Megabytes Free",
36 "The amount of available disk space, in megabytes.",
37 PERF_SIZE_LARGE | PERF_TYPE_NUMBER | PERF_NUMBER_DECIMAL | PERF_DISPLAY_NO_SUFFIX,
38 PERF_COUNTER);
39 init_perf_counter(&(data->diskInfo.writesPerSec),
40 &(data->diskInfo.diskObjDesc),
41 get_counter_id(data),
42 "Writes/sec",
43 "The number of writes per second to that disk.",
44 PERF_SIZE_DWORD | PERF_TYPE_COUNTER | PERF_COUNTER_RATE | PERF_DELTA_COUNTER | PERF_DISPLAY_PER_SEC,
45 PERF_COUNTER);
46 init_perf_counter(&(data->diskInfo.readsPerSec),
47 &(data->diskInfo.diskObjDesc),
48 get_counter_id(data),
49 "Reads/sec",
50 "The number of reads of that disk per second.",
51 PERF_SIZE_DWORD | PERF_TYPE_COUNTER | PERF_COUNTER_RATE | PERF_DELTA_COUNTER | PERF_DISPLAY_PER_SEC,
52 PERF_COUNTER);
54 return;
56 void init_num_disks(PERF_DATA_BLOCK *data)
58 FILE *mtab;
59 char buf[PROC_BUF];
60 char *start, *stop;
61 int i = 0, num;
63 if(!(mtab = fopen("/etc/mtab", "r")))
65 perror("init_disk_names: fopen");
66 exit(1);
69 rewind(mtab);
70 fflush(mtab);
72 while(fgets(buf, sizeof(buf), mtab))
74 if(start = strstr(buf, "/dev/"))
76 if(start = strstr(start, "da"))
78 i++;
83 data->diskInfo.numDisks = i;
84 fclose(mtab);
86 return;
89 void init_disk_names(PERF_DATA_BLOCK *data)
91 FILE *mtab;
92 char buf[PROC_BUF];
93 char *start, *stop;
94 int i = 0, num;
96 if(!(mtab = fopen("/etc/mtab", "r")))
98 perror("init_disk_names: fopen");
99 exit(1);
102 rewind(mtab);
103 fflush(mtab);
105 while(fgets(buf, sizeof(buf), mtab))
107 if(start = strstr(buf, "/dev/"))
109 if(start = strstr(start, "da"))
111 start -=1;
112 stop = strstr(start, " ");
113 memcpy(data->diskInfo.mdata[i].name, start, stop - start);
114 start = stop +1;
115 stop = strstr(start, " ");
116 memcpy(data->diskInfo.mdata[i].mountpoint, start, stop - start);
117 i++;
122 fclose(mtab);
124 return;
127 void get_diskinfo(PERF_DATA_BLOCK *data)
129 int i;
130 DiskData *p;
131 struct statfs statfsbuf;
132 int status, num;
133 char buf[LARGE_BUF], *start;
134 FILE *diskstats;
135 unsigned long reads, writes, discard;
137 diskstats = fopen("/proc/diskstats", "r");
138 rewind(diskstats);
139 fflush(diskstats);
140 status = fread(buf, sizeof(char), LARGE_BUF, diskstats);
141 fclose(diskstats);
143 for(i = 0; i < data->diskInfo.numDisks; i++)
145 p = &(data->diskInfo.data[i]);
146 status = statfs(data->diskInfo.mdata[i].mountpoint, &statfsbuf);
147 p->freeMegs = (statfsbuf.f_bfree*statfsbuf.f_bsize)/1048576;
148 start = strstr(buf, data->diskInfo.mdata[i].name);
149 start += strlen(data->diskInfo.mdata[i].name) + 1;
150 num = sscanf(start, "%lu %lu %lu %lu",
151 &reads,
152 &discard,
153 &writes,
154 &discard);
155 p->writesPerSec = writes;
156 p->readsPerSec = reads;
157 fprintf(stderr, "%s:\t%u\t%u\n",
158 data->diskInfo.mdata[i].mountpoint,
159 reads, writes);
161 return;
163 void init_disk_data(PERF_DATA_BLOCK *data)
165 init_diskdata_desc(data);
167 init_num_disks(data);
169 data->diskInfo.mdata = calloc(data->diskInfo.numDisks, sizeof(DiskMetaData));
170 if(!data->diskInfo.mdata)
172 fatal("init_disk_data: out of memory");
175 init_disk_names(data);
177 data->diskInfo.data = calloc(data->diskInfo.numDisks, sizeof(DiskData));
178 if(!data->diskInfo.data)
180 fatal("init_disk_data: out of memory");
183 get_diskinfo(data);
185 return;
188 void output_disk_desc(PERF_DATA_BLOCK *data, RuntimeSettings rt)
190 output_perf_desc(data->diskInfo.diskObjDesc, rt);
191 output_perf_desc(data->diskInfo.freeMegs, rt);
192 output_perf_desc(data->diskInfo.writesPerSec, rt);
193 output_perf_desc(data->diskInfo.readsPerSec, rt);
194 output_num_instances(data->diskInfo.diskObjDesc, data->diskInfo.numDisks, rt);
196 return;
199 void output_diskinfo(PERF_DATA_BLOCK *data, RuntimeSettings rt, int tdb_flags)
201 int i;
203 output_perf_counter(data->diskInfo.freeMegs,
204 data->diskInfo.data[0].freeMegs,
205 rt, tdb_flags);
206 output_perf_counter(data->diskInfo.writesPerSec,
207 (unsigned long long)data->diskInfo.data[0].writesPerSec,
208 rt, tdb_flags);
209 output_perf_counter(data->diskInfo.readsPerSec,
210 (unsigned long long)data->diskInfo.data[0].readsPerSec,
211 rt, tdb_flags);
213 for(i = 0; i < data->diskInfo.numDisks; i++)
215 output_perf_instance(data->diskInfo.diskObjDesc.index,
217 (void *)&(data->diskInfo.data[i]),
218 sizeof(DiskData),
219 data->diskInfo.mdata[i].mountpoint,
220 rt, tdb_flags);
223 return;