Re: Please have a look at this patch adding option to configure SMPP throttling sleep time
Michael Zervakis <[email protected]>
| Newsgroups | gmane.comp.mobile.kannel.devel |
|---|---|
| Message-ID | <[email protected]> |
Hello, I agree with Stipe and I think that we also have to take into consideration the window size except the wait time when adjusting to SMSC allowed rate. For example if SMSC allows a rate of 5 MTs/sec there's no point to keep a window size of 10, as it should be less than 5 in this case. Nevertheless I prepared a quick fix in current implementation to configure a hardcoded wait time of 500 msec instead of 15 seconds. In my case this doubled performance and actually came close to the SMSC configured rate. BR >Martin Conte Mac Donell schrieb: >> On Wed, Feb 4, 2009 at 6:51 PM, Michael Zervakis <[email protected]> wrote: >>> I believe that this parameter should be set optimally at msec and not sec to >>> handle throttling rates such as 100 messages per sec., because for each >>> second we sleep after receiving 0x58 we lose the opportunity to transfer >>> these 100 messages, and transmission rate is reduced significantly. >> >> Maybe the "optimal" solution here is (starting for >> SMPP_THROTTLING_MIN_TIME) increase that delay with some sort of >> exponential growth until you reach the max defined value. > >I agree with Martin here. > >My "ideal" solution would be an dynamic exponential growth of the sleep time, >until we "can" send again, then calibrate to the upper bound (throughput X/sec) >by reducing the sleep time again. > >What we actually want is the "ideal" X/sec. value. We should have 2 ways do get >this in the runtime state: > >a) the user sets it, if he "knows" it. But this may still lead to throttling events. > >b) the smsc modules itself can handle it dynamically. We can use the user >supplied value of a) as a "base" for the upper bound. > >Now, this is the network flow theory part, now who is going for the >implementation part? ;) > >Stipe
smpp.patch
(text/plain, 5.2 KB)
? .cvsignore
Index: gw/smsc/smsc_smpp.c
===================================================================
RCS file: /home/cvs/gateway/gw/smsc/smsc_smpp.c,v
retrieving revision 1.112
diff -u -r1.112 smsc_smpp.c
--- gw/smsc/smsc_smpp.c 29 Jan 2009 11:38:28 -0000 1.112
+++ gw/smsc/smsc_smpp.c 9 Feb 2009 02:38:14 -0000
@@ -111,7 +111,7 @@
#define SMPP_MAX_PENDING_SUBMITS 10
#define SMPP_DEFAULT_VERSION 0x34
#define SMPP_DEFAULT_PRIORITY 0
-#define SMPP_THROTTLING_SLEEP_TIME 15
+#define SMPP_THROTTLING_SLEEP_TIME 500000
#define SMPP_DEFAULT_CONNECTION_TIMEOUT 10 * SMPP_ENQUIRE_LINK_INTERVAL
#define SMPP_DEFAULT_WAITACK 60
#define SMPP_DEFAULT_SHUTDOWN_TIMEOUT 30
@@ -158,7 +158,7 @@
int version;
int priority; /* set default priority for messages */
int validityperiod;
- time_t throttling_err_time;
+ struct timeval throttling_err_time;
int smpp_msg_id_type; /* msg id in C string, hex or decimal */
int autodetect_addr;
Octstr *alt_charset;
@@ -251,7 +251,8 @@
smpp->priority = priority;
smpp->validityperiod = validity;
smpp->conn = conn;
- smpp->throttling_err_time = 0;
+ smpp->throttling_err_time.tv_sec = 0;
+ smpp->throttling_err_time.tv_usec = 0;
smpp->smpp_msg_id_type = smpp_msg_id_type;
smpp->autodetect_addr = autodetect_addr;
smpp->alt_charset = octstr_duplicate(alt_charset);
@@ -1502,10 +1503,13 @@
* check to see if we got a "throttling error", in which case we'll just
* sleep for a while
*/
- if (pdu->u.submit_sm_resp.command_status == SMPP_ESME_RTHROTTLED)
- time(&(smpp->throttling_err_time));
- else
- smpp->throttling_err_time = 0;
+ if (pdu->u.submit_sm_resp.command_status == SMPP_ESME_RTHROTTLED) {
+ gettimeofday(&(smpp->throttling_err_time), NULL);
+ }
+ else {
+ smpp->throttling_err_time.tv_sec = 0;
+ smpp->throttling_err_time.tv_usec = 0;
+ }
bb_smscconn_send_failed(smpp->conn, msg, reason,
octstr_format("%ld/%s", pdu->u.submit_sm_resp.command_status,
@@ -1641,10 +1645,13 @@
* check to see if we got a "throttling error", in which case we'll just
* sleep for a while
*/
- if (cmd_stat == SMPP_ESME_RTHROTTLED)
- time(&(smpp->throttling_err_time));
- else
- smpp->throttling_err_time = 0;
+ if (cmd_stat == SMPP_ESME_RTHROTTLED) {
+ gettimeofday(&(smpp->throttling_err_time), NULL);
+ }
+ else {
+ smpp->throttling_err_time.tv_sec = 0;
+ smpp->throttling_err_time.tv_usec = 0;
+ }
reason = smpp_status_to_smscconn_failure_reason(cmd_stat);
bb_smscconn_send_failed(smpp->conn, msg, reason,
@@ -1771,6 +1778,7 @@
SMPP_PDU *pdu;
double timeout;
time_t last_response, last_cleanup;
+ struct timeval eval_time;
io_arg = arg;
smpp = io_arg->smpp;
@@ -1792,7 +1800,8 @@
last_enquire_sent = last_cleanup = last_response = date_universal_now();
pending_submits = -1;
len = 0;
- smpp->throttling_err_time = 0;
+ smpp->throttling_err_time.tv_sec = 0;
+ smpp->throttling_err_time.tv_usec = 0;
for (;conn != NULL;) {
timeout = last_enquire_sent + smpp->enquire_link_interval
- date_universal_now();
@@ -1845,9 +1854,11 @@
send_enquire_link(smpp, conn, &last_enquire_sent);
/* Make sure we send even if we read a lot */
- if (transmitter && difftime(time(NULL), smpp->throttling_err_time) > SMPP_THROTTLING_SLEEP_TIME) {
- smpp->throttling_err_time = 0;
- send_messages(smpp, conn, &pending_submits);
+ gettimeofday(&eval_time, NULL);
+ if (transmitter && (eval_time.tv_sec - smpp->throttling_err_time.tv_sec)*1000000 + eval_time.tv_usec - smpp->throttling_err_time.tv_usec >= SMPP_THROTTLING_SLEEP_TIME) {
+ smpp->throttling_err_time.tv_sec = 0;
+ smpp->throttling_err_time.tv_usec = 0;
+ send_messages(smpp, conn, &pending_submits);
}
}
@@ -1873,10 +1884,13 @@
last_cleanup = time(NULL);
}
- if (transmitter && difftime(time(NULL), smpp->throttling_err_time) > SMPP_THROTTLING_SLEEP_TIME) {
- smpp->throttling_err_time = 0;
+ gettimeofday(&eval_time, NULL);
+ if (transmitter && (eval_time.tv_sec - smpp->throttling_err_time.tv_sec)*1000000 + eval_time.tv_usec - smpp->throttling_err_time.tv_usec >= SMPP_THROTTLING_SLEEP_TIME) {
+ smpp->throttling_err_time.tv_sec = 0;
+ smpp->throttling_err_time.tv_usec = 0;
send_messages(smpp, conn, &pending_submits);
}
+
}
if (conn != NULL) {