Hello,

Apologies if this post is off topic.

We have a Python application that polls directories using threads and
inotify watchers. We have always run this application in a cloud
server provided by Voxel (http://www.voxel.net). We are currently
testing a different cloud server provider StormOnDemand
(http://stormondemand.com) and when we ran our application, our load
averages were a lot higher then they were when they were running on
the Voxel cloud server despite the specs being about the same (Refer
below for more details on setup). We have also ensured then when
testing the server was not handling any other loads.

I have written a simple test application (test_threads.py - attached,
or refer to http://pastebin.com/xGQU7JD0) that simulates the issues we
are seeing by starting up  threads that loops, sleeping for a user
defined time on each loop. It takes 2 parameters, the amount of
threads to start and the interval period.

When I run, "python test_threads.py 50 0.1" for about 10 minutes

Load average results:

StormOnDemand:
$ uptime
 18:46:22 up  7:29,  6 users,  load average: 4.43, 4.16, 2.93

voxel.net
$ uptime
 18:48:14 up 9 days, 15:09,  9 users,  load average: 0.51, 0.47, 0.43

The load average on the StormOnDemand server is a lot higher.

Python version:
StormOnDemand - 2.6.5
Voxel - 2.6.5

Server spec:
StormOnDemand - 8 x Intel(R) Xeon(R) CPU E5506 @ 2.13GHz; 16GB RAM;
230GB HDD (Storm Bare Metal servers)
Voxel - 7 x Intel(R) Xeon(R) CPU L5640 @ 2.27GHz; 14GB RAM; 200GB HDD
(VoxCloud servers)

OS:
StormOnDemand - Ubuntu 10.04 - 2.6.36-rc8101910 #1 SMP Tue Oct 19
19:18:34 UTC 2010 x86_64 GNU/Linux
Voxel - Ubuntu 10.04 -  2.6.32-31-server #61-Ubuntu SMP Fri Apr 8
19:44:42 UTC 2011 x86_64 GNU/Linux

Virtualisation method:
StormOnDemand - Not 100% sure, but I think they use Xen
Voxel - Not sure, but the image that we are using looks to us like a
stock standard Ubuntu 10.04 server

Any suggestion on why the load would be a lot higher or how I could
debug this further is greatly appreciated.


-- 
Mohan
#Simple script to test load when running python threads
# usage:
# python test_threads.py <number of threads> <thread loop interval>
# e.g. :
# python test_threads.py 50 0.1
#

import sys
from threading import Lock, Thread
import logging
import time

logging.basicConfig()

log = logging.getLogger("test")
log.setLevel(logging.DEBUG) 

class MonitorDir(Thread):
    def __init__(self, id, interval):
        super(MonitorDir, self).__init__()
      	self.interval = interval 
        self.id = id 
        self._terminated = False
    
    def finish(self):
        if not self._terminated:
            log.info('Terminating... %i'%self.id)
            self._terminated = True
    
    def run(self):
        print 'Start threadi %i'%self.id
        
        try:
            while not self._terminated:
                log.info('in id - %i \n'%self.id)
                time.sleep(self.interval)
        except:
            log.exception('Unexpected error while monitoring')
        finally:
            log.info('Done monitoring')
    
        
if __name__ == '__main__':
    mThreads = []
    for i in range(int(sys.argv[1])):
        print "create thread %i"%i
	mThread = MonitorDir(i, float(sys.argv[2]))
	mThreads.append(mThread)
	mThread.start()

    while any(x.isAlive() for x in mThreads):
        try:
	    time.sleep(1)
        except KeyboardInterrupt:
	    log.debug('Exiting...')
	    break
    else:
       sys.exit(1) 

    for mThread in mThreads:
        mThread.finish()

    for mThread in mThreads:
        mThread.join()

    sys.exit(0)
-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to