@cryptotaxi247 / netdata-1 / commits / 7e98694a7

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