diff --git a/openerp/netsvc.py b/openerp/netsvc.py index 2763f79a6cf..b3481bd8db4 100644 --- a/openerp/netsvc.py +++ b/openerp/netsvc.py @@ -48,6 +48,12 @@ import openerp _logger = logging.getLogger(__name__) +def memory_info(process): + """ psutil < 2.0 does not have memory_info, >= 3.0 does not have + get_memory_info """ + return (getattr(process, 'memory_info', None) or process.get_memory_info)() + + def close_socket(sock): """ Closes a socket instance cleanly @@ -293,7 +299,7 @@ def dispatch_rpc(service_name, method, params): start_time = time.time() start_rss, start_vms = 0, 0 if psutil: - start_rss, start_vms = psutil.Process(os.getpid()).get_memory_info() + start_rss, start_vms = memory_info(psutil.Process(os.getpid())) if rpc_request and rpc_response_flag: log(rpc_request,logging.DEBUG,'%s.%s'%(service_name,method), replace_request_password(params)) @@ -303,7 +309,7 @@ def dispatch_rpc(service_name, method, params): end_time = time.time() end_rss, end_vms = 0, 0 if psutil: - end_rss, end_vms = psutil.Process(os.getpid()).get_memory_info() + end_rss, end_vms = memory_info(psutil.Process(os.getpid())) logline = '%s.%s time:%.3fs mem: %sk -> %sk (diff: %sk)' % (service_name, method, end_time - start_time, start_vms / 1024, end_vms / 1024, (end_vms - start_vms)/1024) if rpc_response_flag: log(rpc_response,logging.DEBUG, logline, result) diff --git a/openerp/service/workers.py b/openerp/service/workers.py index b275f5cd8cd..a6716d92631 100644 --- a/openerp/service/workers.py +++ b/openerp/service/workers.py @@ -23,9 +23,12 @@ except ImportError: import openerp import openerp.tools.config as config +from openerp.netsvc import memory_info _logger = logging.getLogger(__name__) + + class Multicorn(object): """ Multiprocessing inspired by (g)unicorn. Multicorn currently uses accept(2) as dispatching method between workers @@ -261,7 +264,7 @@ class Worker(object): _logger.info("Worker (%d) max request (%s) reached.", self.pid, self.request_count) self.alive = False # Reset the worker if it consumes too much memory (e.g. caused by a memory leak). - rss, vms = psutil.Process(os.getpid()).get_memory_info() + rss, vms = memory_info(psutil.Process(os.getpid())) if vms > config['limit_memory_soft']: _logger.info('Worker (%d) virtual memory limit (%s) reached.', self.pid, vms) self.alive = False # Commit suicide after the request. @@ -396,7 +399,7 @@ class WorkerCron(Worker): self.setproctitle(db_name) if rpc_request_flag: start_time = time.time() - start_rss, start_vms = psutil.Process(os.getpid()).get_memory_info() + start_rss, start_vms = memory_info(psutil.Process(os.getpid())) while True: # acquired = openerp.addons.base.ir.ir_cron.ir_cron._acquire_job(db_name) # TODO why isnt openerp.addons.base defined ? @@ -410,7 +413,7 @@ class WorkerCron(Worker): openerp.sql_db.close_db(db_name) if rpc_request_flag: end_time = time.time() - end_rss, end_vms = psutil.Process(os.getpid()).get_memory_info() + end_rss, end_vms = memory_info(psutil.Process(os.getpid())) logline = '%s time:%.3fs mem: %sk -> %sk (diff: %sk)' % (db_name, end_time - start_time, start_vms / 1024, end_vms / 1024, (end_vms - start_vms)/1024) _logger.debug("WorkerCron (%s) %s", self.pid, logline)