490 ): |
490 ): |
491 results['%s_cache_size' % title] = '%s / %s' % (size, maxsize) |
491 results['%s_cache_size' % title] = '%s / %s' % (size, maxsize) |
492 results['%s_cache_hit' % title] = hits |
492 results['%s_cache_hit' % title] = hits |
493 results['%s_cache_miss' % title] = misses |
493 results['%s_cache_miss' % title] = misses |
494 results['%s_cache_hit_percent' % title] = (hits * 100) / (hits + misses) |
494 results['%s_cache_hit_percent' % title] = (hits * 100) / (hits + misses) |
|
495 results['type_source_cache_size'] = len(self._type_source_cache) |
|
496 results['extid_cache_size'] = len(self._extid_cache) |
495 results['sql_no_cache'] = self.system_source.no_cache |
497 results['sql_no_cache'] = self.system_source.no_cache |
496 results['nb_open_sessions'] = len(self._sessions) |
498 results['nb_open_sessions'] = len(self._sessions) |
497 results['nb_active_threads'] = threading.activeCount() |
499 results['nb_active_threads'] = threading.activeCount() |
498 results['looping_tasks'] = ', '.join(str(t) for t in self._looping_tasks) |
500 results['looping_tasks'] = ', '.join(str(t) for t in self._looping_tasks) |
499 results['available_cnxsets'] = self._cnxsets_pool.qsize() |
501 results['available_cnxsets'] = self._cnxsets_pool.qsize() |
500 results['threads'] = ', '.join(sorted(str(t) for t in threading.enumerate())) |
502 results['threads'] = ', '.join(sorted(str(t) for t in threading.enumerate())) |
|
503 return results |
|
504 |
|
505 def gc_stats(self, nmax=20): |
|
506 """Return a dictionary containing some statistics about the repository |
|
507 memory usage. |
|
508 |
|
509 This is a public method, not requiring a session id. |
|
510 |
|
511 nmax is the max number of (most) referenced object returned as |
|
512 the 'referenced' result |
|
513 """ |
|
514 |
|
515 from cubicweb._gcdebug import gc_info |
|
516 from cubicweb.appobject import AppObject |
|
517 from cubicweb.rset import ResultSet |
|
518 from cubicweb.dbapi import Connection, Cursor |
|
519 from cubicweb.web.request import CubicWebRequestBase |
|
520 from rql.stmts import Union |
|
521 |
|
522 lookupclasses = (AppObject, |
|
523 Union, ResultSet, |
|
524 Connection, Cursor, |
|
525 CubicWebRequestBase) |
|
526 try: |
|
527 from cubicweb.server.session import Session, InternalSession |
|
528 lookupclasses += (InternalSession, Session) |
|
529 except ImportError: |
|
530 pass # no server part installed |
|
531 |
|
532 results = {} |
|
533 counters, ocounters, garbage = gc_info(lookupclasses, |
|
534 viewreferrersclasses=()) |
|
535 values = sorted(counters.iteritems(), key=lambda x: x[1], reverse=True) |
|
536 results['lookupclasses'] = values |
|
537 values = sorted(ocounters.iteritems(), key=lambda x: x[1], reverse=True)[:nmax] |
|
538 results['referenced'] = values |
|
539 results['unreachable'] = len(garbage) |
501 return results |
540 return results |
502 |
541 |
503 def get_schema(self): |
542 def get_schema(self): |
504 """Return the instance schema. |
543 """Return the instance schema. |
505 |
544 |