[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