This changes the behavior, slightly, of gitweb so that it verifies that the box isn't inundated with before attempting to serve gitweb. If the box is overloaded, it basically returns a 503 server unavailable until the load falls below the defined threshold. This helps dramatically if you have a box that's I/O bound, reaches a certain load and you don't want gitweb, the I/O hog that it is, increasing the pain the server is already undergoing. adds $maxload configuration variable. Default is a load of 300, which for most cases should never be hit. Please note this makes the assumption that /proc/loadavg exists as there is no good way to read load averages on a great number of platforms [READ: Windows], or that it's reasonably accurate. Signed-off-by: John 'Warthog9' Hawley <warthog9@xxxxxxxxxxxxxx> --- gitweb/gitweb.perl | 24 ++++++++++++++++++++++++ 1 files changed, 24 insertions(+), 0 deletions(-)
diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl index 7e477af..813e48f 100755 --- a/gitweb/gitweb.perl +++ b/gitweb/gitweb.perl @@ -221,6 +221,11 @@ our %avatar_size = ( 'double' => 32 ); +# Used to set the maximum load that we will still respond to gitweb queries. +# if we exceed this than we do the processing to figure out if there's a mirror +# and redirect to it, or to just return 503 server busy +our $maxload = 300; + # You define site-wide feature defaults here; override them with # $GITWEB_CONFIG as necessary. our %feature = ( @@ -551,6 +556,25 @@ if (-e $GITWEB_CONFIG) { do $GITWEB_CONFIG_SYSTEM if -e $GITWEB_CONFIG_SYSTEM; } +# loadavg throttle +sub get_loadavg() { + my $load; + my @loads; + + open($load, '<', '/proc/loadavg') or return 0; + @loads = split(/\s+/, scalar <$load>); + close($load); + return $loads[0]; +} + +if (get_loadavg() > $maxload) { + print "Content-Type: text/plain\n"; + print "Status: 503 Excessive load on server\n"; + print "\n"; + print "The load average on the server is too high\n"; + exit 0; +} + # version of the core git binary our $git_version = qx("$GIT" --version) =~ m/git version (.*)$/ ? $1 : "unknown"; $number_of_git_cmds++;