| 
 
Hi,
 A number of the schedulers seem to use an is_overloaded() function that 
limits the number of connections to twice the server's weight.
 
For the sake of discussion I'll be referring to the 2.4.x kernel. We 
would be talking about this piece of jewelry: 
static inline int is_overloaded(struct ip_vs_dest *dest)
{
if (atomic_read(&dest->activeconns) > 
atomic_read(&dest->weight)*2) {
                return 1;
        }
        return 0;
}
And I'm not a bit unsure about the semantics of this is_overloaded 
regarding it's mathematical background. Wensong, what was the reason to 
arbitraly us twice the amount of activeconns for the overoad criteria?
1. dest->activeconns has such a short life span, it hardly represents
   nor reflects the current RS load in any way I could imagine.
2. 2.4.x and 2.6.x differ in what they consider a destination to be
   overloaded. IP_VS_DEST_F_OVERLOAD is set when ip_vs_dest_totalconns
   exceeds the upper threshold limit and totalconns means currently
   active + inactive connections which is also kind of unfortunate. And
   yes, there is some more code I haven't mentioned yet.
 I'm using 
the dh scheduler to balance across 3 machines - once the connections 
exceed twice the weight, it refuses new connections from IP addresses that 
aren't currently persistent.
 
What kernel are you talking about, I'm afraid? I've been a bit out of 
the loop development wise, so bear with me. And 2.4.x and 2.6.x contain 
similar (although not sync'd ... sigh) code regarding this feature: 
ratz@webphish:/usr/src/linux-2.6.8-rc2> grep -r is_overloaded *
net/ipv4/ipvs/ip_vs_sh.c:static inline int is_overloaded(struct 
ip_vs_dest *dest) 
net/ipv4/ipvs/ip_vs_sh.c:           || is_overloaded(dest)) {
net/ipv4/ipvs/ip_vs_lblcr.c:is_overloaded(struct ip_vs_dest *dest, 
struct ip_vs_service *svc)
net/ipv4/ipvs/ip_vs_lblcr.c:            if (!dest || is_overloaded(dest, 
svc)) {
net/ipv4/ipvs/ip_vs_dh.c:static inline int is_overloaded(struct 
ip_vs_dest *dest)
net/ipv4/ipvs/ip_vs_dh.c:           || is_overloaded(dest)) {
net/ipv4/ipvs/ip_vs_lblc.c:is_overloaded(struct ip_vs_dest *dest, struct 
ip_vs_service *svc)
net/ipv4/ipvs/ip_vs_lblc.c:                 || is_overloaded(dest, svc)) {
ratz@webphish:/usr/src/linux-2.6.8-rc2>
ratz@webphish:/usr/src/linux-2.4.27-rc4> grep -r is_overloaded *
net/ipv4/ipvs/ip_vs_sh.c:static inline int is_overloaded(struct 
ip_vs_dest *dest)
net/ipv4/ipvs/ip_vs_sh.c:           || is_overloaded(dest)) {
net/ipv4/ipvs/ip_vs_lblcr.c:is_overloaded(struct ip_vs_dest *dest, 
struct ip_vs_service *svc)
net/ipv4/ipvs/ip_vs_lblcr.c:            if (!dest || is_overloaded(dest, 
svc)) {
net/ipv4/ipvs/ip_vs_lblc.c:is_overloaded(struct ip_vs_dest *dest, struct 
ip_vs_service *svc)
net/ipv4/ipvs/ip_vs_lblc.c:                 || is_overloaded(dest, svc)) {
net/ipv4/ipvs/ip_vs_dh.c:static inline int is_overloaded(struct 
ip_vs_dest *dest)
net/ipv4/ipvs/ip_vs_dh.c:           || is_overloaded(dest)) {
ratz@webphish:/usr/src/linux-2.4.27-rc4>
Asymmetric coding :)
This in itself isn't really a problem, but I can't find this behaviour 
actually documented anywhere - all the documentation refers to the 
weights as being "relative to the other hosts" which means there should 
be no difference between me setting the weights on all hosts to 5 or 
setting them all to 500.
 
This is correct. I'm a bit unsure as to what your exact problem is, but 
a kernel version would already help, although I believe you're using a 
2.4.x kernel. Normally the is_overloaded() function was designed to be 
used by the threshold limitation feature only which is only present as a 
shacky backport from 2.6.x. I don't quite understand the is_overloaded() 
function in the ip_vs_dh scheduler, OTOH, I really haven't been using it 
so far. 
Expect some followup on this ;)
Take care,
Roberto Nibali, ratz
--
echo 
'[q]sa[ln0=aln256%Pln256/snlbx]sb3135071790101768542287578439snlbxq' | dc |