24 #ifndef _PERF_MONITOR_H_ 25 #define _PERF_MONITOR_H_ 29 #if defined (SERVER_MODE) 33 #if defined (SERVER_MODE) || defined (SA_MODE) 35 #endif // SERVER_MODE or SA_MODE 50 #define MAX_DIAG_DATA_VALUE 0xfffffffffffffLL 52 #define MAX_SERVER_THREAD_COUNT 500 53 #define MAX_SERVER_NAMELENGTH 256 76 #define PERF_PAGE_FIX_COUNTERS \ 77 ((PERF_MODULE_CNT) * (PERF_PAGE_CNT) * (PERF_PAGE_MODE_CNT) * (PERF_HOLDER_LATCH_CNT) * (PERF_CONDITIONAL_FIX_CNT)) 79 #define PERF_PAGE_PROMOTE_COUNTERS \ 80 ((PERF_MODULE_CNT) * (PERF_PAGE_CNT) * (PERF_PROMOTE_CONDITION_CNT) * (PERF_HOLDER_LATCH_CNT) * (2 )) 83 #define PERF_PAGE_UNFIX_COUNTERS \ 84 ((PERF_MODULE_CNT) * (PERF_PAGE_CNT) * 2 * 2 * (PERF_HOLDER_LATCH_CNT)) 86 #define PERF_PAGE_LOCK_TIME_COUNTERS PERF_PAGE_FIX_COUNTERS 88 #define PERF_PAGE_HOLD_TIME_COUNTERS \ 89 ((PERF_MODULE_CNT) * (PERF_PAGE_CNT) * (PERF_PAGE_MODE_CNT) * (PERF_HOLDER_LATCH_CNT)) 91 #define PERF_PAGE_FIX_TIME_COUNTERS PERF_PAGE_FIX_COUNTERS 93 #define PERF_PAGE_FIX_STAT_OFFSET(module,page_type,page_found_mode,latch_mode,cond_type) \ 94 ((module) * (PERF_PAGE_CNT) * (PERF_PAGE_MODE_CNT) * (PERF_HOLDER_LATCH_CNT) * (PERF_CONDITIONAL_FIX_CNT) \ 95 + (page_type) * (PERF_PAGE_MODE_CNT) * (PERF_HOLDER_LATCH_CNT) * (PERF_CONDITIONAL_FIX_CNT) \ 96 + (page_found_mode) * (PERF_HOLDER_LATCH_CNT) * (PERF_CONDITIONAL_FIX_CNT) \ 97 + (latch_mode) * (PERF_CONDITIONAL_FIX_CNT) + (cond_type)) 99 #define PERF_PAGE_PROMOTE_STAT_OFFSET(module,page_type,promote_cond,holder_latch,success) \ 100 ((module) * (PERF_PAGE_CNT) * (PERF_PROMOTE_CONDITION_CNT) * (PERF_HOLDER_LATCH_CNT) * 2 \ 101 + (page_type) * (PERF_PROMOTE_CONDITION_CNT) * (PERF_HOLDER_LATCH_CNT) * 2 \ 102 + (promote_cond) * (PERF_HOLDER_LATCH_CNT) * 2 \ 103 + (holder_latch) * 2 \ 106 #define PERF_PAGE_UNFIX_STAT_OFFSET(module,page_type,buf_dirty,dirtied_by_holder,holder_latch) \ 107 ((module) * (PERF_PAGE_CNT) * 2 * 2 * (PERF_HOLDER_LATCH_CNT) \ 108 + (page_type) * 2 * 2 * (PERF_HOLDER_LATCH_CNT) \ 109 + (buf_dirty) * 2 * (PERF_HOLDER_LATCH_CNT) \ 110 + (dirtied_by_holder) * (PERF_HOLDER_LATCH_CNT) \ 113 #define PERF_PAGE_LOCK_TIME_OFFSET(module,page_type,page_found_mode,latch_mode,cond_type) \ 114 PERF_PAGE_FIX_STAT_OFFSET (module, page_type, page_found_mode, latch_mode, cond_type) 116 #define PERF_PAGE_HOLD_TIME_OFFSET(module,page_type,page_found_mode,latch_mode)\ 117 ((module) * (PERF_PAGE_CNT) * (PERF_PAGE_MODE_CNT) * (PERF_HOLDER_LATCH_CNT) \ 118 + (page_type) * (PERF_PAGE_MODE_CNT) * (PERF_HOLDER_LATCH_CNT) \ 119 + (page_found_mode) * (PERF_HOLDER_LATCH_CNT) \ 122 #define PERF_PAGE_FIX_TIME_OFFSET(module,page_type,page_found_mode,latch_mode,cond_type) \ 123 PERF_PAGE_FIX_STAT_OFFSET (module, page_type, page_found_mode, latch_mode, cond_type) 125 #define PERF_MVCC_SNAPSHOT_COUNTERS \ 126 (PERF_SNAPSHOT_CNT * PERF_SNAPSHOT_RECORD_TYPE_CNT * PERF_SNAPSHOT_VISIBILITY_CNT) 128 #define PERF_MVCC_SNAPSHOT_OFFSET(snapshot,rec_type,visibility) \ 129 ((snapshot) * PERF_SNAPSHOT_RECORD_TYPE_CNT * PERF_SNAPSHOT_VISIBILITY_CNT \ 130 + (rec_type) * PERF_SNAPSHOT_VISIBILITY_CNT + (visibility)) 132 #define PERF_OBJ_LOCK_STAT_COUNTERS (SCH_M_LOCK + 1) 133 #define PERF_DWB_FLUSHED_BLOCK_VOLUMES_CNT 10 135 #define SAFE_DIV(a, b) ((b) == 0 ? 0 : (a) / (b)) 138 #define PSTAT_COUNTER_TIMER_COUNT_VALUE(startvalp) (startvalp) 139 #define PSTAT_COUNTER_TIMER_TOTAL_TIME_VALUE(startvalp) ((startvalp) + 1) 140 #define PSTAT_COUNTER_TIMER_MAX_TIME_VALUE(startvalp) ((startvalp) + 2) 141 #define PSTAT_COUNTER_TIMER_AVG_TIME_VALUE(startvalp) ((startvalp) + 3) 143 #if !defined(SERVER_MODE) 144 #if !defined(LOG_TRAN_INDEX) 145 #define LOG_TRAN_INDEX 150 #if defined (SERVER_MODE) 152 #if !defined(LOG_FIND_THREAD_TRAN_INDEX) 153 #define LOG_FIND_THREAD_TRAN_INDEX(thrd) \ 154 ((thrd) ? (thrd)->tran_index : logtb_get_current_tran_index()) 157 #if !defined(LOG_FIND_THREAD_TRAN_INDEX) 158 #define LOG_FIND_THREAD_TRAN_INDEX(thrd) (log_Tran_index) 667 #if !defined (HAVE_ATOMIC_BUILTINS) 825 #if defined (SERVER_MODE) || defined (SA_MODE) 826 extern void perfmon_start_watch (
THREAD_ENTRY * thread_p);
827 extern void perfmon_stop_watch (
THREAD_ENTRY * thread_p);
828 extern void perfmon_er_log_current_stats (
THREAD_ENTRY * thread_p);
955 #if defined (SERVER_MODE) || defined (SA_MODE) 963 ATOMIC_INC_64 (&(pstat_Global.
global_stats[offset]), amount);
965 #if defined (SERVER_MODE) || defined (SA_MODE) 968 assert (tran_index >= 0 && tran_index < pstat_Global.
n_trans);
972 pstat_Global.
tran_stats[tran_index][offset] += amount;
991 ATOMIC_INC_64 (&(pstat_Global.
global_stats[offset]), amount);
1031 #if defined (SERVER_MODE) || defined (SA_MODE) 1039 ATOMIC_TAS_64 (&(pstat_Global.
global_stats[offset]), statval);
1041 #if defined (SERVER_MODE) || defined (SA_MODE) 1044 assert (tran_index >= 0 && tran_index < pstat_Global.
n_trans);
1045 if (always_collect || pstat_Global.
is_watching[tran_index])
1048 pstat_Global.
tran_stats[tran_index][offset] = statval;
1089 ATOMIC_TAS_64 (&(pstat_Global.
global_stats[offset]), statval);
1125 UINT64 *statvalp =
NULL;
1127 #if defined (SERVER_MODE) || defined (SA_MODE) 1141 if (max_time >= timediff)
1150 #if defined (SERVER_MODE) || defined (SA_MODE) 1153 assert (tran_index >= 0 && tran_index < pstat_Global.
n_trans);
1157 statvalp = pstat_Global.
tran_stats[tran_index] + offset;
1161 if (max_time < timediff)
1206 UINT64 *statvalp =
NULL;
1208 UINT64 time_per_unit;
1209 #if defined (SERVER_MODE) || defined (SA_MODE) 1220 time_per_unit = timediff /
count;
1229 if (max_time >= time_per_unit)
1238 #if defined (SERVER_MODE) || defined (SA_MODE) 1241 assert (tran_index >= 0 && tran_index < pstat_Global.
n_trans);
1245 statvalp = pstat_Global.
tran_stats[tran_index] + offset;
1249 if (max_time < time_per_unit)
1310 #if defined(CS_MODE) || defined(SA_MODE) 1312 typedef struct perfmon_client_stat_info PERFMON_CLIENT_STAT_INFO;
1313 struct perfmon_client_stat_info
1315 time_t cpu_start_usr_time;
1316 time_t cpu_start_sys_time;
1317 time_t elapsed_start_time;
1318 UINT64 *base_server_stats;
1319 UINT64 *current_server_stats;
1320 UINT64 *old_global_stats;
1321 UINT64 *current_global_stats;
1324 extern bool perfmon_Iscollecting_stats;
1326 extern int perfmon_start_stats (
bool for_all_trans);
1327 extern int perfmon_stop_stats (
void);
1328 extern void perfmon_reset_stats (
void);
1329 extern int perfmon_print_stats (FILE * stream);
1330 extern int perfmon_print_global_stats (FILE * stream,
bool cumulative,
const char *
substr);
1331 extern int perfmon_get_stats (
void);
1332 extern int perfmon_get_global_stats (
void);
1338 elapsed->tv_sec = end->tv_sec - start->tv_sec;
1339 elapsed->tv_usec = end->tv_usec - start->tv_usec;
1341 if (elapsed->tv_usec < 0)
1344 elapsed->tv_usec += 1000000;
1351 if (end->tv_usec - start->tv_usec >= 0)
1353 total->tv_usec += end->tv_usec - start->tv_usec;
1354 total->tv_sec += end->tv_sec - start->tv_sec;
1358 total->tv_usec += 1000000 + (end->tv_usec - start->tv_usec);
1359 total->tv_sec += end->tv_sec - start->tv_sec - 1;
1362 total->tv_sec += total->tv_usec / 1000000;
1363 total->tv_usec %= 1000000;
1366 #define TO_MSEC(elapsed) \ 1367 ((int)(((elapsed).tv_sec * 1000) + (int) ((elapsed).tv_usec / 1000))) 1369 #if defined (EnableThreadMonitoring) 1370 #define MONITOR_WAITING_THREAD(elapsed) \ 1371 (prm_get_integer_value (PRM_ID_MNT_WAITING_THREAD) > 0 \ 1372 && ((elapsed).tv_sec * 1000 + (elapsed).tv_usec / 1000) \ 1373 > prm_get_integer_value (PRM_ID_MNT_WAITING_THREAD)) 1375 #define MONITOR_WAITING_THREAD(elapsed) (0) 1378 #if defined (SERVER_MODE) || defined (SA_MODE) 1379 typedef struct perf_utime_tracker PERF_UTIME_TRACKER;
1380 struct perf_utime_tracker
1382 bool is_perf_tracking;
1386 #define PERF_UTIME_TRACKER_INITIALIZER { false, {0}, {0} } 1387 #define PERF_UTIME_TRACKER_START(thread_p, track) \ 1390 (track)->is_perf_tracking = perfmon_is_perf_tracking (); \ 1391 if ((track)->is_perf_tracking) tsc_getticks (&(track)->start_tick); \ 1395 #define PERF_UTIME_TRACKER_TIME(thread_p, track, psid) \ 1398 if (!(track)->is_perf_tracking) break; \ 1399 tsc_getticks (&(track)->end_tick); \ 1400 perfmon_time_stat (thread_p, psid, tsc_elapsed_utime ((track)->end_tick, (track)->start_tick)); \ 1403 #define PERF_UTIME_TRACKER_TIME_AND_RESTART(thread_p, track, psid) \ 1406 if (!(track)->is_perf_tracking) break; \ 1407 tsc_getticks (&(track)->end_tick); \ 1408 perfmon_time_stat (thread_p, psid, tsc_elapsed_utime ((track)->end_tick, (track)->start_tick)); \ 1409 (track)->start_tick = (track)->end_tick; \ 1413 #define PERF_UTIME_TRACKER_BULK_TIME(thread_p, track, psid, count) \ 1416 if (!(track)->is_perf_tracking) break; \ 1417 tsc_getticks (&(track)->end_tick); \ 1418 perfmon_time_bulk_stat (thread_p, psid, tsc_elapsed_utime ((track)->end_tick, (track)->start_tick), count); \ 1421 #define PERF_UTIME_TRACKER_BULK_TIME_AND_RESTART(thread_p, track, psid, count) \ 1424 if (!(track)->is_perf_tracking) break; \ 1425 tsc_getticks (&(track)->end_tick); \ 1426 perfmon_time_bulk, stat (thread_p, psid, tsc_elapsed_utime ((track)->end_tick, (track)->start_tick), count); \ 1427 (track)->start_tick = (track)->end_tick; \ 1434 #define PERF_UTIME_TRACKER_ADD_TIME(thread_p, track, psid) \ 1437 if (!(track)->is_perf_tracking) break; \ 1438 tsc_getticks (&(track)->end_tick); \ 1439 perfmon_time_stat (thread_p, psid, (int) tsc_elapsed_utime ((track)->end_tick, (track)->start_tick)); \ 1442 #define PERF_UTIME_TRACKER_ADD_TIME_AND_RESTART(thread_p, track, psid) \ 1445 if (!(track)->is_perf_tracking) break; \ 1446 tsc_getticks (&(track)->end_tick); \ 1447 perfmon_time_stat (thread_p, psid, (int) tsc_elapsed_utime ((track)->end_tick, (track)->start_tick)); \ 1448 (track)->start_tick = (track)->end_tick; \ 1453 #if defined(SERVER_MODE) || defined (SA_MODE) 1457 extern bool perfmon_server_is_stats_on (
THREAD_ENTRY * thread_p);
1459 extern UINT64 perfmon_get_from_statistic (
THREAD_ENTRY * thread_p,
const int statistic_id);
1461 extern void perfmon_lk_waited_time_on_objects (
THREAD_ENTRY * thread_p,
int lock_mode, UINT64 amount);
1463 extern UINT64 perfmon_get_stats_and_clear (
THREAD_ENTRY * thread_p,
const char *stat_name);
1465 extern void perfmon_pbx_fix (
THREAD_ENTRY * thread_p,
int page_type,
int page_found_mode,
int latch_mode,
1467 extern void perfmon_pbx_promote (
THREAD_ENTRY * thread_p,
int page_type,
int promote_cond,
int holder_latch,
1469 extern void perfmon_pbx_unfix (
THREAD_ENTRY * thread_p,
int page_type,
int buf_dirty,
int dirtied_by_holder,
1471 extern void perfmon_pbx_lock_acquire_time (
THREAD_ENTRY * thread_p,
int page_type,
int page_found_mode,
int latch_mode,
1472 int cond_type, UINT64 amount);
1473 extern void perfmon_pbx_hold_acquire_time (
THREAD_ENTRY * thread_p,
int page_type,
int page_found_mode,
int latch_mode,
1475 extern void perfmon_pbx_fix_acquire_time (
THREAD_ENTRY * thread_p,
int page_type,
int page_found_mode,
int latch_mode,
1476 int cond_type, UINT64 amount);
1477 extern void perfmon_mvcc_snapshot (
THREAD_ENTRY * thread_p,
int snapshot,
int rec_type,
int visibility);
1478 extern void perfmon_db_flushed_block_volumes (
THREAD_ENTRY * thread_p,
int num_volumes);
STATIC_INLINE void perfmon_add_stat_to_global(PERF_STAT_ID psid, UINT64 amount) __attribute__((ALWAYS_INLINE))
STATIC_INLINE void perfmon_inc_stat_to_global(PERF_STAT_ID psid) __attribute__((ALWAYS_INLINE))
STATIC_INLINE void perfmon_add_timeval(struct timeval *total, struct timeval *start, struct timeval *end) __attribute__((ALWAYS_INLINE))
#define PSTAT_COUNTER_TIMER_TOTAL_TIME_VALUE(startvalp)
STATIC_INLINE void perfmon_add_at_offset_to_global(int offset, UINT64 amount) __attribute__((ALWAYS_INLINE))
PSTAT_METADATA pstat_Metadata[]
STATIC_INLINE void perfmon_time_at_offset(THREAD_ENTRY *thread_p, int offset, UINT64 timediff) __attribute__((ALWAYS_INLINE))
void perfmon_server_dump_stats(const UINT64 *stats, FILE *stream, const char *substr)
STATIC_INLINE void perfmon_set_at_offset(THREAD_ENTRY *thread_p, int offset, int statval, bool check_watchers) __attribute__((ALWAYS_INLINE))
enum t_diag_server_type T_DIAG_SERVER_TYPE
void perfmon_copy_values(UINT64 *src, UINT64 *dest)
#define PSTAT_COUNTER_TIMER_MAX_TIME_VALUE(startvalp)
STATIC_INLINE int perfmon_get_activation_flag(void) __attribute__((ALWAYS_INLINE))
int perfmon_calc_diff_stats(UINT64 *stats_diff, UINT64 *new_stats, UINT64 *old_stats)
int(* PSTAT_LOAD_FUNC)(void)
INT64 conn_aborted_clients
void(* PSTAT_DUMP_IN_BUFFER_FUNC)(char **, const UINT64 *stat_vals, int *remaining_size)
STATIC_INLINE void perfmon_set_stat_to_global(PERF_STAT_ID psid, int statval) __attribute__((ALWAYS_INLINE))
pthread_mutex_t watch_lock
void perfmon_server_dump_stats_to_buffer(const UINT64 *stats, char *buffer, int buf_size, const char *substr)
MONITOR_SERVER_CONFIG server
#define MAX_SERVER_NAMELENGTH
PERF_CONDITIONAL_FIX_TYPE
char * perfmon_allocate_packed_values_buffer(void)
int substr(std::string &result, bool &is_matched, const cub_regex_object ®, const std::string &src, const int position, const int occurrence, const INTL_CODESET codeset)
STATIC_INLINE bool perfmon_is_perf_tracking_force(bool always_collect) __attribute__((ALWAYS_INLINE))
STATIC_INLINE bool perfmon_is_perf_tracking(void) __attribute__((ALWAYS_INLINE))
STATIC_INLINE bool perfmon_is_perf_tracking_and_active(int activation_flag) __attribute__((ALWAYS_INLINE))
INT64 transactions_in_interval
enum t_diag_shm_mode T_DIAG_SHM_MODE
int count(int &result, const cub_regex_object ®, const std::string &src, const int position, const INTL_CODESET codeset)
STATIC_INLINE void perfmon_set_at_offset_to_global(int offset, int statval) __attribute__((ALWAYS_INLINE))
STATIC_INLINE void perfmon_diff_timeval(struct timeval *elapsed, struct timeval *start, struct timeval *end) __attribute__((ALWAYS_INLINE))
void(* PSTAT_DUMP_IN_FILE_FUNC)(FILE *, const UINT64 *stat_vals)
PERF_SNAPSHOT_RECORD_TYPE
char * perfmon_unpack_stats(char *buf, UINT64 *stats)
#define MAX_SERVER_THREAD_COUNT
STATIC_INLINE void perfmon_inc_stat(THREAD_ENTRY *thread_p, PERF_STAT_ID psid) __attribute__((ALWAYS_INLINE))
#define LOG_FIND_THREAD_TRAN_INDEX(thrd)
STATIC_INLINE void perfmon_time_stat(THREAD_ENTRY *thread_p, PERF_STAT_ID psid, UINT64 timediff) __attribute__((ALWAYS_INLINE))
int perfmon_get_number_of_statistic_values(void)
int perfmon_initialize(int num_trans)
UINT64 * perfmon_allocate_values(void)
#define PSTAT_COUNTER_TIMER_COUNT_VALUE(startvalp)
PSTAT_GLOBAL pstat_Global
void perfmon_finalize(void)
STATIC_INLINE void perfmon_set_stat(THREAD_ENTRY *thread_p, PERF_STAT_ID psid, int statval, bool check_watchers) __attribute__((ALWAYS_INLINE))
STATIC_INLINE void perfmon_add_stat(THREAD_ENTRY *thread_p, PERF_STAT_ID psid, UINT64 amount) __attribute__((ALWAYS_INLINE))
void perfmon_get_current_times(time_t *cpu_usr_time, time_t *cpu_sys_time, time_t *elapsed_time)
char * perfmon_pack_stats(char *buf, UINT64 *stats)
STATIC_INLINE void perfmon_time_bulk_at_offset(THREAD_ENTRY *thread_p, int offset, UINT64 timediff, UINT64 count) __attribute__((ALWAYS_INLINE))
STATIC_INLINE void perfmon_add_at_offset(THREAD_ENTRY *thread_p, int offset, UINT64 amount) __attribute__((ALWAYS_INLINE))
int server_long_query_time