[24454] in Source-Commits
/svn/athena r24045 - trunk/debathena/debathena/metrics/debathena/metrics
daemon@ATHENA.MIT.EDU (Evan Broder)
Sun Oct 4 22:03:49 2009
Date: Sun, 4 Oct 2009 22:03:37 -0400
From: Evan Broder <broder@MIT.EDU>
Message-Id: <200910050203.n9523bG6002961@drugstore.mit.edu>
To: source-commits@mit.edu
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Author: broder
Date: 2009-10-04 22:03:37 -0400 (Sun, 04 Oct 2009)
New Revision: 24045
Modified:
trunk/debathena/debathena/metrics/debathena/metrics/gatherer.py
Log:
Add logic to metrics code to wait for 1ms before actually reading
events from the connector.
This batches a bunch of quick successive events together, rather than
continually waking up the gatherer, which minimizes the performance
impact to the rest of the system.
Modified: trunk/debathena/debathena/metrics/debathena/metrics/gatherer.py
===================================================================
--- trunk/debathena/debathena/metrics/debathena/metrics/gatherer.py 2009-10-05 01:37:00 UTC (rev 24044)
+++ trunk/debathena/debathena/metrics/debathena/metrics/gatherer.py 2009-10-05 02:03:37 UTC (rev 24045)
@@ -55,13 +55,9 @@
self.start_time = time.time()
self.session_uuid = str(uuid.uuid4())
- proc_conn = connector.Connector()
- make_non_blocking(proc_conn)
- gobject.io_add_watch(
- proc_conn,
- gobject.IO_IN,
- self.run_program,
- )
+ self.proc_conn = connector.Connector()
+ make_non_blocking(self.proc_conn)
+ self.setup_io_watch()
dbus.SystemBus().add_signal_receiver(
self.install_package,
@@ -77,26 +73,44 @@
path=DBUS_OBJECT,
)
+ def setup_io_watch(self):
+ gobject.io_add_watch(
+ self.proc_conn,
+ gobject.IO_IN,
+ self.setup_run_program,
+ )
+
+ def setup_run_program(self, fd, cond):
+ gobject.timeout_add(
+ 1,
+ self.run_program,
+ fd,
+ cond,
+ )
+ return False
+
def run_program(self, fd, cond):
- while True:
- try:
- ev = fd.recv_event()
- except IOError, e:
- if e.errno == errno.EAGAIN:
- break
- raise
-
- if ev.what == connector.PROC_EVENT_EXEC:
+ try:
+ while True:
try:
- prog = os.readlink("/proc/%d/exe" % ev.process_pid)
- self.executed_programs.add(prog)
- except OSError, e:
- if e.errno == errno.ENOENT:
- continue
- raise
+ ev = fd.recv_event()
+ except IOError, e:
+ if e.errno == errno.EAGAIN:
+ break
- return True
+ if ev.what == connector.PROC_EVENT_EXEC:
+ try:
+ prog = os.readlink("/proc/%d/exe" % ev.process_pid)
+ self.executed_programs.add(prog)
+ except OSError, e:
+ if e.errno == errno.ENOENT:
+ continue
+ except:
+ pass
+ self.setup_io_watch()
+ return False
+
def install_package(self, package):
self.installed_packages.add(str(package))