這幾天一直在使用python 的 pymongo操作mongodb數(shù)據(jù)庫(kù)状土,然后發(fā)現(xiàn)一個(gè)問(wèn)題:
在大量操作的情況下,mongo會(huì)突然連接不上,導(dǎo)致程序出錯(cuò)
一開(kāi)始我的解決辦法就是:重啟.....后面發(fā)現(xiàn)祟身,治標(biāo)不治本教寂,這樣下去是不行滴
netstat -an | grep 27017
查看端口情況27017 ( 我設(shè)置的連接mongodb的端口 )
netstat -an | grep -c 27017
查看27017端口的連接數(shù)
netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"\t",state[key]}'
查看tcp的各個(gè)狀態(tài)的數(shù)目
發(fā)現(xiàn)處于time_wait的tcp竟然達(dá)到上萬(wàn)
發(fā)現(xiàn)連接mongodb的tcp的大量處于time_wait狀態(tài)症概,學(xué)過(guò)網(wǎng)絡(luò)應(yīng)該知道油航,客戶端主動(dòng)關(guān)閉連接時(shí)糊闽,會(huì)發(fā)送最后一個(gè)ack后,然后會(huì)進(jìn)入TIME_WAIT狀態(tài)谍珊,再停留2個(gè)MSL時(shí)間治宣,進(jìn)入close狀態(tài)。
猜測(cè)之前mongodb會(huì)連接不上可能跟tcp大量處于time_wait狀態(tài)有關(guān)砌滞,檢查一下mongodb所支持的最大連接數(shù)
db.serverStatus().connections
查看mongodb的最大連接數(shù)
如下圖炼七,雖然mongo的最大連接數(shù)是可以設(shè)置,但是在我的項(xiàng)目中已經(jīng)足夠用了
可見(jiàn)布持,mongodb的最大支持連接數(shù)是19998
在下的解決辦法:
- 在使用mongodb之后,要進(jìn)行close斷開(kāi)連接操作
- 設(shè)置releaseConnectionsAfterResponse參數(shù)
db.runCommand({ setParameter : 1, releaseConnectionsAfterResponse : true })
在網(wǎng)上查找陕悬,releaseConnectionsAfterResponse參數(shù):連接在完成一個(gè)讀操作或者安全寫(xiě)操作后能夠重復(fù)使用
- 默認(rèn)mongo的連接是可以復(fù)用的题暖,可設(shè)置maxPoolSize連接池的最大數(shù)量,waitQueueMultiple等待的最大數(shù)量,waitQueueTimeoutMS等待隊(duì)列的超時(shí)時(shí)間
client = MongoClient(host, port, maxPoolSize=200)
client = MongoClient(host, port, maxPoolSize=None)
client = MongoClient(host, port, maxPoolSize=50, waitQueueMultiple=10)
client = MongoClient(host, port, waitQueueTimeoutMS=100)
我只采用了前兩個(gè)方法胧卤,最后保持tcp的連接在4000左右唯绍,目前還不知道有沒(méi)有其他更好的辦法。
寫(xiě)下這篇文章作為記錄枝誊。
參考鏈接:
http://blog.chinaunix.net/uid-15795819-id-3807939.html
http://api.mongodb.com/python/current/faq.html
http://blog.csdn.net/hjxhjh/article/details/12611195