Separate net.isr module
Vladimir Kobal committed
Mar 9, 2017 at 23:36 UTC
7e98694a7beb0f2fdde6ea2d3ed9aa68a9342bdc
3 files changed
+171
-118
src/freebsd_sysctl.c
+169
-118
@@ -1224,12 +1224,179 @@ int do_uptime(int update_every, usec_t dt) {
1224
return 0;
1225
}
1226
1227
+// --------------------------------------------------------------------------------------------------------------------
1228
+// net.isr
1229
+
1230
+int do_net_isr(int update_every, usec_t dt) {
1231
+ static int do_netisr = -1, do_netisr_per_core = -1;
1232
+
1233
+ if (unlikely(do_netisr == -1)) {
1234
+ do_netisr = config_get_boolean("plugin:freebsd:sysctl", "netisr", 1);
1235
+ do_netisr_per_core = config_get_boolean("plugin:freebsd:sysctl", "netisr per core", 1);
1236
+ }
1237
+
1238
+ static int mib_workstream[3] = {0, 0, 0}, mib_work[3] = {0, 0, 0};
1239
+ int common_error = 0;
1240
+ int i, n;
1241
+ size_t netisr_workstream_size, netisr_work_size;
1242
+ unsigned long num_netisr_workstreams = 0, num_netisr_works = 0;
1243
+ static struct sysctl_netisr_workstream *netisr_workstream = NULL;
1244
+ static struct sysctl_netisr_work *netisr_work = NULL;
1245
+ static struct netisr_stats {
1246
+ collected_number dispatched;
1247
+ collected_number hybrid_dispatched;
1248
+ collected_number qdrops;
1249
+ collected_number queued;
1250
+ } *netisr_stats = NULL;
1251
+
1252
+ if (likely(do_netisr || do_netisr_per_core)) {
1253
+ if (unlikely(GETSYSCTL_SIZE("net.isr.workstream", mib_workstream, netisr_workstream_size))) {
1254
+ common_error = 1;
1255
+ } else if (unlikely(GETSYSCTL_SIZE("net.isr.work", mib_work, netisr_work_size))) {
1256
+ common_error = 1;
1257
+ } else {
1258
+ num_netisr_workstreams = netisr_workstream_size / sizeof(struct sysctl_netisr_workstream);
1259
+ netisr_workstream = reallocz(netisr_workstream, num_netisr_workstreams * sizeof(struct sysctl_netisr_workstream));
1260
+ if (unlikely(GETSYSCTL_WSIZE("net.isr.workstream", mib_workstream, netisr_workstream,
1261
+ num_netisr_workstreams * sizeof(struct sysctl_netisr_workstream)))){
1262
+ common_error = 1;
1263
+ } else {
1264
+ num_netisr_works = netisr_work_size / sizeof(struct sysctl_netisr_work);
1265
+ netisr_work = reallocz(netisr_work, num_netisr_works * sizeof(struct sysctl_netisr_work));
1266
+ if (unlikely(GETSYSCTL_WSIZE("net.isr.work", mib_work, netisr_work,
1267
+ num_netisr_works * sizeof(struct sysctl_netisr_work)))){
1268
+ common_error = 1;
1269
+ }
1270
+ }
1271
+ }
1272
+ if (unlikely(common_error)) {
1273
+ do_netisr = 0;
1274
+ error("DISABLED: system.softnet_stat chart");
1275
+ do_netisr_per_core = 0;
1276
+ error("DISABLED: system.cpuX_softnet_stat chart");
1277
+ common_error = 0;
1278
+ error("DISABLED: net.isr module");
1279
+ return 1;
1280
+ } else {
1281
+ netisr_stats = reallocz(netisr_stats, (number_of_cpus + 1) * sizeof(struct netisr_stats));
1282
+ bzero(netisr_stats, (number_of_cpus + 1) * sizeof(struct netisr_stats));
1283
+ for (i = 0; i < num_netisr_workstreams; i++) {
1284
+ for (n = 0; n < num_netisr_works; n++) {
1285
+ if (netisr_workstream[i].snws_wsid == netisr_work[n].snw_wsid) {
1286
+ netisr_stats[netisr_workstream[i].snws_cpu].dispatched += netisr_work[n].snw_dispatched;
1287
+ netisr_stats[netisr_workstream[i].snws_cpu].hybrid_dispatched += netisr_work[n].snw_hybrid_dispatched;
1288
+ netisr_stats[netisr_workstream[i].snws_cpu].qdrops += netisr_work[n].snw_qdrops;
1289
+ netisr_stats[netisr_workstream[i].snws_cpu].queued += netisr_work[n].snw_queued;
1290
+ }
1291
+ }
1292
+ }
1293
+ for (i = 0; i < number_of_cpus; i++) {
1294
+ netisr_stats[number_of_cpus].dispatched += netisr_stats[i].dispatched;
1295
+ netisr_stats[number_of_cpus].hybrid_dispatched += netisr_stats[i].hybrid_dispatched;
1296
+ netisr_stats[number_of_cpus].qdrops += netisr_stats[i].qdrops;
1297
+ netisr_stats[number_of_cpus].queued += netisr_stats[i].queued;
1298
+ }
1299
+ }
1300
+ } else {
1301
+ error("DISABLED: net.isr module");
1302
+ return 1;
1303
+ }
1304
+
1305
+ // --------------------------------------------------------------------
1306
+
1307
+ if (likely(do_netisr)) {
1308
+ static RRDSET *st = NULL;
1309
+ static RRDDIM *rd_dispatched = NULL, *rd_hybrid_dispatched = NULL, *rd_qdrops = NULL, *rd_queued = NULL;
1310
+
1311
+ if (unlikely(!st)) {
1312
+ st = rrdset_create_localhost("system",
1313
+ "softnet_stat",
1314
+ NULL,
1315
+ "softnet_stat",
1316
+ NULL,
1317
+ "System softnet_stat",
1318
+ "events/s",
1319
+ 955,
1320
+ update_every,
1321
+ RRDSET_TYPE_LINE
1322
+ );
1323
+
1324
+ rd_dispatched = rrddim_add(st, "dispatched", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
1325
+ rd_hybrid_dispatched = rrddim_add(st, "hybrid_dispatched", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
1326
+ rd_qdrops = rrddim_add(st, "qdrops", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
1327
+ rd_queued = rrddim_add(st, "queued", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
1328
+ }
1329
+ else rrdset_next(st);
1330
+
1331
+ rrddim_set_by_pointer(st, rd_dispatched, netisr_stats[number_of_cpus].dispatched);
1332
+ rrddim_set_by_pointer(st, rd_hybrid_dispatched, netisr_stats[number_of_cpus].hybrid_dispatched);
1333
+ rrddim_set_by_pointer(st, rd_qdrops, netisr_stats[number_of_cpus].qdrops);
1334
+ rrddim_set_by_pointer(st, rd_queued, netisr_stats[number_of_cpus].queued);
1335
+ rrdset_done(st);
1336
+ }
1337
+
1338
+ // --------------------------------------------------------------------
1339
+
1340
+ if (likely(do_netisr_per_core)) {
1341
+ static struct softnet_chart {
1342
+ char netisr_cpuid[MAX_INT_DIGITS + 17];
1343
+ RRDSET *st;
1344
+ RRDDIM *rd_dispatched;
1345
+ RRDDIM *rd_hybrid_dispatched;
1346
+ RRDDIM *rd_qdrops;
1347
+ RRDDIM *rd_queued;
1348
+ } *all_softnet_charts = NULL;
1349
+
1350
+ all_softnet_charts = reallocz(all_softnet_charts, sizeof(struct softnet_chart) * number_of_cpus);
1351
+
1352
+ for (i = 0; i < number_of_cpus ;i++) {
1353
+ snprintfz(all_softnet_charts[i].netisr_cpuid, MAX_INT_DIGITS + 17, "cpu%d_softnet_stat", i);
1354
+
1355
+ if (unlikely(!all_softnet_charts[i].st)) {
1356
+ all_softnet_charts[i].st = rrdset_create_localhost("cpu",
1357
+ all_softnet_charts[i].netisr_cpuid,
1358
+ NULL,
1359
+ "softnet_stat",
1360
+ NULL,
1361
+ "Per CPU netisr statistics",
1362
+ "events/s",
1363
+ 1101 + i,
1364
+ update_every,
1365
+ RRDSET_TYPE_LINE
1366
+ );
1367
+
1368
+ all_softnet_charts[i].rd_dispatched = rrddim_add(all_softnet_charts[i].st, "dispatched",
1369
+ NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
1370
+ all_softnet_charts[i].rd_hybrid_dispatched = rrddim_add(all_softnet_charts[i].st, "hybrid_dispatched",
1371
+ NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
1372
+ all_softnet_charts[i].rd_qdrops = rrddim_add(all_softnet_charts[i].st, "qdrops",
1373
+ NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
1374
+ all_softnet_charts[i].rd_queued = rrddim_add(all_softnet_charts[i].st, "queued",
1375
+ NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
1376
+ }
1377
+ else rrdset_next(all_softnet_charts[i].st);
1378
+
1379
+ rrddim_set_by_pointer(all_softnet_charts[i].st, all_softnet_charts[i].rd_dispatched,
1380
+ netisr_stats[i].dispatched);
1381
+ rrddim_set_by_pointer(all_softnet_charts[i].st, all_softnet_charts[i].rd_hybrid_dispatched,
1382
+ netisr_stats[i].hybrid_dispatched);
1383
+ rrddim_set_by_pointer(all_softnet_charts[i].st, all_softnet_charts[i].rd_qdrops,
1384
+ netisr_stats[i].qdrops);
1385
+ rrddim_set_by_pointer(all_softnet_charts[i].st, all_softnet_charts[i].rd_queued,
1386
+ netisr_stats[i].queued);
1387
+ rrdset_done(all_softnet_charts[i].st);
1388
+ }
1389
+ }
1390
+
1391
+ return 0;
1392
+}
1393
+
1394
// --------------------------------------------------------------------------------------------------------------------
1395
// old sources
1396
1397
int do_freebsd_sysctl_old(int update_every, usec_t dt) {
1398
static int do_disk_io = -1,
1232
- do_netisr = -1, do_netisr_per_core = -1, do_bandwidth = -1,
1399
+ do_bandwidth = -1,
1400
do_tcp_sockets = -1, do_tcp_packets = -1, do_tcp_errors = -1, do_tcp_handshake = -1,
1401
do_ecn = -1, do_tcpext_syscookies = -1, do_tcpext_ofo = -1, do_tcpext_connaborts = -1,
1402
do_udp_packets = -1, do_udp_errors = -1, do_icmp_packets = -1, do_icmpmsg = -1,
@@ -1240,8 +1407,6 @@ int do_freebsd_sysctl_old(int update_every, usec_t dt) {
1407
1408
if (unlikely(do_disk_io == -1)) {
1409
do_disk_io = config_get_boolean("plugin:freebsd:sysctl", "stats for all disks", 1);
1243
- do_netisr = config_get_boolean("plugin:freebsd:sysctl", "netisr", 1);
1244
- do_netisr_per_core = config_get_boolean("plugin:freebsd:sysctl", "netisr per core", 1);
1410
do_bandwidth = config_get_boolean("plugin:freebsd:sysctl", "bandwidth", 1);
1411
do_tcp_sockets = config_get_boolean("plugin:freebsd:sysctl", "ipv4 TCP connections", 1);
1412
do_tcp_packets = config_get_boolean("plugin:freebsd:sysctl", "ipv4 TCP packets", 1);
@@ -1276,9 +1441,7 @@ int do_freebsd_sysctl_old(int update_every, usec_t dt) {
1441
1442
RRDSET *st;
1443
1279
- int ncpus;
1280
- int i, n;
1281
- int common_error = 0;
1444
+ int i;
1445
char title[4096 + 1];
1446
1447
// NEEDED BY: do_disk_io
@@ -1303,20 +1466,6 @@ int do_freebsd_sysctl_old(int update_every, usec_t dt) {
1466
collected_number busy_time_ms;
1467
} prev_dstat;
1468
1306
- // NEEDED BY: do_netisr, do_netisr_per_core
1307
- size_t netisr_workstream_size;
1308
- size_t netisr_work_size;
1309
- unsigned long num_netisr_workstreams = 0, num_netisr_works = 0;
1310
- static struct sysctl_netisr_workstream *netisr_workstream = NULL;
1311
- static struct sysctl_netisr_work *netisr_work = NULL;
1312
- static struct netisr_stats {
1313
- collected_number dispatched;
1314
- collected_number hybrid_dispatched;
1315
- collected_number qdrops;
1316
- collected_number queued;
1317
- } *netisr_stats = NULL;
1318
- char netstat_cpuid[21]; // no more than 4 digits expected
1319
-
1469
// NEEDED BY: do_bandwidth
1470
#define IFA_DATA(s) (((struct if_data *)ifa->ifa_data)->ifi_ ## s)
1471
struct ifaddrs *ifa, *ifap;
@@ -1537,104 +1686,6 @@ int do_freebsd_sysctl_old(int update_every, usec_t dt) {
1686
1687
// --------------------------------------------------------------------
1688
1540
- if (likely(do_netisr || do_netisr_per_core)) {
1541
- if (unlikely(GETSYSCTL_BY_NAME("kern.smp.cpus", ncpus))) {
1542
- common_error = 1;
1543
- } else if (unlikely(sysctlbyname("net.isr.workstream", NULL, &netisr_workstream_size, NULL, 0) == -1)) {
1544
- error("FREEBSD: sysctl(net.isr.workstream...) failed: %s", strerror(errno));
1545
- common_error = 1;
1546
- } else if (unlikely(sysctlbyname("net.isr.work", NULL, &netisr_work_size, NULL, 0) == -1)) {
1547
- error("FREEBSD: sysctl(net.isr.work...) failed: %s", strerror(errno));
1548
- common_error = 1;
1549
- } else {
1550
- num_netisr_workstreams = netisr_workstream_size / sizeof(struct sysctl_netisr_workstream);
1551
- netisr_workstream = reallocz(netisr_workstream, num_netisr_workstreams * sizeof(struct sysctl_netisr_workstream));
1552
- if (unlikely(getsysctl_by_name("net.isr.workstream", netisr_workstream,
1553
- num_netisr_workstreams * sizeof(struct sysctl_netisr_workstream)))){
1554
- common_error = 1;
1555
- } else {
1556
- num_netisr_works = netisr_work_size / sizeof(struct sysctl_netisr_work);
1557
- netisr_work = reallocz(netisr_work, num_netisr_works * sizeof(struct sysctl_netisr_work));
1558
- if (unlikely(getsysctl_by_name("net.isr.work", netisr_work,
1559
- num_netisr_works * sizeof(struct sysctl_netisr_work)))){
1560
- common_error = 1;
1561
- }
1562
- }
1563
- }
1564
- if (unlikely(common_error)) {
1565
- do_netisr = 0;
1566
- error("DISABLED: system.softnet_stat");
1567
- do_netisr_per_core = 0;
1568
- error("DISABLED: system.cpuX_softnet_stat");
1569
- common_error = 0;
1570
- } else {
1571
- netisr_stats = reallocz(netisr_stats, (ncpus + 1) * sizeof(struct netisr_stats));
1572
- bzero(netisr_stats, (ncpus + 1) * sizeof(struct netisr_stats));
1573
- for (i = 0; i < num_netisr_workstreams; i++) {
1574
- for (n = 0; n < num_netisr_works; n++) {
1575
- if (netisr_workstream[i].snws_wsid == netisr_work[n].snw_wsid) {
1576
- netisr_stats[netisr_workstream[i].snws_cpu].dispatched += netisr_work[n].snw_dispatched;
1577
- netisr_stats[netisr_workstream[i].snws_cpu].hybrid_dispatched += netisr_work[n].snw_hybrid_dispatched;
1578
- netisr_stats[netisr_workstream[i].snws_cpu].qdrops += netisr_work[n].snw_qdrops;
1579
- netisr_stats[netisr_workstream[i].snws_cpu].queued += netisr_work[n].snw_queued;
1580
- }
1581
- }
1582
- }
1583
- for (i = 0; i < ncpus; i++) {
1584
- netisr_stats[ncpus].dispatched += netisr_stats[i].dispatched;
1585
- netisr_stats[ncpus].hybrid_dispatched += netisr_stats[i].hybrid_dispatched;
1586
- netisr_stats[ncpus].qdrops += netisr_stats[i].qdrops;
1587
- netisr_stats[ncpus].queued += netisr_stats[i].queued;
1588
- }
1589
- }
1590
- }
1591
-
1592
- // --------------------------------------------------------------------
1593
-
1594
- if (likely(do_netisr)) {
1595
- st = rrdset_find_bytype_localhost("system", "softnet_stat");
1596
- if (unlikely(!st)) {
1597
- st = rrdset_create_localhost("system", "softnet_stat", NULL, "softnet_stat", NULL, "System softnet_stat", "events/s", 955, update_every, RRDSET_TYPE_LINE);
1598
- rrddim_add(st, "dispatched", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
1599
- rrddim_add(st, "hybrid_dispatched", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
1600
- rrddim_add(st, "qdrops", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
1601
- rrddim_add(st, "queued", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
1602
- }
1603
- else rrdset_next(st);
1604
-
1605
- rrddim_set(st, "dispatched", netisr_stats[ncpus].dispatched);
1606
- rrddim_set(st, "hybrid_dispatched", netisr_stats[ncpus].hybrid_dispatched);
1607
- rrddim_set(st, "qdrops", netisr_stats[ncpus].qdrops);
1608
- rrddim_set(st, "queued", netisr_stats[ncpus].queued);
1609
- rrdset_done(st);
1610
- }
1611
-
1612
- // --------------------------------------------------------------------
1613
-
1614
- if (likely(do_netisr_per_core)) {
1615
- for (i = 0; i < ncpus ;i++) {
1616
- snprintfz(netstat_cpuid, 21, "cpu%d_softnet_stat", i);
1617
-
1618
- st = rrdset_find_bytype_localhost("cpu", netstat_cpuid);
1619
- if (unlikely(!st)) {
1620
- st = rrdset_create_localhost("cpu", netstat_cpuid, NULL, "softnet_stat", NULL, "Per CPU netisr statistics", "events/s", 1101 + i, update_every, RRDSET_TYPE_LINE);
1621
- rrddim_add(st, "dispatched", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
1622
- rrddim_add(st, "hybrid_dispatched", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
1623
- rrddim_add(st, "qdrops", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
1624
- rrddim_add(st, "queued", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
1625
- }
1626
- else rrdset_next(st);
1627
-
1628
- rrddim_set(st, "dispatched", netisr_stats[i].dispatched);
1629
- rrddim_set(st, "hybrid_dispatched", netisr_stats[i].hybrid_dispatched);
1630
- rrddim_set(st, "qdrops", netisr_stats[i].qdrops);
1631
- rrddim_set(st, "queued", netisr_stats[i].queued);
1632
- rrdset_done(st);
1633
- }
1634
- }
1635
-
1636
- // --------------------------------------------------------------------
1637
-
1689
if (likely(do_bandwidth)) {
1690
if (unlikely(getifaddrs(&ifap))) {
1691
error("FREEBSD: getifaddrs()");
src/plugin_freebsd.c
+1
@@ -31,6 +31,7 @@ static struct freebsd_module {
31
{ .name = "kern.ipc.shm", .dim = "shared_memory", .enabled = 1, .func = do_kern_ipc_shm },
32
{ .name = "kern.ipc.msq", .dim = "message_queues", .enabled = 1, .func = do_kern_ipc_msq },
33
{ .name = "uptime", .dim = "uptime", .enabled = 1, .func = do_uptime },
34
+ { .name = "net.isr", .dim = "net_isr", .enabled = 1, .func = do_net_isr },
35
36
// CPU metrics
37
{ .name = "kern.cp_times", .dim = "cp_times", .enabled = 1, .func = do_kern_cp_times },
src/plugin_freebsd.h
+1
@@ -24,6 +24,7 @@ extern int do_kern_ipc_sem(int update_every, usec_t dt);
24
extern int do_kern_ipc_shm(int update_every, usec_t dt);
25
extern int do_kern_ipc_msq(int update_every, usec_t dt);
26
extern int do_uptime(int update_every, usec_t dt);
27
+extern int do_net_isr(int update_every, usec_t dt);
28
29
extern int do_freebsd_sysctl_old(int update_every, usec_t dt);
30