/** * @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"); } }
/** * @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])); }
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); }