Commit 476e8fdb authored by Claes Sjofors's avatar Claes Sjofors

Merge branch 'master' of newton:/data1/x0-0-0/pwr

parents 161b5788 159f15dd
...@@ -121,6 +121,8 @@ int sev_server::init( int noneth) ...@@ -121,6 +121,8 @@ int sev_server::init( int noneth)
} }
memset( m_config->ServerThreads, 0, sizeof(m_config->ServerThreads)); memset( m_config->ServerThreads, 0, sizeof(m_config->ServerThreads));
if ( !m_config->GarbageInterval)
m_config->GarbageInterval = sev_cGarbageInterval;
} }
else { else {
// Read config from proview.cnf // Read config from proview.cnf
...@@ -130,6 +132,7 @@ int sev_server::init( int noneth) ...@@ -130,6 +132,7 @@ int sev_server::init( int noneth)
memset( &config, 0, sizeof(config)); memset( &config, 0, sizeof(config));
m_config = &config; m_config = &config;
m_config_dlid = pwr_cNDlid; m_config_dlid = pwr_cNDlid;
m_config->GarbageInterval = sev_cGarbageInterval;
if ( cnf_get_value( "sevDatabaseType", str, sizeof(str))) { if ( cnf_get_value( "sevDatabaseType", str, sizeof(str))) {
if ( cdh_NoCaseStrcmp( str, "sqlite") == 0) if ( cdh_NoCaseStrcmp( str, "sqlite") == 0)
...@@ -499,12 +502,13 @@ int sev_server::mainloop() ...@@ -499,12 +502,13 @@ int sev_server::mainloop()
pwr_tDeltaTime busy = pwr_cNDeltaTime; pwr_tDeltaTime busy = pwr_cNDeltaTime;
pwr_tDeltaTime idle = pwr_cNDeltaTime; pwr_tDeltaTime idle = pwr_cNDeltaTime;
pwr_tDeltaTime dt; pwr_tDeltaTime dt;
float fbusy, fidle;
float a = exp(-((float)sev_cStatInterval)/300); float a = exp(-((float)sev_cStatInterval)/300);
qid.nid = 0; qid.nid = 0;
qid.qix = sev_eProcSevServer; qid.qix = sev_eProcSevServer;
time_FloatToD( &garco_interval, sev_cGarbageInterval); time_FloatToD( &garco_interval, m_config->GarbageInterval);
time_FloatToD( &stat_interval, sev_cStatInterval); time_FloatToD( &stat_interval, sev_cStatInterval);
time_GetTime( &currenttime); time_GetTime( &currenttime);
time_Aadd( &next_garco, &currenttime, &garco_interval); time_Aadd( &next_garco, &currenttime, &garco_interval);
...@@ -517,21 +521,23 @@ int sev_server::mainloop() ...@@ -517,21 +521,23 @@ int sev_server::mainloop()
time_GetTime( &before_get); time_GetTime( &before_get);
time_Adiff( &dt, &before_get, &currenttime); time_Adiff( &dt, &before_get, &currenttime);
time_Dadd( &busy, &busy, &dt); time_Dadd( &busy, &busy, &dt);
time_DToFloat(&fbusy, &busy);
mp = qcom_Get(&sts, &qid, &get, tmo); mp = qcom_Get(&sts, &qid, &get, tmo);
time_GetTime( &currenttime); time_GetTime( &currenttime);
time_Adiff( &dt, &currenttime, &before_get); time_Adiff( &dt, &currenttime, &before_get);
time_Dadd( &idle, &idle, &dt); time_Dadd( &idle, &idle, &dt);
time_DToFloat(&fidle, &idle);
if ( time_Acomp( &currenttime, &next_stat) == 1) { if ( time_Acomp( &currenttime, &next_stat) == 1) {
m_stat.current_load = 100.0 * time_DToFloat(0, &busy)/(time_DToFloat(0, &busy)+time_DToFloat(0, &idle)); m_stat.current_load = 100.0 * fbusy / (fbusy + fidle);
if ( m_stat.medium_load == 0) if ( m_stat.medium_load == 0)
m_stat.medium_load = m_stat.current_load; m_stat.medium_load = m_stat.current_load;
else else
m_stat.medium_load = a * m_stat.medium_load + (1.0-a) * m_stat.current_load; m_stat.medium_load = a * m_stat.medium_load + (1.0-a) * m_stat.current_load;
m_stat.storage_rate = (float)m_storage_cnt / (time_DToFloat(0, &busy)+time_DToFloat(0, &idle)); m_stat.storage_rate = (float)m_storage_cnt / (fbusy + fidle);
m_stat.write_rate = (float)m_write_cnt / (time_DToFloat(0, &busy)+time_DToFloat(0, &idle)); m_stat.write_rate = (float)m_write_cnt / (fbusy + fidle);
if ( m_stat.medium_storage_rate == 0) if ( m_stat.medium_storage_rate == 0)
m_stat.medium_storage_rate = m_stat.storage_rate; m_stat.medium_storage_rate = m_stat.storage_rate;
else else
...@@ -560,7 +566,7 @@ int sev_server::mainloop() ...@@ -560,7 +566,7 @@ int sev_server::mainloop()
busy = pwr_cNDeltaTime; busy = pwr_cNDeltaTime;
idle = pwr_cNDeltaTime; idle = pwr_cNDeltaTime;
} }
if ( m_read_threads && time_Acomp( &currenttime, &next_garco) == 1) { if ( !m_read_threads && time_Acomp( &currenttime, &next_garco) == 1) {
garbage_collector( 0); garbage_collector( 0);
time_Aadd( &next_garco, &next_garco, &garco_interval); time_Aadd( &next_garco, &next_garco, &garco_interval);
} }
...@@ -1283,15 +1289,18 @@ void *sev_server::garbage_collector_thread( void *arg) ...@@ -1283,15 +1289,18 @@ void *sev_server::garbage_collector_thread( void *arg)
thread = sev->m_db->new_thread(); thread = sev->m_db->new_thread();
time_FloatToD( &garco_interval, sev_cGarbageInterval); time_FloatToD( &garco_interval, sev->m_config->GarbageInterval);
time_GetTime( &currenttime); time_GetTime( &currenttime);
time_Aadd( &next_garco, &currenttime, &garco_interval); time_Aadd( &next_garco, &currenttime, &garco_interval);
while ( 1) { while ( 1) {
sleep(1); sleep(1);
time_GetTime( &currenttime);
if ( time_Acomp( &currenttime, &next_garco) == 1) { if ( time_Acomp( &currenttime, &next_garco) == 1) {
sev->garbage_collector( thread); sev->garbage_collector( thread);
time_FloatToD( &garco_interval, sev->m_config->GarbageInterval);
time_Aadd( &next_garco, &next_garco, &garco_interval); time_Aadd( &next_garco, &next_garco, &garco_interval);
} }
} }
...@@ -1313,7 +1322,7 @@ void sev_server::garbage_collector( void *thread) ...@@ -1313,7 +1322,7 @@ void sev_server::garbage_collector( void *thread)
if ( item_size == 0) if ( item_size == 0)
return; return;
items_per_scan = ((float)sev_cGarbageInterval) * item_size / sev_cGarbageCycle; items_per_scan = ((float)m_config->GarbageInterval) * item_size / sev_cGarbageCycle;
if ( items_per_scan >= 1) { if ( items_per_scan >= 1) {
for ( i = 0; i < (int)items_per_scan; i++) { for ( i = 0; i < (int)items_per_scan; i++) {
...@@ -1383,6 +1392,7 @@ void *sev_server::receive_histdata_thread( void *arg) ...@@ -1383,6 +1392,7 @@ void *sev_server::receive_histdata_thread( void *arg)
pwr_tDeltaTime busy = pwr_cNDeltaTime; pwr_tDeltaTime busy = pwr_cNDeltaTime;
pwr_tDeltaTime idle = pwr_cNDeltaTime; pwr_tDeltaTime idle = pwr_cNDeltaTime;
pwr_tDeltaTime dt; pwr_tDeltaTime dt;
float fbusy, fidle;
float a = exp(-((float)sev_cStatInterval)/300); float a = exp(-((float)sev_cStatInterval)/300);
pwr_sClass_SevServerThread *thread_conf = 0; pwr_sClass_SevServerThread *thread_conf = 0;
float current_load; float current_load;
...@@ -1404,6 +1414,7 @@ void *sev_server::receive_histdata_thread( void *arg) ...@@ -1404,6 +1414,7 @@ void *sev_server::receive_histdata_thread( void *arg)
time_GetTime( &before_get); time_GetTime( &before_get);
time_Adiff( &dt, &before_get, &currenttime); time_Adiff( &dt, &before_get, &currenttime);
time_Dadd( &busy, &busy, &dt); time_Dadd( &busy, &busy, &dt);
time_DToFloat(&fbusy, &busy);
qmsg = (sev_sQMsgHeader *)que_Get( NULL, &th->queue, &tmo, &tmo_item); qmsg = (sev_sQMsgHeader *)que_Get( NULL, &th->queue, &tmo, &tmo_item);
...@@ -1421,21 +1432,22 @@ void *sev_server::receive_histdata_thread( void *arg) ...@@ -1421,21 +1432,22 @@ void *sev_server::receive_histdata_thread( void *arg)
time_GetTime( &currenttime); time_GetTime( &currenttime);
time_Adiff( &dt, &currenttime, &before_get); time_Adiff( &dt, &currenttime, &before_get);
time_Dadd( &idle, &idle, &dt); time_Dadd( &idle, &idle, &dt);
time_DToFloat(&fidle, &idle);
if ( th->conf_idx >= 0 && time_Acomp( &currenttime, &next_stat) == 1) { if ( th->conf_idx >= 0 && time_Acomp( &currenttime, &next_stat) == 1) {
thread_conf->QueueAlloc = th->alloc; thread_conf->QueueAlloc = th->alloc;
current_load = 100.0 * time_DToFloat(0, &busy)/(time_DToFloat(0, &busy)+time_DToFloat(0, &idle)); current_load = 100.0 * fbusy / (fbusy + fidle);
if ( thread_conf->MediumLoad == 0) if ( thread_conf->MediumLoad == 0)
thread_conf->MediumLoad = current_load; thread_conf->MediumLoad = current_load;
else else
thread_conf->MediumLoad = a * thread_conf->MediumLoad + (1.0-a) * current_load; thread_conf->MediumLoad = a * thread_conf->MediumLoad + (1.0-a) * current_load;
thread_conf->StorageRate = (float)storage_cnt / (time_DToFloat(0, &busy)+time_DToFloat(0, &idle)); thread_conf->StorageRate = (float)storage_cnt / (fbusy + fidle);
if ( thread_conf->MediumStorageRate == 0) if ( thread_conf->MediumStorageRate == 0)
thread_conf->MediumStorageRate = thread_conf->StorageRate; thread_conf->MediumStorageRate = thread_conf->StorageRate;
else else
thread_conf->MediumStorageRate = a * thread_conf->MediumStorageRate + (1.0-a) * thread_conf->StorageRate; thread_conf->MediumStorageRate = a * thread_conf->MediumStorageRate + (1.0-a) * thread_conf->StorageRate;
thread_conf->WriteRate = (float)write_cnt / (time_DToFloat(0, &busy)+time_DToFloat(0, &idle)); thread_conf->WriteRate = (float)write_cnt / (fbusy + fidle);
if ( thread_conf->MediumWriteRate == 0) if ( thread_conf->MediumWriteRate == 0)
thread_conf->MediumWriteRate = thread_conf->WriteRate; thread_conf->MediumWriteRate = thread_conf->WriteRate;
else else
......
...@@ -72,7 +72,7 @@ void sev_valuecache_double::add( void *value, pwr_tTime *t, void *thread) ...@@ -72,7 +72,7 @@ void sev_valuecache_double::add( void *value, pwr_tTime *t, void *thread)
pwr_tDeltaTime dt; pwr_tDeltaTime dt;
time_Adiff_NE( &dt, t, &m_start_time); time_Adiff_NE( &dt, t, &m_start_time);
time = time_DToFloat64( 0, &dt); time_DToFloat64( &time, &dt);
// Store optimized write index before adding // Store optimized write index before adding
m_last_opt_write = get_optimal_write(); m_last_opt_write = get_optimal_write();
......
...@@ -161,6 +161,14 @@ SObject pwrb:Class ...@@ -161,6 +161,14 @@ SObject pwrb:Class
EndBody EndBody
EndObject EndObject
!/** !/**
! Scan interval for garbage collector.
!*/
Object GarbageInterval $Attribute 14
Body SysBody
Attr TypeRef = "pwrs:Type-$Int32"
EndBody
EndObject
!/**
! Statistics. ! Statistics.
!*/ !*/
Object Stat $Attribute 12 Object Stat $Attribute 12
...@@ -177,7 +185,7 @@ SObject pwrb:Class ...@@ -177,7 +185,7 @@ SObject pwrb:Class
Attr TypeRef = "pwrb:Class-SevServerThread" Attr TypeRef = "pwrb:Class-SevServerThread"
Attr Flags |= PWR_MASK_CLASS Attr Flags |= PWR_MASK_CLASS
Attr Flags |= PWR_MASK_ARRAY Attr Flags |= PWR_MASK_ARRAY
Attr Elements = 40 Attr Elements = 60
EndBody EndBody
EndObject EndObject
EndObject EndObject
...@@ -188,6 +196,7 @@ SObject pwrb:Class ...@@ -188,6 +196,7 @@ SObject pwrb:Class
Attr MeanValueInterval2 = 30 Attr MeanValueInterval2 = 30
Attr ThreadQueueLimit = 600000 Attr ThreadQueueLimit = 600000
Attr TotalQueueLimit = 6000000 Attr TotalQueueLimit = 6000000
Attr GarbageInterval = 120
EndBody EndBody
EndObject EndObject
EndObject EndObject
......
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment