X-Git-Url: https://granicus.if.org/sourcecode?a=blobdiff_plain;f=raw_stats.c;h=1b65d7981b37fd53607b325eb8b3769c3f1b5ed4;hb=5781102b0d3f6d118ef30389fa46933dc00dabd5;hp=efa1f8115252e51bff080ad0515e15ff77795318;hpb=681a13ecfb932b354c4500c87b7bc5cde859214e;p=sysstat diff --git a/raw_stats.c b/raw_stats.c index efa1f81..1b65d79 100644 --- a/raw_stats.c +++ b/raw_stats.c @@ -1,6 +1,6 @@ /* * raw_stats.c: Functions used by sar to display statistics in raw format. - * (C) 1999-2019 by Sebastien GODARD (sysstat orange.fr) + * (C) 1999-2021 by Sebastien GODARD (sysstat orange.fr) * *************************************************************************** * This program is free software; you can redistribute it and/or modify it * @@ -28,7 +28,7 @@ #include "ioconf.h" #include "raw_stats.h" -extern unsigned int flags; +extern uint64_t flags; /* *************************************************************************** @@ -53,8 +53,8 @@ char *pfield(char *hdr_line, int pos) int i, j = 0; if (hdr_line) { - strncpy(hline, hdr_line, HEADER_LINE_LEN - 1); - hline[HEADER_LINE_LEN - 1] = '\0'; + strncpy(hline, hdr_line, sizeof(hline) - 1); + hline[sizeof(hline) - 1] = '\0'; idx = 0; for (hl = strtok(hline, "|"); hl && (pos > 0); hl = strtok(NULL, "|"), pos--); @@ -67,8 +67,8 @@ char *pfield(char *hdr_line, int pos) j = strcspn(hl, "&"); *(hl + j) = ';'; } - strncpy(field, hl, HEADER_LINE_LEN); - field[HEADER_LINE_LEN - 1] = '\0'; + strncpy(field, hl, sizeof(field)); + field[sizeof(field) - 1] = '\0'; } /* Display current field */ @@ -105,6 +105,11 @@ void pval(unsigned long long valp, unsigned long long valc) /* *************************************************************************** * Display CPU statistics in raw format. + * Note: Values displayed for CPU "all" may slightly differ from those you + * would get if you were displaying them in pr_stats.c:print_cpu_stats(). + * This is because values for CPU "all" are recalculated there as the sum of + * all individual CPU values (done by a call to get_global_cpu_statistics() + * function). * * IN: * @a Activity structure with statistics. @@ -532,7 +537,9 @@ __print_funct_t raw_print_disk_stats(struct activity *a, char *timestr, int curr sdc = (struct stats_disk *) ((char *) a->buf[curr] + i * a->msize); /* Get device name */ - dev_name = get_sa_devname(sdc->major, sdc->minor, flags); + dev_name = get_device_name(sdc->major, sdc->minor, sdc->wwn, sdc->part_nr, + DISPLAY_PRETTY(flags), DISPLAY_PERSIST_NAME_S(flags), + USE_STABLE_ID(flags), NULL); if (a->item_list != NULL) { /* A list of devices has been entered on the command line */ @@ -1494,20 +1501,23 @@ __print_funct_t raw_print_filesystem_stats(struct activity *a, char *timestr, in { int i; struct stats_filesystem *sfc; + char *dev_name; for (i = 0; i < a->nr[curr]; i++) { sfc = (struct stats_filesystem *) ((char *) a->buf[curr] + i * a->msize); + /* Get name to display (persistent or standard fs name, or mount point) */ + dev_name = get_fs_name_to_display(a, flags, sfc); + if (a->item_list != NULL) { /* A list of devices has been entered on the command line */ - if (!search_list_item(a->item_list, - DISPLAY_MOUNT(a->opt_flags) ? sfc->mountp : sfc->fs_name)) + if (!search_list_item(a->item_list, dev_name)) /* Device not found */ continue; } printf("%s; %s; \"%s\";", timestr, pfield(a->hdr_line, FIRST + DISPLAY_MOUNT(a->opt_flags)), - DISPLAY_MOUNT(a->opt_flags) ? sfc->mountp : sfc->fs_name); + dev_name); printf(" f_bfree; %llu;", sfc->f_bfree); printf(" f_blocks; %llu;", sfc->f_blocks); printf(" f_bavail; %llu;", sfc->f_bavail); @@ -1534,15 +1544,16 @@ __print_funct_t raw_print_filesystem_stats(struct activity *a, char *timestr, in __print_funct_t raw_print_fchost_stats(struct activity *a, char *timestr, int curr) { int i, j, j0, found; - struct stats_fchost *sfcc, *sfcp; + struct stats_fchost *sfcc, *sfcp, sfczero; + + memset(&sfczero, 0, sizeof(struct stats_fchost)); for (i = 0; i < a->nr[curr]; i++) { found = FALSE; + sfcc = (struct stats_fchost *) ((char *) a->buf[curr] + i * a->msize); if (a->nr[!curr] > 0) { - sfcc = (struct stats_fchost *) ((char *) a->buf[curr] + i * a->msize); - /* Look for corresponding structure in previous iteration */ j = i; @@ -1565,10 +1576,17 @@ __print_funct_t raw_print_fchost_stats(struct activity *a, char *timestr, int cu while (j != j0); } - if (!found) - continue; + printf("%s; %s", timestr, pfield(a->hdr_line, FIRST)); + + if (!found) { + /* This is a newly registered host. Previous stats are zero */ + sfcp = &sfczero; + if (DISPLAY_DEBUG_MODE(flags)) { + printf(" [NEW]"); + } + } - printf("%s; %s; %s;", timestr, pfield(a->hdr_line, FIRST), sfcc->fchost_name); + printf("; %s;", sfcc->fchost_name); printf(" %s", pfield(NULL, 0)); pval((unsigned long long) sfcp->f_rxframes, (unsigned long long) sfcc->f_rxframes); printf(" %s", pfield(NULL, 0)); @@ -1650,3 +1668,87 @@ __print_funct_t raw_print_softnet_stats(struct activity *a, char *timestr, int c printf("\n"); } } + +/* + *************************************************************************** + * Display pressure-stall CPU statistics in raw format. + * + * IN: + * @a Activity structure with statistics. + * @timestr Time for current statistics sample. + * @curr Index in array for current sample statistics. + *************************************************************************** + */ +__print_funct_t raw_print_psicpu_stats(struct activity *a, char *timestr, int curr) +{ + struct stats_psi_cpu + *psic = (struct stats_psi_cpu *) a->buf[curr], + *psip = (struct stats_psi_cpu *) a->buf[!curr]; + + printf("%s; %s; %lu;", timestr, pfield(a->hdr_line, FIRST), psic->some_acpu_10); + printf(" %s; %lu;", pfield(NULL, 0), psic->some_acpu_60); + printf(" %s; %lu;", pfield(NULL, 0), psic->some_acpu_300); + printf(" %s", pfield(NULL, 0)); + pval((unsigned long long) psip->some_cpu_total, (unsigned long long) psic->some_cpu_total); + printf("\n"); +} + +/* + *************************************************************************** + * Display pressure-stall I/O statistics in raw format. + * + * IN: + * @a Activity structure with statistics. + * @timestr Time for current statistics sample. + * @curr Index in array for current sample statistics. + *************************************************************************** + */ +__print_funct_t raw_print_psiio_stats(struct activity *a, char *timestr, int curr) +{ + struct stats_psi_io + *psic = (struct stats_psi_io *) a->buf[curr], + *psip = (struct stats_psi_io *) a->buf[!curr]; + + printf("%s; %s; %lu;", timestr, pfield(a->hdr_line, FIRST), psic->some_aio_10); + printf(" %s; %lu;", pfield(NULL, 0), psic->some_aio_60); + printf(" %s; %lu;", pfield(NULL, 0), psic->some_aio_300); + printf(" %s", pfield(NULL, 0)); + pval((unsigned long long) psip->some_io_total, (unsigned long long) psic->some_io_total); + + printf(" %s; %lu;", pfield(NULL, 0), psic->full_aio_10); + printf(" %s; %lu;", pfield(NULL, 0), psic->full_aio_60); + printf(" %s; %lu;", pfield(NULL, 0), psic->full_aio_300); + printf(" %s", pfield(NULL, 0)); + pval((unsigned long long) psip->full_io_total, (unsigned long long) psic->full_io_total); + printf("\n"); +} + +/* + *************************************************************************** + * Display pressure-stall mem statistics in raw format. + * + * IN: + * @a Activity structure with statistics. + * @timestr Time for current statistics sample. + * @curr Index in array for current sample statistics. + *************************************************************************** + */ +__print_funct_t raw_print_psimem_stats(struct activity *a, char *timestr, int curr) +{ + struct stats_psi_mem + *psic = (struct stats_psi_mem *) a->buf[curr], + *psip = (struct stats_psi_mem *) a->buf[!curr]; + + printf("%s; %s; %lu;", timestr, pfield(a->hdr_line, FIRST), psic->some_amem_10); + printf(" %s; %lu;", pfield(NULL, 0), psic->some_amem_60); + printf(" %s; %lu;", pfield(NULL, 0), psic->some_amem_300); + printf(" %s", pfield(NULL, 0)); + pval((unsigned long long) psip->some_mem_total, (unsigned long long) psic->some_mem_total); + + printf(" %s; %lu;", pfield(NULL, 0), psic->full_amem_10); + printf(" %s; %lu;", pfield(NULL, 0), psic->full_amem_60); + printf(" %s; %lu;", pfield(NULL, 0), psic->full_amem_300); + printf(" %s", pfield(NULL, 0)); + pval((unsigned long long) psip->full_mem_total, (unsigned long long) psic->full_mem_total); + printf("\n"); +}