Author: rjung
Date: Tue May 16 15:52:39 2006
New Revision: 407096
URL: http://svn.apache.org/viewcvs?rev=407096&view=rev
Log:
Adding attribute "distance" to balanced workers.
Express Preferences between the balanced workers of an lb worker.
A load balancer will never choose some balanced worker
in case there is another usable worker with lower distance.
Only in case all workers below a given distance are in error, disabled or
stopped,
workers of a larger distance are eligible for balancing.
Modified:
tomcat/connectors/trunk/jk/native/TODO
tomcat/connectors/trunk/jk/native/common/jk_lb_worker.c
tomcat/connectors/trunk/jk/native/common/jk_lb_worker.h
tomcat/connectors/trunk/jk/native/common/jk_shm.h
tomcat/connectors/trunk/jk/native/common/jk_status.c
tomcat/connectors/trunk/jk/native/common/jk_util.c
tomcat/connectors/trunk/jk/xdocs/config/workers.xml
Modified: tomcat/connectors/trunk/jk/native/TODO
URL:
http://svn.apache.org/viewcvs/tomcat/connectors/trunk/jk/native/TODO?rev=407096&r1=407095&r2=407096&view=diff
==============================================================================
--- tomcat/connectors/trunk/jk/native/TODO (original)
+++ tomcat/connectors/trunk/jk/native/TODO Tue May 16 15:52:39 2006
@@ -2,26 +2,14 @@
$Id$
-1) Counter types in shm
-=======================
+1) Optimize "distance"
+======================
-Why are elected and errors of type size_t?
+Sorting the list of balanced workers by distance would be nice, but:
+How to combine the sorting with the offset implementation (especially
+useful for strategy BUSYNESS under low load).
- /* Number of times the worker was elected */
- volatile size_t elected;
- /* Number of non 200 responses */
- volatile size_t errors;
-
-Shouldn't they be jk_uint64_t?
-
-2) Implement "distance"
-=======================
-
-Add a new attribut "distance" to balanced workers.
-Without session Id or stickyness the lb worker will
-choose between al usable workers of the smallest distance.
-
-3) Reduce number of string comparisons in most_suitable
+2) Reduce number of string comparisons in most_suitable
========================================================
a) redirect/domains
@@ -50,7 +38,7 @@
Could we use hashes instead of string comparisons all the time?
I'm not sure, if a good enough hash takes longer than a string comparison
though.
-4) Optimization of JK_WORKER_USABLE
+3) Optimization of JK_WORKER_USABLE
====================================
We use that one quite a lot. Since it is now a combination of four
@@ -63,7 +51,7 @@
every time we change one of the four other flags). But in terms of
performance that happens rarely.
-5) Code separation between factory, validate and init in lb
+4) Code separation between factory, validate and init in lb
============================================================
The factory contains:
@@ -88,18 +76,23 @@
p->lb_workers[i].s->maintain_time = time(NULL);
-6) Refactor Logging
+5) Refactor Logging
====================
a) Use the same code files for the request logging functions in Apache 1.3 and
2.0.
b) Use the same code files for piped logging in Apache 1.3 and 2.0.
-7) ajpget
+6) ajpget
==========
Combine ajplib and Apache ab to an ajp13 commandline client ajpget.
+7) Manage lb method and locking via jk_status
+=============================================
+
+It's not yet contained in the shm.
+
8) Parsing workers.properties
=============================
@@ -108,7 +101,7 @@
no information will be logged, e.g. when attributes contain typos.
9) Persisting workers.properties
-=================================
+================================
Make workers.properties persist from inside status worker.
@@ -154,7 +147,7 @@
to be generated at the end or directly after service.
11) Access/Modification Time in shm
-==================================
+===================================
a) [Discussion] What will this generally be used for? At the moment,
only jk_status "uses" it, but it only sets the values, it never asks for them.
@@ -173,7 +166,7 @@
or the second call in jk_status coulkd be removed.
12) "Destroy" functionality
-==========================
+===========================
[Hint] Destroy on a worker never seems to free shm,
but I think that was already a flaw without shm.
Modified: tomcat/connectors/trunk/jk/native/common/jk_lb_worker.c
URL:
http://svn.apache.org/viewcvs/tomcat/connectors/trunk/jk/native/common/jk_lb_worker.c?rev=407096&r1=407095&r2=407096&view=diff
==============================================================================
--- tomcat/connectors/trunk/jk/native/common/jk_lb_worker.c (original)
+++ tomcat/connectors/trunk/jk/native/common/jk_lb_worker.c Tue May 16 15:52:39
2006
@@ -95,28 +95,17 @@
JK_TRACE_EXIT(l);
}
-/* Get the correct lb_value when recovering/starting/enabling a worker.
- * This function needs to be externally synchronized!
+/* Reset all lb values.
*/
-jk_uint64_t restart_value(lb_worker_t *p, jk_logger_t *l)
+void reset_lb_values(lb_worker_t *p, jk_logger_t *l)
{
int i = 0;
- jk_uint64_t curmax = 0;
JK_TRACE_ENTER(l);
if (p->lbmethod != JK_LB_BYBUSYNESS) {
for (i = 0; i < p->num_of_workers; i++) {
- if (p->lb_workers[i].s->lb_value > curmax) {
- curmax = p->lb_workers[i].s->lb_value;
- }
+ p->lb_workers[i].s->lb_value = 0;
}
}
- if (JK_IS_DEBUG_LEVEL(l))
- jk_log(l, JK_LOG_DEBUG,
- "restarting worker with lb_value %"
- JK_UINT64_T_FMT,
- curmax);
- JK_TRACE_EXIT(l);
- return curmax;
}
/* Retrieve the parameter with the given name */
@@ -364,6 +353,7 @@
jk_logger_t *l)
{
unsigned int i;
+ int d = 0;
jk_uint64_t curmin = 0;
worker_record_t *candidate = NULL;
@@ -378,9 +368,12 @@
* not in error state, stopped, disabled or busy.
*/
if (JK_WORKER_USABLE(p->lb_workers[i].s)) {
- if (!candidate || p->lb_workers[i].s->lb_value < curmin) {
+ if (!candidate || p->lb_workers[i].s->distance < d ||
+ (p->lb_workers[i].s->lb_value < curmin &&
+ p->lb_workers[i].s->distance == d)) {
candidate = &p->lb_workers[i];
curmin = p->lb_workers[i].s->lb_value;
+ d = p->lb_workers[i].s->distance;
}
}
}
@@ -400,6 +393,7 @@
unsigned int i;
unsigned int j;
unsigned int offset;
+ int d = 0;
jk_uint64_t curmin = 0;
/* find the least busy worker */
@@ -415,9 +409,12 @@
* not in error state, stopped, disabled or busy.
*/
if (JK_WORKER_USABLE(p->lb_workers[i].s)) {
- if (!candidate || (p->lb_workers[i].s->lb_value < curmin)) {
+ if (!candidate || p->lb_workers[i].s->distance < d ||
+ (p->lb_workers[i].s->lb_value < curmin &&
+ p->lb_workers[i].s->distance == d)) {
candidate = &p->lb_workers[i];
curmin = p->lb_workers[i].s->lb_value;
+ d = p->lb_workers[i].s->distance;
next_offset = i + 1;
}
}
@@ -914,6 +911,8 @@
if (p->lb_workers[i].s->lb_factor < 1) {
p->lb_workers[i].s->lb_factor = 1;
}
+ p->lb_workers[i].s->distance =
+ jk_get_distance(props, worker_names[i]);
if ((s = jk_get_worker_jvm_route(props, worker_names[i],
NULL)))
strncpy(p->lb_workers[i].s->jvm_route, s, JK_SHM_STR_SIZ);
else
Modified: tomcat/connectors/trunk/jk/native/common/jk_lb_worker.h
URL:
http://svn.apache.org/viewcvs/tomcat/connectors/trunk/jk/native/common/jk_lb_worker.h?rev=407096&r1=407095&r2=407096&view=diff
==============================================================================
--- tomcat/connectors/trunk/jk/native/common/jk_lb_worker.h (original)
+++ tomcat/connectors/trunk/jk/native/common/jk_lb_worker.h Tue May 16 15:52:39
2006
@@ -57,6 +57,13 @@
/* The exponent x is JK_LB_DECAY_MULT*#MAINT_INTV_SINCE_LAST_MAINT */
#define JK_LB_DECAY_MULT (1)
+static const char *lb_locking_type[] = {
+ JK_LB_LM_DEFAULT,
+ JK_LB_LM_PESSIMISTIC,
+ "unknown",
+ NULL
+};
+
static const char *lb_method_type[] = {
JK_LB_METHOD_REQUESTS,
JK_LB_METHOD_TRAFFIC,
@@ -97,7 +104,7 @@
int JK_METHOD lb_worker_factory(jk_worker_t **w,
const char *name, jk_logger_t *l);
-jk_uint64_t restart_value(lb_worker_t *p, jk_logger_t *l);
+void reset_lb_values(lb_worker_t *p, jk_logger_t *l);
void update_mult(lb_worker_t * p, jk_logger_t *l);
#ifdef __cplusplus
Modified: tomcat/connectors/trunk/jk/native/common/jk_shm.h
URL:
http://svn.apache.org/viewcvs/tomcat/connectors/trunk/jk/native/common/jk_shm.h?rev=407096&r1=407095&r2=407096&view=diff
==============================================================================
--- tomcat/connectors/trunk/jk/native/common/jk_shm.h (original)
+++ tomcat/connectors/trunk/jk/native/common/jk_shm.h Tue May 16 15:52:39 2006
@@ -71,6 +71,8 @@
char domain[JK_SHM_STR_SIZ+1];
/* worker redirect route */
char redirect[JK_SHM_STR_SIZ+1];
+ /* worker distance */
+ volatile int distance;
/* current status of the worker */
volatile int is_disabled;
volatile int is_stopped;
@@ -96,13 +98,13 @@
/* Number of bytes transferred to remote */
volatile jk_uint64_t transferred;
/* Number of times the worker was elected */
- volatile size_t elected;
+ volatile jk_uint64_t elected;
/* Number of non 200 responses */
- volatile size_t errors;
+ volatile jk_uint32_t errors;
/* Number of recovery attempts */
- volatile size_t recoveries;
+ volatile jk_uint32_t recoveries;
/* Number of recovery failures */
- volatile size_t recovery_errors;
+ volatile jk_uint32_t recovery_errors;
};
typedef struct jk_shm_worker jk_shm_worker_t;
Modified: tomcat/connectors/trunk/jk/native/common/jk_status.c
URL:
http://svn.apache.org/viewcvs/tomcat/connectors/trunk/jk/native/common/jk_status.c?rev=407096&r1=407095&r2=407096&view=diff
==============================================================================
--- tomcat/connectors/trunk/jk/native/common/jk_status.c (original)
+++ tomcat/connectors/trunk/jk/native/common/jk_status.c Tue May 16 15:52:39
2006
@@ -448,7 +448,7 @@
jk_puts(s, "</tr>\n</table>\n<br/>\n");
jk_puts(s, "<table><tr>"
"<th>Name</th><th>Type</th><th>jvmRoute</th><th>Host</th><th>Addr</th>"
-
"<th>Stat</th><th>F</th><th>M</th><th>V</th><th>Acc</th><th>Err</th>"
+
"<th>Stat</th><th>D</th><th>F</th><th>M</th><th>V</th><th>Acc</th><th>Err</th>"
"<th>Wr</th><th>Rd</th><th>Busy</th><th>Max</th><th>RR</th><th>Cd</th></tr>\n");
for (j = 0; j < lb->num_of_workers; j++) {
worker_record_t *wr = &(lb->lb_workers[j]);
@@ -472,11 +472,12 @@
wr->s->in_recovering,
wr->s->is_busy),
"</td>", NULL);
+ jk_printf(s, "<td>%d</td>", wr->s->distance);
jk_printf(s, "<td>%d</td>", wr->s->lb_factor);
jk_printf(s, "<td>%" JK_UINT64_T_FMT "</td>", wr->s->lb_mult);
jk_printf(s, "<td>%" JK_UINT64_T_FMT "</td>", wr->s->lb_value);
- jk_printf(s, "<td>%u</td>", wr->s->elected);
- jk_printf(s, "<td>%u</td>", wr->s->errors);
+ jk_printf(s, "<td>%" JK_UINT64_T_FMT "</td>", wr->s->elected);
+ jk_printf(s, "<td>%" JK_UINT32_T_FMT "</td>", wr->s->errors);
jk_putv(s, "<td>", status_strfsize(wr->s->transferred, buf),
"</td>", NULL);
jk_putv(s, "<td>", status_strfsize(wr->s->readed, buf),
@@ -511,7 +512,9 @@
jk_puts(s, "<input type=\"hidden\" name=\"lb\" ");
jk_printf(s, "value=\"%u\">\n</table>\n", i);
- jk_puts(s, "<table>\n<tr><td>Load factor:</td><td><input
name=\"wf\" type=\"text\" ");
+ jk_puts(s, "<table>\n<tr><td>Distance:</td><td><input
name=\"wx\" type=\"text\" ");
+ jk_printf(s, "value=\"%d\"/></td><tr>\n", wr->s->distance);
+ jk_puts(s, "<tr><td>Load factor:</td><td><input name=\"wf\"
type=\"text\" ");
jk_printf(s, "value=\"%d\"/></td><tr>\n", wr->s->lb_factor);
jk_puts(s, "<tr><td>Route Redirect:</td><td><input name=\"wr\"
type=\"text\" ");
jk_putv(s, "value=\"", wr->s->redirect, NULL);
@@ -577,14 +580,15 @@
}
/* Display legend */
jk_puts(s, "<hr/><table>\n"
- "<tr><th>Name</th><td>Worker route name</td></tr>\n"
+ "<tr><th>Name</th><td>Worker name</td></tr>\n"
"<tr><th>Type</th><td>Worker type</td></tr>\n"
- "<tr><th>jvmRoute</th><td>Worker JVM Route</td></tr>\n"
+ "<tr><th>jvmRoute</th><td>Worker JVM route</td></tr>\n"
"<tr><th>Addr</th><td>Backend Address info</td></tr>\n"
"<tr><th>Stat</th><td>Worker status</td></tr>\n"
- "<tr><th>F</th><td>Load Balancer Factor</td></tr>\n"
- "<tr><th>M</th><td>Load Balancer Multiplicity</td></tr>\n"
- "<tr><th>V</th><td>Load Balancer Value</td></tr>\n"
+ "<tr><th>D</th><td>Worker distance</td></tr>\n"
+ "<tr><th>F</th><td>Load Balancer factor</td></tr>\n"
+ "<tr><th>M</th><td>Load Balancer multiplicity</td></tr>\n"
+ "<tr><th>V</th><td>Load Balancer value</td></tr>\n"
"<tr><th>Acc</th><td>Number of requests</td></tr>\n"
"<tr><th>Err</th><td>Number of failed requests</td></tr>\n"
"<tr><th>Wr</th><td>Number of bytes transferred/min</td></tr>\n"
@@ -656,11 +660,12 @@
wr->s->in_recovering,
wr->s->is_busy) );
+ jk_printf(s, " distance=\"%d\"", wr->s->distance);
jk_printf(s, " lbfactor=\"%d\"", wr->s->lb_factor);
jk_printf(s, " lbmult=\"%" JK_UINT64_T_FMT "\"", wr->s->lb_mult);
jk_printf(s, " lbvalue=\"%" JK_UINT64_T_FMT "\"", wr->s->lb_value);
- jk_printf(s, " elected=\"%u\"", wr->s->elected);
- jk_printf(s, " errors=\"%u\"", wr->s->errors);
+ jk_printf(s, " elected=\"%" JK_UINT64_T_FMT "\"", wr->s->elected);
+ jk_printf(s, " errors=\"%" JK_UINT32_T_FMT "\"", wr->s->errors);
jk_printf(s, " transferred=\"%" JK_UINT64_T_FMT "\"",
wr->s->transferred);
jk_printf(s, " readed=\"%" JK_UINT64_T_FMT "\"", wr->s->readed);
jk_printf(s, " busy=\"%u\"", wr->s->busy);
@@ -747,14 +752,22 @@
jk_shm_lock();
wr->s->is_disabled = i;
wr->s->is_stopped = j;
- wr->s->lb_value = restart_value(lb, l);
+ reset_lb_values(lb, l);
+ /* unlock the shared memory */
+ jk_shm_unlock();
if (i+j==0) {
jk_log(l, JK_LOG_INFO,
- "worker %s restarted in status worker with lb_value %"
+ "worker %s restarted in status worker"
JK_UINT64_T_FMT,
- wr->s->name,
- wr->s->lb_value);
+ wr->s->name);
}
+ }
+ i = status_int("wx", s->query_string, wr->s->distance);
+ if (wr->s->distance!=i) {
+ /* lock shared memory */
+ jk_shm_lock();
+ wr->s->distance = i;
+ reset_lb_values(lb, l);
/* unlock the shared memory */
jk_shm_unlock();
}
Modified: tomcat/connectors/trunk/jk/native/common/jk_util.c
URL:
http://svn.apache.org/viewcvs/tomcat/connectors/trunk/jk/native/common/jk_util.c?rev=407096&r1=407095&r2=407096&view=diff
==============================================================================
--- tomcat/connectors/trunk/jk/native/common/jk_util.c (original)
+++ tomcat/connectors/trunk/jk/native/common/jk_util.c Tue May 16 15:52:39 2006
@@ -57,6 +57,7 @@
#define SOCKET_KEEPALIVE_OF_WORKER ("socket_keepalive")
#define RECYCLE_TIMEOUT_OF_WORKER ("recycle_timeout")
#define LOAD_FACTOR_OF_WORKER ("lbfactor")
+#define DISTANCE_OF_WORKER ("distance")
/* deprecated directive. Use balance_workers instead */
#define BALANCED_WORKERS ("balanced_workers")
#define BALANCE_WORKERS ("balance_workers")
@@ -82,6 +83,7 @@
#define WORKER_MAINTAIN_PROPERTY_NAME ("worker.maintain")
#define DEFAULT_MAINTAIN_TIME (60)
#define DEFAULT_LB_FACTOR (1)
+#define DEFAULT_DISTANCE (0)
#define LOG_FORMAT ("log_format")
#define TOMCAT32_BRIDGE_NAME ("tomcat32")
@@ -748,6 +750,19 @@
return jk_map_get_int(m, buf, DEFAULT_LB_FACTOR);
}
+int jk_get_distance(jk_map_t *m, const char *wname)
+{
+ char buf[1024];
+
+ if (!m || !wname) {
+ return DEFAULT_DISTANCE;
+ }
+
+ MAKE_WORKER_PARAM(DISTANCE_OF_WORKER);
+
+ return jk_map_get_int(m, buf, DEFAULT_DISTANCE);
+}
+
int jk_get_is_sticky_session(jk_map_t *m, const char *wname)
{
int rc = JK_TRUE;
@@ -781,7 +796,7 @@
char buf[1024];
const char *v;
if (!m || !wname) {
- return DEFAULT_LB_FACTOR;
+ return JK_LB_BYREQUESTS;
}
MAKE_WORKER_PARAM(METHOD_OF_WORKER);
Modified: tomcat/connectors/trunk/jk/xdocs/config/workers.xml
URL:
http://svn.apache.org/viewcvs/tomcat/connectors/trunk/jk/xdocs/config/workers.xml?rev=407096&r1=407095&r2=407096&view=diff
==============================================================================
--- tomcat/connectors/trunk/jk/xdocs/config/workers.xml (original)
+++ tomcat/connectors/trunk/jk/xdocs/config/workers.xml Tue May 16 15:52:39 2006
@@ -373,6 +373,16 @@
</p>
</directive>
+<directive name="distance" default="0" required="false">
+Express Preferences between the balanced workers of an lb worker.
+A load balancer will never choose some balanced worker
+in case there is another usable worker with lower distance.
+<p>
+Only in case all workers below a given distance are in error, disabled or
stopped,
+workers of a larger distance are eligible for balancing.
+</p>
+</directive>
+
<directive name="domain" default="" required="false">
Domain directive can be used only when the worker is a member of the load
balancer.
Workers that share the same domain name are treated as single worker. If
sticky_session
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]