2009-07-23 2 views
3

私はソケットサーバエンジンとしてTwisted 8.1.0を使用しています。 Reactor - epoll。データベースサーバはMySQL 5.0.67です。 OS - Ubuntu Linuxの8.10の32ビットTwistedの接続プールサイズを増やす方法は?

/etc/mysql/my.cnf中:ソースコード中

max_connections  = 1000 

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

しかし、現実には、私が見ることができる唯一の200(以下)オープン接続(SHOW PROCESSLIST)アプリケーションが負荷の高い状態で実行されているときそれは私のアプリのために十分ではありません:(

私は、これはスレッドプールの制限です見ての通り。任意のアイデア?

答えて

8

あなたが疑われるように、これはおそらく、スレッドの問題です。cp_max数の上限を設定しますしかし、スレッドプール内のスレッドの数は非常に多いですが、プロセスはこの制限をはるかに下回っている可能性が非常に高く、スレッド数が約200個の場合はスレッドごとに独自のスタックがあるため、

これは、プログラムを実行する前にスタックサイズulimitの設定(私はbashを使用しています)を調整することで確認できます。つまり、

$ 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 

マシンのデフォルトスタックサイズは10240Kで、この設定では約300スレッドを作成できることがわかりました。スタックサイズを1024Kに調整する(ulimit -s 1024を使用)私は約3000のスレッドを作成できます。

このスクリプトを使用して、あなたのシステム上のスレッド作成の制限に関するいくつかのアイデアを得ることができます。

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() 

これはあなたの問題がConnectionPoolスレッドのメモリ要件によって異なります解決かどうか。

+0

ありがとう、問題解決済み! – user68488

+0

おそらく答えを受け入れるべきですか?また、Python> = 2.5のスレッドモジュールには、stack_size(min 32K)を直接設定できるstack_size()関数があります。 – mhawke

+0

もう一度おねがいします!私はわずか11の評判ポイントがありますが、投票するには15が必要です。 – user68488

関連する問題