[Checkins] SVN: zc.resumelb/branches/jim-bisect/ experiment with using a bisect-based worker collection
jim
cvs-admin at zope.org
Tue May 8 13:53:09 UTC 2012
Log message for revision 125729:
experiment with using a bisect-based worker collection
Changed:
U zc.resumelb/branches/jim-bisect/buildout.cfg
U zc.resumelb/branches/jim-bisect/src/zc/resumelb/lb.py
U zc.resumelb/branches/jim-bisect/src/zc/resumelb/pool.test
U zc.resumelb/branches/jim-bisect/src/zc/resumelb/worker.test
-=-
Modified: zc.resumelb/branches/jim-bisect/buildout.cfg
===================================================================
--- zc.resumelb/branches/jim-bisect/buildout.cfg 2012-05-08 13:52:28 UTC (rev 125728)
+++ zc.resumelb/branches/jim-bisect/buildout.cfg 2012-05-08 13:53:06 UTC (rev 125729)
@@ -32,7 +32,7 @@
recipe = zc.zdaemonrecipe
path = ${zookeeper:effective-path}/lb
program =
- ${buildout:bin-directory}/zkresumelb -d ${zookeeper:zookeeper} ${:path}
+ ${buildout:bin-directory}/zkresumelb -da :8080 ${zookeeper:zookeeper} ${:path}
[worker.ini]
recipe = zc.recipe.deployment:configuration
Modified: zc.resumelb/branches/jim-bisect/src/zc/resumelb/lb.py
===================================================================
--- zc.resumelb/branches/jim-bisect/src/zc/resumelb/lb.py 2012-05-08 13:52:28 UTC (rev 125728)
+++ zc.resumelb/branches/jim-bisect/src/zc/resumelb/lb.py 2012-05-08 13:53:06 UTC (rev 125729)
@@ -3,7 +3,6 @@
import gevent.hub
import gevent.pywsgi
import gevent.socket
-import llist
import logging
import re
import sys
@@ -103,7 +102,7 @@
unskilled_score=None, variance=None, backlog_history=None):
self.workers = set()
self.nworkers = 0
- self.unskilled = llist.dllist()
+ self.unskilled = []
self.skilled = {} # rclass -> {[(score, workers)]}
self.event = gevent.event.Event()
_init_backlog(self)
@@ -176,7 +175,7 @@
workers.add(worker)
self.nworkers = len(self.workers)
self._update_decay()
- worker.lnode = self.unskilled.appendleft(worker)
+ insort(self.unskilled, (0, worker))
self.event.set()
worker.resume = resume
@@ -192,9 +191,9 @@
skilled = self.skilled
for rclass, score in worker.resume.iteritems():
skilled[rclass].remove((score, worker))
- if getattr(worker, 'lnode', None) is not None:
- self.unskilled.remove(worker.lnode)
- worker.lnode = None
+ del self.unskilled[
+ bisect_left(self.unskilled, (worker.backlog, worker))]
+ worker.lnode = None
self.workers.remove(worker)
self.backlog -= worker.backlog
@@ -225,7 +224,7 @@
skilled = self.skilled[rclass] = set()
max_backlog = max(self.variance * self.mbacklog / self.nworkers, 1)
- min_backlog = unskilled.first.value.mbacklog + 1
+ min_backlog = unskilled[0][0] + 1
for score, worker in skilled:
if (worker.mbacklog - min_backlog) > max_backlog:
continue
@@ -237,21 +236,23 @@
best_worker = worker
if not best_score:
- best_worker = unskilled.first.value
+ best_worker = unskilled.pop(0)[1]
if rclass not in best_worker.resume:
# We now have an unskilled worker and we need to
# assign it a score.
score = self.unskilled_score
best_worker.resume[rclass] = score
skilled.add((score, best_worker))
+ else:
+ del unskilled[
+ bisect_left(unskilled, (best_worker.backlog, best_worker))
+ ]
- # Move worker from lru to mru end of queue
- unskilled.remove(best_worker.lnode)
- best_worker.lnode = unskilled.append(best_worker)
-
best_worker.backlog += 1
_decay_backlog(best_worker, self.worker_decay)
+ insort(unskilled, (best_worker.backlog, best_worker))
+
self.backlog += 1
_decay_backlog(self, self.decay)
@@ -262,8 +263,11 @@
assert self.backlog >= 0, self.backlog
_decay_backlog(self, self.decay)
if worker.backlog > 0:
+ unskilled = self.unskilled
+ del unskilled[bisect_left(unskilled, (worker.backlog, worker))]
worker.backlog -= 1
_decay_backlog(worker, self.worker_decay)
+ insort(unskilled, (worker.backlog, worker))
def _init_backlog(worker):
worker.backlog = worker.nbacklog = worker.dbacklog = worker.mbacklog = 0
Modified: zc.resumelb/branches/jim-bisect/src/zc/resumelb/pool.test
===================================================================
--- zc.resumelb/branches/jim-bisect/src/zc/resumelb/pool.test 2012-05-08 13:52:28 UTC (rev 125728)
+++ zc.resumelb/branches/jim-bisect/src/zc/resumelb/pool.test 2012-05-08 13:53:06 UTC (rev 125729)
@@ -166,7 +166,7 @@
7: [w1, w3]
>>> [pool.get('foo') for i in range(2)]
- [w5, w5]
+ [w4, w4]
The new workers caused the overall mean to drop and when we got a foo
request, it went to the newest new worker. The subsequent request
@@ -182,12 +182,12 @@
>>> pool # doctest: +ELLIPSIS
Request classes:
bar: w2(0.5,1.0)
- foo: w1(0.5,2.29...), w3(0.5,2.29...), w5(0.5,1.57...)
+ foo: w1(0.5,2.29...), w3(0.5,2.29...), w4(0.5,1.57...)
Backlogs:
overall backlog: 3 Decayed: 9.41... Avg: 1.88...
- 0: [w1, w3, w4]
+ 0: [w1, w3, w5]
1: [w2]
- 2: [w5]
+ 2: [w4]
Now, when we get a worker, we'll get w1.
@@ -205,12 +205,12 @@
>>> pool # doctest: +ELLIPSIS
Request classes:
bar: w2(2.0,1.0)
- foo: w5(0.5,1.57...), w2(2.0,1.0), w3(3.8,2.29...), w1(5.9,1.96...)
+ foo: w4(0.5,1.57...), w2(2.0,1.0), w3(3.8,2.29...), w1(5.9,1.96...)
Backlogs:
overall backlog: 4 Decayed: 9.0... Avg: 1.8...
- 0: [w3, w4]
+ 0: [w3, w5]
1: [w1, w2]
- 2: [w5]
+ 2: [w4]
>>> pool.get('foo')
w1
@@ -222,12 +222,12 @@
>>> pool # doctest: +ELLIPSIS
Request classes:
bar: w2(2.0,1.0)
- foo: w5(0.5,1.5...), w2(2.0,1.0), w3(3.8,1.97...), w1(5.9,1.9...)
+ foo: w4(0.5,1.5...), w2(2.0,1.0), w3(3.8,1.97...), w1(5.9,1.9...)
Backlogs:
overall backlog: 7 Decayed: 8.5... Avg: 1.7...
- 0: [w4]
+ 0: [w5]
1: [w2]
- 2: [w1, w3, w5]
+ 2: [w1, w3, w4]
>>> pool.get('foo')
w1
@@ -245,11 +245,11 @@
>>> pool # doctest: +ELLIPSIS
Request classes:
bar: w2(2.0,1.5...)
- foo: w5(0.5,1.5...), w2(2.0,1.5...), w3(3.8,1.2...), w1(5.9,2.7...)
+ foo: w4(0.5,1.5...), w2(2.0,1.5...), w3(3.8,1.2...), w1(5.9,2.7...)
Backlogs:
overall backlog: 4 Decayed: 7.9... Avg: 1.5...
- 0: [w3, w4]
- 2: [w2, w5]
+ 0: [w3, w5]
+ 2: [w2, w4]
3: [w1]
>>> [pool.get('foo') for i in range(5)]
@@ -265,11 +265,11 @@
>>> pool # doctest: +ELLIPSIS
Request classes:
bar: w2(2.0,1.57...)
- foo: w5(0.5,1.57...), w2(2.0,1.57...)
+ foo: w4(0.5,1.57...), w2(2.0,1.57...)
Backlogs:
overall backlog: 1 Decayed: 7.1... Avg: 2.3...
- 0: [w4]
- 2: [w2, w5]
+ 0: [w5]
+ 2: [w2, w4]
Updating worker settings
========================
Modified: zc.resumelb/branches/jim-bisect/src/zc/resumelb/worker.test
===================================================================
--- zc.resumelb/branches/jim-bisect/src/zc/resumelb/worker.test 2012-05-08 13:52:28 UTC (rev 125728)
+++ zc.resumelb/branches/jim-bisect/src/zc/resumelb/worker.test 2012-05-08 13:53:06 UTC (rev 125729)
@@ -570,9 +570,9 @@
B 0.11 2012-02-05 01:02:03.000456 GET /sleep.html?dur=.1
>>> now += datetime.timedelta(microseconds=10000)
>>> write_message(worker_socket, 22,
- ... newenv('', '/sleep.html?dur=.1&size=111'))
+ ... newenv('', '/sleep.html?dur=.1&size=1111'))
>>> gevent.sleep(.01)
- B 0.22 2012-02-05 01:02:03.010456 GET /sleep.html?dur=.1&size=111
+ B 0.22 2012-02-05 01:02:03.010456 GET /sleep.html?dur=.1&size=1111
>>> now += datetime.timedelta(microseconds=10000)
>>> write_message(worker_socket, 22, '')
>>> gevent.sleep(.01)
@@ -584,7 +584,7 @@
I 0.11 2012-02-05 01:02:03.030456
T 0.22 2012-02-05 01:02:03.030456 test
- 0.22 2012-02-05 01:02:03.030456 test2
- A 0.22 2012-02-05 01:02:03.030456 200 OK 1332
+ A 0.22 2012-02-05 01:02:03.030456 200 OK 13332
C 0.11 2012-02-05 01:02:03.030456
E 0.22 2012-02-05 01:02:03.030456
(22, ('200 OK', [('Content-Length', ...
More information about the checkins
mailing list