2009-07-23 17 views
3

J'utilise Twisted 8.1.0 comme moteur de serveur de socket. Réacteur - epoll. Le serveur de base de données est MySQL 5.0.67. OS - Linux Ubuntu 8.10 32 bitsComment augmenter la taille du pool de connexion pour Twisted?

dans /etc/mysql/my.cnf:

max_connections  = 1000 

dans le code source:

adbapi.ConnectionPool("MySQLdb", ..., use_unicode=True, charset='utf8', 
         cp_min=3, cp_max=700, cp_noisy=False) 

Mais en réalité, je ne vois que 200 (ou moins) connexions ouvertes (SHOW PROCESSLIST) lorsque l'application fonctionne sous une charge importante. Il ne suffit pas pour mon application :(

Comme je vois cela est limite pour le pool de threads. Des idées?

Répondre

8

Comme vous pensez, cela est probablement un problème de filetage. cp_max fixe une limite supérieure pour le nombre des threads dans le pool de threads, cependant, votre processus risque de manquer de mémoire bien en dessous de cette limite, dans votre cas autour de 200 threads.Chaque thread a sa propre pile, la mémoire totale utilisée par votre processus atteint la limite du système

Vous pouvez vérifier cela en ajustant le paramètre ulimit de la taille de la pile (J'utilise bash) avant d'exécuter votre programme, par exemple

$ ulimit -a 
core file size   (blocks, -c) 0 
data seg size   (kbytes, -d) unlimited 
max nice      (-e) 0 
file size    (blocks, -f) unlimited 
pending signals     (-i) 32750 
max locked memory  (kbytes, -l) 32 
max memory size   (kbytes, -m) unlimited 
open files      (-n) 1024 
pipe size   (512 bytes, -p) 8 
POSIX message queues  (bytes, -q) 819200 
max rt priority     (-r) 0 
stack size    (kbytes, -s) 10240 
cpu time    (seconds, -t) unlimited 
max user processes    (-u) 32750 
virtual memory   (kbytes, -v) unlimited 
file locks      (-x) unlimited 

Vous pouvez voir que la taille de la pile par défaut est 10240K sur ma machine et j'ai trouvé que je peux créer environ 300 threads avec ce paramètre. Ajustement de la taille de la pile à 1024K (en utilisant ulimit -s 1024) Je peux créer environ 3000 threads.

Vous pouvez avoir une idée sur les limites de la création de fil sur votre système en utilisant ce script:

from thread import start_new_thread 
from time import sleep 

def sleeper(): 
    try: 
     while 1: 
      sleep(10000) 
    except: 
     if running: raise 

def test(): 
    global running 
    n = 0 
    running = True 
    try: 
     while 1: 
      start_new_thread(sleeper,()) 
      n += 1 
    except Exception, e: 
     running = False 
     print 'Exception raised:', e 
    print 'Biggest number of threads:', n 

if __name__ == '__main__': 
    test() 

Que cela résout votre problème dépendra des besoins en mémoire des ConnectionPool threads.

+0

Merci beaucoup, problème résolu! – user68488

+0

Peut-être que vous devriez accepter la réponse alors? En outre, le module thread dans python> = 2.5 a une fonction stack_size() où vous pouvez directement définir la taille de la pile (min 32K). – mhawke

+0

Merci encore! Je n'ai que 11 points de réputation mais j'ai besoin de 15 pour voter :( – user68488

Questions connexes