コード例 #1
0
ファイル: monitor_app.c プロジェクト: yyzreal/intel-cmt-cat
/**
 * @brief Reads monitoring event data at given \a interval for \a sel_time time span
 *
 * @param cap detected PQoS capabilites
 */
static void monitoring_loop(const struct pqos_cap *cap)
{
	double llc_factor = 1, mbr_factor = 1, mbl_factor = 1;
        unsigned mon_number = 0;
	int ret = PQOS_RETVAL_OK;
	int i = 0;

	if (signal(SIGINT, monitoring_ctrlc) == SIG_ERR)
		printf("Failed to catch SIGINT!\n");
	ret = get_event_factors(cap, &llc_factor, &mbr_factor, &mbl_factor);
	if (ret != PQOS_RETVAL_OK)
		return;

        if (!process_mode())
	        mon_number = (unsigned) sel_monitor_num;
	else
	        mon_number = (unsigned) sel_process_num;

	while (!stop_monitoring_loop) {
                ret = pqos_mon_poll(m_mon_grps, (unsigned)mon_number);
                if (ret != PQOS_RETVAL_OK) {
                        printf("Failed to poll monitoring data!\n");
                        return;
                }
                if (!process_mode()) {
                        printf("    CORE     RMID    LLC[KB]"
                               "    MBL[MB]    MBR[MB]\n");
                        for (i = 0; i < sel_monitor_num; i++) {
                                const struct pqos_event_values *pv =
                                        &m_mon_grps[i]->values;
                                double llc = (double)pv->llc,
                                        mbr = (double)pv->mbm_remote_delta,
                                        mbl = (double)pv->mbm_local_delta;

                                printf("%8u %8u %10.1f %10.1f %10.1f\n",
                                       m_mon_grps[i]->cores[0],
                                       m_mon_grps[i]->poll_ctx[0].rmid,
                                       llc * llc_factor,
                                       mbl * mbl_factor,
                                       mbr * mbr_factor);
                        }
                } else {
                        printf("PID       LLC[KB]\n");
                        for (i = 0; i < sel_process_num; i++) {
                                const struct pqos_event_values *pv =
                                        &m_mon_grps[i]->values;
                                double llc = (double)pv->llc;

                                printf("%6d %10.1f\n",
                                       m_mon_grps[i]->pid,
                                       llc * llc_factor);
                        }
                }
		printf("\nPress Enter to continue or Ctrl+c to exit");
		if (getchar() != '\n')
			break;
		printf("\e[1;1H\e[2J");
	}
}
コード例 #2
0
ファイル: learning.c プロジェクト: AaronH88/intel-cmt-cat
/**
 * @brief Method to poll the latest data from the cpu
 *
 */
void learning_poll()
{
  int ret = PQOS_RETVAL_OK;

  //get the latest data
  ret = pqos_mon_poll(mon_grps, mon_num);
  if (ret != PQOS_RETVAL_OK) {
    printf("Failed to poll monitoring data in learning!\n");
    free(mon_grps);
    free(mon_data);
    return;
  }

  memcpy(mon_data, mon_grps, mon_num * sizeof(mon_grps[0]));
}
コード例 #3
0
ファイル: monitor.c プロジェクト: yyzreal/intel-cmt-cat
void monitor_loop(const struct pqos_cap *cap)
{
#define TERM_MIN_NUM_LINES 3

        const long interval =
                (long)sel_mon_interval * 100000LL; /* interval in [us] units */
        double llc_factor = 1, mbr_factor = 1, mbl_factor = 1;
        struct timeval tv_start;
        int ret = PQOS_RETVAL_OK;
        const int istty = isatty(fileno(fp_monitor));
        const int istext = !strcasecmp(sel_output_type, "text");
        const int isxml = !strcasecmp(sel_output_type, "xml");
        const int iscsv = !strcasecmp(sel_output_type, "csv");
        const size_t sz_header = 128;
        char header[sz_header];
	unsigned mon_number = 0, display_num = 0;
	struct pqos_mon_data **mon_data = NULL, **mon_grps = NULL;

        if ((!istext)  && (!isxml) && (!iscsv)) {
                printf("Invalid selection of output file type '%s'!\n",
                       sel_output_type);
                return;
        }

        ret = get_event_factors(cap, &llc_factor, &mbr_factor, &mbl_factor);
        if (ret != PQOS_RETVAL_OK) {
                printf("Error in retrieving monitoring scale factors!\n");
                return;
        }

        mon_number = get_mon_arrays(&mon_grps, &mon_data);
        display_num = mon_number;

        /**
         * Capture ctrl-c to gracefully stop the loop
         */
        if (signal(SIGINT, monitoring_ctrlc) == SIG_ERR)
                printf("Failed to catch SIGINT!\n");
        if (signal(SIGHUP, monitoring_ctrlc) == SIG_ERR)
                printf("Failed to catch SIGHUP!\n");

        if (istty) {
                struct winsize w;
                unsigned max_lines = 0;

                if (ioctl(fileno(fp_monitor), TIOCGWINSZ, &w) != -1) {
                        max_lines = w.ws_row;
                        if (max_lines < TERM_MIN_NUM_LINES)
                                max_lines = TERM_MIN_NUM_LINES;

                }
                if ((display_num + TERM_MIN_NUM_LINES - 1) > max_lines)
                        display_num = max_lines - TERM_MIN_NUM_LINES + 1;
        }

        /**
         * Coefficient to display the data as MB / s
         */
        const double coeff = 10.0 / (double)sel_mon_interval;

        mbr_factor = mbr_factor * coeff;
        mbl_factor = mbl_factor * coeff;

        /**
         * Build the header
         */
        build_header_row(header, sz_header, isxml, istext, iscsv);

        if (iscsv)
                fprintf(fp_monitor, "%s\n", header);

        gettimeofday(&tv_start, NULL);

        while (!stop_monitoring_loop) {
		struct timeval tv_s, tv_e;
                struct tm *ptm = NULL;
                unsigned i = 0;
                struct timespec req, rem;
                long usec_start = 0, usec_end = 0, usec_diff = 0;
                char cb_time[64];

                gettimeofday(&tv_s, NULL);

		ret = pqos_mon_poll(mon_grps, mon_number);
		if (ret != PQOS_RETVAL_OK) {
		        printf("Failed to poll monitoring data!\n");
			free(mon_grps);
			free(mon_data);
			return;
		}

		memcpy(mon_data, mon_grps, mon_number * sizeof(mon_grps[0]));

                if (sel_mon_top_like)
		        qsort(mon_data, mon_number, sizeof(mon_data[0]),
			      mon_qsort_llc_cmp_desc);
                else if (!process_mode())
		        qsort(mon_data, mon_number, sizeof(mon_data[0]),
			      mon_qsort_coreid_cmp_asc);

                /**
                 * Get time string
                 */
                ptm = localtime(&tv_s.tv_sec);
                if (ptm != NULL)
                        strftime(cb_time, sizeof(cb_time) - 1,
                                 "%Y-%m-%d %H:%M:%S", ptm);
                else
                        strncpy(cb_time, "error", sizeof(cb_time) - 1);

                if (istty && istext)
                        fprintf(fp_monitor,
                                "\033[2J"      /* Clear screen */
                                "\033[0;0H");  /* move to position 0:0 */

                if (istext)
                        fprintf(fp_monitor, "TIME %s\n%s", cb_time, header);

                for (i = 0; i < display_num; i++) {
                        const struct pqos_event_values *pv =
                                &mon_data[i]->values;
                        double llc = (double)pv->llc * llc_factor;
			double mbr = (double)pv->mbm_remote_delta * mbr_factor;
			double mbl = (double)pv->mbm_local_delta * mbl_factor;

                        if (istext)
			        print_text_row(fp_monitor, mon_data[i],
                                               llc, mbr, mbl);
                        if (isxml)
                                print_xml_row(fp_monitor, cb_time, mon_data[i],
                                              llc, mbr, mbl);
                        if (iscsv)
                                print_csv_row(fp_monitor, cb_time, mon_data[i],
                                              llc, mbr, mbl);
                }
                if (!istty && istext)
                        fputs("\n", fp_monitor);

                fflush(fp_monitor);

                gettimeofday(&tv_e, NULL);

                if (stop_monitoring_loop)
                        break;

                /**
                 * Calculate microseconds to the nearest measurement interval
                 */
                usec_start = ((long)tv_s.tv_usec) +
                        ((long)tv_s.tv_sec * 1000000L);
                usec_end = ((long)tv_e.tv_usec) +
                        ((long)tv_e.tv_sec * 1000000L);
                usec_diff = usec_end - usec_start;

                if (usec_diff < interval) {
                        memset(&rem, 0, sizeof(rem));
                        memset(&req, 0, sizeof(req));

                        req.tv_sec = (interval - usec_diff) / 1000000L;
                        req.tv_nsec =
                                ((interval - usec_diff) % 1000000L) * 1000L;
                        if (nanosleep(&req, &rem) == -1) {
                                /**
                                 * nanosleep() interrupted by a signal
                                 */
                                if (stop_monitoring_loop)
                                        break;
                                req = rem;
                                memset(&rem, 0, sizeof(rem));
                                nanosleep(&req, &rem);
                        }
                }

                if (sel_timeout >= 0) {
                        gettimeofday(&tv_e, NULL);
                        if ((tv_e.tv_sec - tv_start.tv_sec) > sel_timeout)
                                break;
                }
        }
        if (isxml)
                fprintf(fp_monitor, "%s\n", xml_root_close);

        if (istty)
                fputs("\n\n", fp_monitor);

	free(mon_grps);
	free(mon_data);
}