Dear DSPAM users, While working on an upgrade to the current DSPAM, I noticed that the status screen with the bar charts of 24 hour and daily activity was taking a long time to display. Although we process a lot of messages in a 24-day period, it was slower than I expected it to be. After running strace() on the running admin.cgi script, I noticed a tremendous number of localtime() system calls. The code executes a localtime() call for every message line in the system.log file and uses it for its binning test. I changed the test to use a precalculated values and integer comparisons. For my system, the time to generate the admin.cgi status pages went from 63s to 30s as a result. I have attached the minor changes in 'diff -u' format.
Regards, Ken
--- admin.cgi 2015-10-08 15:37:34.082539789 -0500 +++ admin-less-localtime.cgi 2015-10-09 14:06:43.688654605 -0500 @@ -406,6 +406,7 @@ my(@spam_daily, @nonspam_daily, @period_daily, @fp_daily, @sm_daily, @inoc_daily, @whitelist_daily, @corpus_daily, @virus_daily, @black_daily, @block_daily); + my(@period_daily_sec, @period_weekly_sec); my(@spam_weekly, @nonspam_weekly, @period_weekly, @fp_weekly, @sm_weekly, @inoc_weekly, @whitelist_weekly, @corpus_weekly, @virus_weekly, @black_weekly, @block_weekly); @@ -417,8 +418,9 @@ my ($min, $hour, $mday, $mon, $year) = (localtime(time))[1,2,3,4,5]; my ($hmstart) = time - 60; my ($daystart) = timelocal(0, 0, 0, $mday, $mon, $year); - my ($periodstart) = $daystart - (3600*24*24); # 2 Weeks ago + my ($periodstart) = $daystart - (3600*24*24); # 24 Days ago my ($dailystart) = time - (3600*23); + my ($dailystart) = $daystart - (3600*(23-$hour)); my ($c_weekly) = 0; # Cursor to most recent time slot my ($c_daily) = 0; @@ -431,6 +433,7 @@ for(0..23) { my($h) = To12Hour($hour-(23-$_)); $period_daily[$_] = $h; + $period_daily_sec[$_] = $dailystart + ($_ + 1) * 60*60; # Store seconds offset to next hour to avoid localtime() calls. $spam_daily[$_] = 0; $nonspam_daily[$_] = 0; $sm_daily[$_] = 0; @@ -449,6 +452,7 @@ $lmon++; $lyear += 1900; $period_weekly[$_] = "$lmon/$lday/$lyear"; + $period_weekly_sec[$_] = $d + 60*60*24 ; # Store seconds for start of next day value to avoid the localtime() calls. $spam_weekly[$_] = 0; $nonspam_weekly[$_] = 0; $sm_weekly[$_] = 0; @@ -470,13 +474,13 @@ # Only Parse Log Data in our Time Period if ($t_log>=$periodstart) { - my($tmin, $thour, $tday, $tmon, $tyear) = (localtime($t_log))[1,2,3,4,5]; - $tmon++; - $tyear += 1900; + #my($tmin, $thour, $tday, $tmon, $tyear) = (localtime($t_log))[1,2,3,4,5]; + #$tmon++; + #$tyear += 1900; # Weekly Graph $c_weekly = 0; - while($period_weekly[$c_weekly] ne "$tmon/$tday/$tyear" && $c_weekly<24) { + while($t_log >= $period_weekly_sec[$c_weekly] && $c_weekly<24) { $c_weekly++; } @@ -534,7 +538,7 @@ # Daily Graph if ($t_log>=$dailystart) { - while($period_daily[$c_daily] ne To12Hour($thour) && $c_daily<24) { + while($t_log >= $period_daily_sec[$c_daily] && $c_daily<24) { $c_daily++; }
------------------------------------------------------------------------------
_______________________________________________ Dspam-user mailing list Dspam-user@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/dspam-user