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
1.2-netsec
Mark Spencer 20 years ago
parent f2dcf45a98
commit 0b36348b12

@ -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

@ -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;

@ -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>

@ -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[];

@ -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);

Loading…
Cancel
Save