From ab8a55678c5ad2ceb5df2ff4ba2c8d1a1b7e8d21 Mon Sep 17 00:00:00 2001 From: zhengchao Date: Thu, 18 Feb 2016 14:53:06 +0800 Subject: [PATCH] =?UTF-8?q?=E6=A0=B9=E6=8D=AE=E3=80=8Agettimeofday()=20sho?= =?UTF-8?q?uld=20never=20be=20used=20to=20measure=20time=E3=80=8B=E7=9A=84?= =?UTF-8?q?=E5=BB=BA=E8=AE=AE=EF=BC=8C=E7=94=A8clock=5Fgettime=E6=9B=BF?= =?UTF-8?q?=E6=8D=A2gettimeofday=E3=80=82=E5=A2=9E=E5=8A=A0active=5Fthread?= =?UTF-8?q?=E7=9A=84=E7=BB=9F=E8=AE=A1=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/entry/Maat_api.cpp | 69 +++++++++++++++++++++++----------- src/entry/Maat_rule.cpp | 22 ++++------- src/entry/Maat_rule_internal.h | 9 +++-- src/entry/Maat_stat.cpp | 28 ++++++++++---- src/entry/Makefile | 2 +- src/entry/aligment_int64.h | 43 +++++++++++++++++++++ 6 files changed, 125 insertions(+), 48 deletions(-) create mode 100644 src/entry/aligment_int64.h diff --git a/src/entry/Maat_api.cpp b/src/entry/Maat_api.cpp index b720d1b..bd5b1aa 100644 --- a/src/entry/Maat_api.cpp +++ b/src/entry/Maat_api.cpp @@ -9,6 +9,7 @@ #include "Maat_rule.h" #include "Maat_rule_internal.h" #include "dynamic_array.h" +#include "aligment_int64.h" #include "config_monitor.h" #include "map_str2int.h" #include "rulescan.h" @@ -42,14 +43,13 @@ struct _Maat_table_info_t * acqurie_table(struct _Maat_feather_t* _feather,int t } inline void INC_SCANNER_REF(_Maat_scanner_t*scanner,int thread_num) { - int offset=(CPU_CACHE_ALIGMENT/sizeof(int))*thread_num; - scanner->ref_cnt[offset]++; + aligment_int64_array_add(scanner->ref_cnt, thread_num, 1); return; } inline void DEC_SCANNER_REF(_Maat_scanner_t*scanner,int thread_num) { - int offset=(CPU_CACHE_ALIGMENT/sizeof(int))*thread_num; - scanner->ref_cnt[offset]--; + + aligment_int64_array_add(scanner->ref_cnt, thread_num, -1); return; } @@ -434,6 +434,7 @@ Maat_feather_t Maat_feather(int max_thread_num,const char* table_info_path,void* feather->garbage_q=MESA_lqueue_create(0,0); feather->effect_interval_ms=60*1000; feather->scan_interval_ms=1*1000; + feather->thread_call_cnt=aligment_int64_array_alloc(max_thread_num); return feather; } int Maat_set_feather_opt(Maat_feather_t feather,enum MAAT_INIT_OPT type,const void* value,int size) @@ -714,10 +715,10 @@ int Maat_full_scan_string_detail(Maat_feather_t feather,int table_id scan_result_t *region_result=NULL; _compile_result_t compile_result[rule_num];//dynamic array struct _Maat_table_info_t *p_table=NULL; - struct timeval start,end; + struct timespec start,end; if(_feather->perf_on==1) { - gettimeofday(&start,NULL); + clock_gettime(CLOCK_MONOTONIC,&start); } _mid=grab_mid(mid,_feather, thread_num, 0); p_table=acqurie_table(_feather, table_id,TABLE_TYPE_EXPR); @@ -741,7 +742,7 @@ int Maat_full_scan_string_detail(Maat_feather_t feather,int table_id { sub_type=make_sub_type(table_id,charset,0); } - + aligment_int64_array_add(_feather->thread_call_cnt, thread_num, 1); scan_data_t scan_data; scan_data.text_data.text=data; scan_data.text_data.tlen=data_len; @@ -800,9 +801,14 @@ int Maat_full_scan_string_detail(Maat_feather_t feather,int table_id DEC_SCANNER_REF(my_scanner, thread_num); if(_feather->perf_on==1) { - gettimeofday(&end,NULL); + clock_gettime(CLOCK_MONOTONIC,&end); maat_stat_table(p_table,data_len,&start, &end); } + else + { + maat_stat_table(p_table,data_len,NULL, NULL); + } + if(compile_ret==0&&hit_region_cnt>0) { return -2; @@ -837,10 +843,10 @@ int Maat_scan_intval(Maat_feather_t feather,int table_id intval_scan_data.sub_type=make_sub_type(table_id,CHARSET_NONE, 0); intval_scan_data.int_data=intval; _Maat_table_info_t* p_table=NULL; - struct timeval start,end; + struct timespec start,end; if(_feather->perf_on==1) { - gettimeofday(&start,NULL); + clock_gettime(CLOCK_MONOTONIC,&start); } p_table=acqurie_table(_feather,table_id,TABLE_TYPE_INTVAL); if(p_table==NULL) @@ -856,6 +862,7 @@ int Maat_scan_intval(Maat_feather_t feather,int table_id { return 0; } + aligment_int64_array_add(_feather->thread_call_cnt, thread_num, 1); region_result=my_scanner->region_rslt_buff+MAX_SCANNER_HIT_NUM*thread_num; @@ -879,9 +886,13 @@ int Maat_scan_intval(Maat_feather_t feather,int table_id DEC_SCANNER_REF(my_scanner,thread_num); if(_feather->perf_on==1) { - gettimeofday(&end,NULL); + clock_gettime(CLOCK_MONOTONIC,&end); maat_stat_table(p_table,0,&start, &end); } + else + { + maat_stat_table(p_table,0,NULL, NULL); + } if(compile_ret==0&®ion_ret>0) { return -2; @@ -904,10 +915,10 @@ int Maat_scan_proto_addr(Maat_feather_t feather,int table_id struct _Maat_feather_t* _feather=(_Maat_feather_t*)feather; struct _Maat_scanner_t* my_scanner=NULL; - struct timeval start,end; + struct timespec start,end; if(_feather->perf_on==1) { - gettimeofday(&start,NULL); + clock_gettime(CLOCK_MONOTONIC,&start); } p_table=acqurie_table(_feather, table_id, TABLE_TYPE_IP); if(p_table==NULL) @@ -923,6 +934,8 @@ int Maat_scan_proto_addr(Maat_feather_t feather,int table_id { return 0; } + aligment_int64_array_add(_feather->thread_call_cnt, thread_num, 1); + ip_scan_data.rule_type=RULETYPE_IPv4; ip_scan_data.sub_type=make_sub_type(table_id,CHARSET_NONE, 0); switch(addr->addrtype) @@ -970,9 +983,13 @@ int Maat_scan_proto_addr(Maat_feather_t feather,int table_id DEC_SCANNER_REF(my_scanner,thread_num); if(_feather->perf_on==1) { - gettimeofday(&end,NULL); + clock_gettime(CLOCK_MONOTONIC,&end); maat_stat_table(p_table,0,&start, &end); } + else + { + maat_stat_table(p_table,0,NULL, NULL); + } if(compile_ret==0&®ion_ret>0) { return -2; @@ -1053,10 +1070,10 @@ int Maat_stream_scan_string_detail(stream_para_t* stream_para _compile_result_t compile_result[rule_num];//dynamic array scan_data_t region_scan_data; _Maat_table_info_t* p_table=NULL; - struct timeval start,end; + struct timespec start,end; if(sp->feather->perf_on==1) { - gettimeofday(&start,NULL); + clock_gettime(CLOCK_MONOTONIC,&start); } _mid=grab_mid(mid, sp->feather, sp->thread_num,0); if(data==NULL||data_len==0) @@ -1080,6 +1097,8 @@ int Maat_stream_scan_string_detail(stream_para_t* stream_para { return -1; } + aligment_int64_array_add(sp->feather->thread_call_cnt, sp->thread_num, 1); + region_result=scanner->region_rslt_buff+MAX_SCANNER_HIT_NUM*sp->thread_num; *detail_ret=0; if(sp->do_merge==1) @@ -1186,9 +1205,13 @@ int Maat_stream_scan_string_detail(stream_para_t* stream_para } if(sp->feather->perf_on==1) { - gettimeofday(&end,NULL); + clock_gettime(CLOCK_MONOTONIC,&end); maat_stat_table(sp->feather->p_table_info[sp->table_id],data_len,&start, &end); } + else + { + maat_stat_table(sp->feather->p_table_info[sp->table_id],data_len,NULL, NULL); + } if(compile_ret==0&&hit_region_cnt>0) { return -2; @@ -1309,15 +1332,16 @@ int Maat_stream_scan_digest(stream_para_t * stream_para, const char * data, int char* digest_buff=NULL; struct _OUTER_scan_status_t* _mid=NULL; pthread_rwlock_t *GIE_rwlock=&(sp->feather->scanner->digest_rwlock[sp->table_id]); - struct timeval start,end; + struct timespec start,end; if(sp->feather->perf_on==1) { - gettimeofday(&start,NULL); + clock_gettime(CLOCK_MONOTONIC,&start); } if(sp->acc_scan_len+(unsigned long long)data_len > sp->total_len) { return 0; } + aligment_int64_array_add(sp->feather->thread_call_cnt, sp->thread_num, 1); pthread_mutex_lock(&(sp->fuzzy_mutex)); sp->acc_scan_len+=fuzzy_feed(sp->fuzzy_hash_handle, data, (unsigned int)data_len,offset); pthread_mutex_unlock(&(sp->fuzzy_mutex)); @@ -1363,10 +1387,13 @@ int Maat_stream_scan_digest(stream_para_t * stream_para, const char * data, int } if(sp->feather->perf_on==1) { - gettimeofday(&end,NULL); + clock_gettime(CLOCK_MONOTONIC,&end); maat_stat_table(sp->feather->p_table_info[sp->table_id],data_len,&start, &end); } - + else + { + maat_stat_table(sp->feather->p_table_info[sp->table_id],data_len,NULL, NULL); + } if(compile_ret==0&&hit_region_cnt>0) { return -2; diff --git a/src/entry/Maat_rule.cpp b/src/entry/Maat_rule.cpp index 6c8fcb0..68b3d98 100644 --- a/src/entry/Maat_rule.cpp +++ b/src/entry/Maat_rule.cpp @@ -17,6 +17,7 @@ #include "Maat_rule_internal.h" #include "json2iris.h" #include "dynamic_array.h" +#include "aligment_int64.h" #include "config_monitor.h" #include "map_str2int.h" @@ -218,17 +219,7 @@ int cnt_maskbits(struct in6_addr mask) } return bits_cnt; } -int aligment_int_array_sum(int * array,int size) -{ - int sum=0,i=0; - int offset=0; - for(i=0;icfg_num=0; scanner->max_thread_num=scan_thread_num; //optimized for CPU cache_alignment 64 - scanner->ref_cnt=(int*)calloc(CPU_CACHE_ALIGMENT,scan_thread_num); + scanner->ref_cnt=aligment_int64_array_alloc(scan_thread_num); scanner->region_update_q=MESA_lqueue_create(0,0); scanner->region=rulescan_initialize(scan_thread_num); rulescan_set_param(scanner->region,rs_scan_type); @@ -2109,7 +2100,7 @@ void garbage_bury(MESA_lqueue_head garbage_q,void *logger) long data_size=0; const long q_cnt=MESA_lqueue_get_count(garbage_q); int i=0,bury_cnt=0; - int ref_cnt=0; + long long ref_cnt=0; int have_timeout=0; time_t now=time(NULL); for(i=0;igroup_rule); break; case GARBAGE_SCANNER: - ref_cnt=aligment_int_array_sum(bag->scanner->ref_cnt,bag->scanner->max_thread_num); + ref_cnt=aligment_int64_array_sum(bag->scanner->ref_cnt,bag->scanner->max_thread_num); if(ref_cnt==0) { @@ -2142,7 +2133,7 @@ void garbage_bury(MESA_lqueue_head garbage_q,void *logger) else { MESA_handle_runtime_log(logger,RLOG_LV_INFO,maat_module, - "scanner %p version %d force destroyed,ref_cnt %d.", + "scanner %p version %d force destroyed,ref_cnt %lld.", bag->scanner,bag->scanner->version,ref_cnt); } @@ -2459,6 +2450,7 @@ void *thread_rule_monitor(void *arg) free(feather->p_table_info[i]); feather->p_table_info[i]=NULL; } + free(feather->thread_call_cnt); free(feather); return NULL; } diff --git a/src/entry/Maat_rule_internal.h b/src/entry/Maat_rule_internal.h index a2b223b..26c01af 100644 --- a/src/entry/Maat_rule_internal.h +++ b/src/entry/Maat_rule_internal.h @@ -49,7 +49,7 @@ typedef int atomic_t; #define MAX_FAILED_NUM 128 -#define MAX_MAAT_STAT_NUM 64 +#define MAX_MAAT_STAT_NUM 64 #ifndef MAX #define MAX(a, b) (((a) > (b)) ? (a) : (b)) #endif @@ -234,7 +234,7 @@ struct _Maat_table_info_t //for stat>>>>>>>> int stat_line_id; long long scan_cnt; - long long scan_cpu_time; //microseconds + long long scan_cpu_time; //nano long long input_bytes; long long stream_num; long long hit_cnt; @@ -292,7 +292,7 @@ struct _Maat_scanner_t { int version; time_t last_update_time; - int *ref_cnt; //optimized for cache_alignment 64 + long long *ref_cnt; //optimized for cache_alignment 64 rule_scanner_t region; pthread_rwlock_t digest_rwlock[MAX_TABLE_NUM]; GIE_handle_t* digest_handle[MAX_TABLE_NUM]; @@ -340,6 +340,7 @@ struct _Maat_feather_t long long outer_mid_cnt; long long inner_mid_cnt; long long hit_cnt; + long long *thread_call_cnt;//size indicate by scan_thread_num, }; struct _maat_garbage_t { @@ -374,7 +375,7 @@ inline void ipv6_ntoh(unsigned int *v6_addr) return; } void maat_stat_init(struct _Maat_feather_t* feather); -void maat_stat_table(struct _Maat_table_info_t* p_table,int scan_len,struct timeval* start, struct timeval* end); +void maat_stat_table(struct _Maat_table_info_t* p_table,int scan_len,struct timespec* start, struct timespec* end); void maat_stat_output(struct _Maat_feather_t* feather); diff --git a/src/entry/Maat_stat.cpp b/src/entry/Maat_stat.cpp index 828c9ae..2ade65c 100644 --- a/src/entry/Maat_stat.cpp +++ b/src/entry/Maat_stat.cpp @@ -1,7 +1,10 @@ #include "Maat_rule_internal.h" +#include "aligment_int64.h" +#include #include enum MAAT_FS_STATUS{ STATUS_VERSION=0, + STATUS_THRED_NUM, STATUS_TABLE_NUM, STATUS_OUTER_MID_NUM, STATUS_INNER_MID_NUM, @@ -32,6 +35,7 @@ void maat_stat_init(struct _Maat_feather_t* feather) FS_set_para(feather->stat_handle, CREATE_THREAD, &value, sizeof(value)); feather->fs_status_id[STATUS_VERSION]=FS_register(feather->stat_handle, FS_STYLE_STATUS, FS_CALC_CURRENT,"version"); + feather->fs_status_id[STATUS_THRED_NUM]=FS_register(feather->stat_handle, FS_STYLE_STATUS, FS_CALC_CURRENT,"active_thread"); feather->fs_status_id[STATUS_TABLE_NUM]=FS_register(feather->stat_handle, FS_STYLE_STATUS, FS_CALC_CURRENT,"table_num"); feather->fs_status_id[STATUS_OUTER_MID_NUM]=FS_register(feather->stat_handle, FS_STYLE_STATUS, FS_CALC_CURRENT,"outer_mid"); feather->fs_status_id[STATUS_INNER_MID_NUM]=FS_register(feather->stat_handle, FS_STYLE_STATUS, FS_CALC_CURRENT,"inner_mid"); @@ -40,7 +44,6 @@ void maat_stat_init(struct _Maat_feather_t* feather) feather->fs_column_id[COLUMN_TABLE_RULE_NUM]=FS_register(feather->stat_handle, FS_STYLE_COLUMN, FS_CALC_CURRENT,"rule"); feather->fs_column_id[COLUMN_TABLE_REGEX_NUM]=FS_register(feather->stat_handle, FS_STYLE_COLUMN, FS_CALC_CURRENT,"regex"); feather->fs_column_id[COLUMN_TABLE_STREAM_NUM]=FS_register(feather->stat_handle, FS_STYLE_COLUMN, FS_CALC_CURRENT,"stream"); - feather->fs_column_id[COLUMN_TABLE_SCAN_CNT]=FS_register(feather->stat_handle, FS_STYLE_COLUMN, FS_CALC_SPEED,"IN_Tps"); feather->fs_column_id[COLUMN_TABLE_SCAN_BYTES]=FS_register(feather->stat_handle, FS_STYLE_COLUMN, FS_CALC_SPEED,"IN_Bps"); if(feather->perf_on==1) { @@ -54,6 +57,10 @@ void maat_stat_init(struct _Maat_feather_t* feather) FS_STYLE_COLUMN, FS_CALC_SPEED, "PROC_Bps"); + } + feather->fs_column_id[COLUMN_TABLE_SCAN_CNT]=FS_register(feather->stat_handle, FS_STYLE_COLUMN, FS_CALC_SPEED,"IN_Tps"); + if(feather->perf_on==1) + { FS_register_ratio(feather->stat_handle, feather->fs_column_id[COLUMN_TABLE_SCAN_CNT], feather->fs_column_id[COLUMN_TABLE_CPU_TIME], @@ -87,22 +94,28 @@ void maat_stat_init(struct _Maat_feather_t* feather) FS_start(feather->stat_handle); return; } -void maat_stat_table(struct _Maat_table_info_t* p_table,int scan_len,struct timeval* start, struct timeval* end) +void maat_stat_table(struct _Maat_table_info_t* p_table,int scan_len,struct timespec* start, struct timespec* end) { p_table->scan_cnt++; p_table->input_bytes+=scan_len; - p_table->scan_cpu_time+=(end->tv_sec-start->tv_sec)*1000000+end->tv_usec-start->tv_usec; + if(start!=NULL&&end!=NULL) + { + p_table->scan_cpu_time+=(end->tv_sec-start->tv_sec)*1000000000+end->tv_nsec-start->tv_nsec; + } return; } void maat_stat_output(struct _Maat_feather_t* feather) { long value=0; long long total_cfg_num=0, total_input_bytes=0, total_regex_num=0; - long long total_scan_cnt=0, total_cpu_time=0,total_stream_cnt=0; + long long total_scan_cnt=0, total_cpu_time=0,total_stream_cnt=0,active_thread_num=0; int i=0; + time_t now; struct _Maat_table_info_t* p_table=NULL; - + time(&now); + active_thread_num=aligment_int64_array_cnt(feather->thread_call_cnt, feather->scan_thread_num); FS_operate(feather->stat_handle, feather->fs_status_id[STATUS_VERSION], 0,FS_OP_SET,feather->maat_version); + FS_operate(feather->stat_handle, feather->fs_status_id[STATUS_THRED_NUM], 0,FS_OP_SET,active_thread_num); FS_operate(feather->stat_handle, feather->fs_status_id[STATUS_TABLE_NUM], 0,FS_OP_SET,feather->table_cnt); FS_operate(feather->stat_handle, feather->fs_status_id[STATUS_OUTER_MID_NUM], 0,FS_OP_SET,feather->outer_mid_cnt); FS_operate(feather->stat_handle, feather->fs_status_id[STATUS_INNER_MID_NUM], 0,FS_OP_SET,feather->inner_mid_cnt); @@ -161,7 +174,7 @@ void maat_stat_output(struct _Maat_feather_t* feather) p_table->stat_line_id, feather->fs_column_id[COLUMN_TABLE_CPU_TIME], FS_OP_ADD, - p_table->scan_cpu_time); + p_table->scan_cpu_time/1000); total_cpu_time+=p_table->scan_cpu_time; p_table->scan_cpu_time=0; } @@ -204,7 +217,8 @@ void maat_stat_output(struct _Maat_feather_t* feather) feather->total_stat_id, feather->fs_column_id[COLUMN_TABLE_CPU_TIME], FS_OP_ADD, - total_cpu_time); + total_cpu_time/1000); + printf("%lld us %s",total_cpu_time/1000,ctime(&now)); } FS_operate(feather->stat_handle, feather->total_stat_id, diff --git a/src/entry/Makefile b/src/entry/Makefile index 8a8fcd7..4ba933e 100644 --- a/src/entry/Makefile +++ b/src/entry/Makefile @@ -6,7 +6,7 @@ CCC = g++ CFLAGS = -Wall -g -fPIC CFLAGS += $(OPTFLAGS) LDDICTATOR = -Wl,-wrap,malloc -Wl,-wrap,calloc -Wl,-wrap,free -Wl,-wrap,realloc -LDFLAGS = -lMESA_handle_logger -lMESA_htable -lpthread -lm -lrulescan -lpcre -lMESA_field_stat +LDFLAGS = -lMESA_handle_logger -lMESA_htable -lpthread -lrt -lm -lrulescan -lpcre -lMESA_field_stat #LDFLAGS += $(LDDICTATOR) MAILLIB = ../lib diff --git a/src/entry/aligment_int64.h b/src/entry/aligment_int64.h new file mode 100644 index 0000000..a152593 --- /dev/null +++ b/src/entry/aligment_int64.h @@ -0,0 +1,43 @@ +#ifndef H_ALIGMENT_INT64_H_INCLUDE +#define H_ALIGMENT_INT64_H_INCLUDE + +#include +inline long long *aligment_int64_array_alloc(int size) +{ + long long *ret=NULL; + ret=(long long*)calloc(CPU_CACHE_ALIGMENT,size); + return ret; +} +inline long long aligment_int64_array_sum(long long * array,int size) +{ + long long sum=0; + int offset=0,i=0; + for(i=0;i0) + { + cnt++; + } + } + return cnt; +} +#endif +