Allow limitation by loadavg not just calls (should be BSD friendly)...

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@6850 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
Mark Spencer
2005-10-26 03:58:32 +00:00
parent f2dcf45a98
commit 0b36348b12
5 changed files with 35 additions and 3 deletions

View File

@@ -3,7 +3,7 @@
.\" <http://shell.ipoline.com/~elmert/comp/docbook2X/> .\" <http://shell.ipoline.com/~elmert/comp/docbook2X/>
.\" Please send any bug reports, improvements, comments, patches, .\" Please send any bug reports, improvements, comments, patches,
.\" etc. to Steve Cheng <steve@ggi-project.org>. .\" etc. to Steve Cheng <steve@ggi-project.org>.
.TH "ASTERISK" "8" "18 October 2005" "asterisk 1.2" "" .TH "ASTERISK" "8" "25 October 2005" "asterisk 1.2" ""
.SH NAME .SH NAME
asterisk \- All-purpose telephony server. asterisk \- All-purpose telephony server.
@@ -80,6 +80,11 @@ Provide brief summary of command line arguments and terminate.
Prompt user to intialize any encrypted private keys for IAX2 Prompt user to intialize any encrypted private keys for IAX2
secure authentication during startup. secure authentication during startup.
.TP .TP
\fB-L \fIloadaverage\fB\fR
Limits the maximum load average before rejecting new calls. This can
be useful to prevent a system from being brought down by terminating
too many simultaneous calls.
.TP
\fB-M \fIvalue\fB\fR \fB-M \fIvalue\fB\fR
Limits the maximum number of calls to the specified value. This can Limits the maximum number of calls to the specified value. This can
be useful to prevent a system from being brought down by terminating be useful to prevent a system from being brought down by terminating

View File

@@ -143,6 +143,7 @@ int option_overrideconfig = 0;
int option_reconnect = 0; int option_reconnect = 0;
int option_transcode_slin = 1; int option_transcode_slin = 1;
int option_maxcalls = 0; int option_maxcalls = 0;
double option_maxload = 0.0;
int option_dontwarn = 0; int option_dontwarn = 0;
int option_priority_jumping = 1; int option_priority_jumping = 1;
int fully_booted = 0; int fully_booted = 0;
@@ -1872,6 +1873,10 @@ static void ast_readconfig(void) {
if ((sscanf(v->value, "%d", &option_maxcalls) != 1) || (option_maxcalls < 0)) { if ((sscanf(v->value, "%d", &option_maxcalls) != 1) || (option_maxcalls < 0)) {
option_maxcalls = 0; option_maxcalls = 0;
} }
} else if (!strcasecmp(v->name, "maxload")) {
if ((sscanf(v->value, "%lf", &option_maxload) != 1) || (option_maxload < 0.0)) {
option_maxload = 0.0;
}
} }
v = v->next; v = v->next;
} }
@@ -1930,7 +1935,7 @@ int main(int argc, char *argv[])
} }
*/ */
/* Check for options */ /* Check for options */
while((c=getopt(argc, argv, "tThfdvVqprRgcinx:U:G:C:M:")) != -1) { while((c=getopt(argc, argv, "tThfdvVqprRgcinx:U:G:C:L:M:")) != -1) {
switch(c) { switch(c) {
case 'd': case 'd':
option_debug++; option_debug++;
@@ -1966,6 +1971,10 @@ int main(int argc, char *argv[])
if ((sscanf(optarg, "%d", &option_maxcalls) != 1) || (option_maxcalls < 0)) if ((sscanf(optarg, "%d", &option_maxcalls) != 1) || (option_maxcalls < 0))
option_maxcalls = 0; option_maxcalls = 0;
break; break;
case 'L':
if ((sscanf(optarg, "%lf", &option_maxload) != 1) || (option_maxload < 0.0))
option_maxload = 0.0;
break;
case 'q': case 'q':
option_quiet++; option_quiet++;
break; break;

View File

@@ -152,6 +152,16 @@
</para> </para>
</listitem> </listitem>
</varlistentry> </varlistentry>
<varlistentry>
<term>-L <replaceable class="parameter">loadaverage</replaceable></term>
<listitem>
<para>
Limits the maximum load average before rejecting new calls. This can
be useful to prevent a system from being brought down by terminating
too many simultaneous calls.
</para>
</listitem>
</varlistentry>
<varlistentry> <varlistentry>
<term>-M <replaceable class="parameter">value</replaceable></term> <term>-M <replaceable class="parameter">value</replaceable></term>
<listitem> <listitem>

View File

@@ -43,6 +43,7 @@ extern int option_cache_record_files;
extern int option_timestamp; extern int option_timestamp;
extern int option_transcode_slin; extern int option_transcode_slin;
extern int option_maxcalls; extern int option_maxcalls;
extern double option_maxload;
extern int option_dontwarn; extern int option_dontwarn;
extern int option_priority_jumping; extern int option_priority_jumping;
extern char defaultlanguage[]; extern char defaultlanguage[];

9
pbx.c
View File

@@ -2477,7 +2477,7 @@ out:
static int increase_call_count(const struct ast_channel *c) static int increase_call_count(const struct ast_channel *c)
{ {
int failed = 0; int failed = 0;
double curloadavg;
ast_mutex_lock(&maxcalllock); ast_mutex_lock(&maxcalllock);
if (option_maxcalls) { if (option_maxcalls) {
if (countcalls >= option_maxcalls) { if (countcalls >= option_maxcalls) {
@@ -2485,6 +2485,13 @@ static int increase_call_count(const struct ast_channel *c)
failed = -1; failed = -1;
} }
} }
if (option_maxload) {
getloadavg(&curloadavg, 1);
if (curloadavg >= option_maxload) {
ast_log(LOG_NOTICE, "Maximum loadavg limit of %lf load exceeded by '%s' (currently %f)!\n", option_maxload, c->name, curloadavg);
failed = -1;
}
}
if (!failed) if (!failed)
countcalls++; countcalls++;
ast_mutex_unlock(&maxcalllock); ast_mutex_unlock(&maxcalllock);