1. 程式人生 > >RabbitMQ能開啟的最大連線數

RabbitMQ能開啟的最大連線數

RabbitMQ自帶了顯示能夠接受的最大連線數,有2種比較直觀的方式:
1. rabbitmqctl命令。

1
2
3
4
5
6
7
8
9
10
11
12
n$ rabbitmqctl status
Status of node '[email protected]' ...
[{pid,23658},
 ......
 {file_descriptors,
     [{total_limit,924},
      {total_used,10},
      {sockets_limit,829},
      {sockets_used,10}]},
 ......
]
...done.

2. rabbitmq_management WebUI外掛。

本文關注當RabbitMQ可用連線數耗盡時客戶端的影響以及如何增加最大連線數預設值。

RabbitMQ的socket連線數(socket descriptors)是檔案描述符(file descriptors,fd)的一個子集。也就是說,RabbitMQ能同時開啟的最大連線數和最大檔案控制代碼數(檔案系統,管道)都是受限於作業系統關於檔案描述符數量的設定,兩者是此消彼長的關係。初始時,可用socket描述符與可用fd數量的比率大概在0.8-0.9左右,這個值並不固定,當socket描述符有剩餘時,RabbitMQ會使用盡量多的檔案描述符用於磁碟檔案讀寫。隨著伺服器建立越來越多的socket連線,檔案控制代碼開始回收,數量減少。總之,RabbitMQ會優先將檔案描述符用於建立socket連線,寧可犧牲頻繁開啟/關閉檔案帶來的磁碟操作效能損耗,這種取捨很容易理解,作為網路伺服器,當然優先保障網路吞吐率了。因此,對於高併發連線數的多佇列讀寫時,佇列效能會稍微差那麼一點,比如用RabbitMQ做RPC。

當伺服器建立的socket連線已經達到限制(sockets_limit)時,伺服器不再接受新連線。這裡要區分清楚,RabbitMQ不再接收的是AMQP連線,而不是傳輸層的TCP連線,通過簡單抓包分析即可清楚流程:

1
2
3
4
5
6
7
8
$ sudo tcpdump host 10.101.17.13 and port 5672
17:24:12.214186 IP 10.101.17.166.56925 > 10.101.17.13.amqp: Flags [S], seq 3319779561, win 65535, options [mss 1368,nop,wscale 5,nop,nop,TS val 1006381554 ecr 0,sackOK,eol], length 0
17:24:12.214231 IP 10.101.17.13.amqp > 10.101.17.166.56925: Flags [S.], seq 1636058035, ack 3319779562, win 14480, options [mss 1460,sackOK,TS val 24529834 ecr 1006381554,nop,wscale 5], length 0
17:24:12.218795 IP 10.101.17.166.56925 > 10.101.17.13.amqp: Flags [.], ack 1, win 4110, options [nop,nop,TS val 1006381560 ecr 24529834], length 0
17:24:12.243184 IP 10.101.17.166.56925 > 10.101.17.13.amqp: Flags [P.], seq 1:9, ack 1, win 4110, options [nop,nop,TS val 1006381583 ecr 24529834], length 8
17:24:12.243201 IP 10.101.17.13.amqp > 10.101.17.166.56925: Flags [.], ack 9, win 453, options [nop,nop,TS val 24529841 ecr 1006381583], length 0
17:24:22.247907 IP 10.101.17.166.56925 > 10.101.17.13.amqp: Flags [F.], seq 9, ack 1, win 4110, options [nop,nop,TS val 1006391550 ecr 24529841], length 0
17:24:22.284914 IP 10.101.17.13.amqp > 10.101.17.166.56925: Flags [.], ack 10, win 453, options [nop,nop,TS val 24532352 ecr 1006391550], length 0

line 2-4是TCP握手包,成功建立TCP連線。line 5開始客戶端向伺服器端傳送AMQP協議頭字串“AMQP0091”,共8個位元組,開始AMQP握手。line 6是伺服器回給客戶端的ack包,但未傳送AMQP connection.start方法,導致客戶端一直等到超時(line 7-8),傳送FIN包關閉TCP連線。至此,AMQP連線建立失敗。

從客戶端(Java SDK)來看上述這個過程,客戶端通過ConnectionFactory例項的newConnection()方法建立一條AMQP連線。在網路層,它首先通過java.net.Socket與伺服器建立一條TCP連線,傳送協議協商字串“AMQP0091”,然後啟動MainLoop執行緒,通過封裝的Frame例項來迴圈讀取幀(readFrame()),注意readFrame()方法可能會有一個SocketTimeoutException的超時異常,這個超時時間是由socket例項setSoTimeout方法寫入,預設是10s,由AMQConnection.HANDSHAKE_TIMEOUT常量指定。當超時發生在AMQP連線握手階段時,就丟擲一個SocketTimeoutException異常,發生在其他階段(除心跳超時)時,什麼都不做繼續下一個迴圈:

1
2
3
4
  1. Caused by: java.net.SocketTimeoutException: Timeout during Connection negotiation

  2. at com.rabbitmq.client.impl.AMQConnection.handleSocketTimeout(AMQConnection...

  3. at com.rabbitmq.client.impl.AMQConnection.access$500(AMQConnection.java:59)

  4. at com.rabbitmq.client.impl.AMQConnection$MainLoop.run(AMQConnection.java:541)

這裡的socket讀取超時很容易跟連線超時搞混。連線超時由ConnectionFactory例項的setConnectionTimeout()方法指定,對應著網路層Socket例項connect()方法中的timeout引數,指的是完成TCP三次握手的超時時間;而讀取超時是從socket中讀取位元組流的等待時間,前文已經說過,由Socket例項的setSoTimeout()指定。這在各種網路庫中應該很常見,比如HttpClient。

私以為這種情況下更好的設計是應該由RabbitMQ主動斷開與客戶端的TCP連線,減少客戶端等待時間。

最後一個問題,如何增加RabbitMQ的能夠同時開啟的連線數。通過前文可知,最大併發連線數由此程序可開啟的最大檔案描述符數量(乘以一個比例係數)決定,因此只要增加單個程序可開啟的檔案描述符數量即可。有幾個常規方法,按作用範圍可以歸納為以下幾類:

1. 程序級別。在啟動指令碼rabbitmq-server中加入ulimit -n 10240命令(假設將最大檔案描述符數量設定為10240,下同),相當於在shell中執行,由此shell程序fork出來的程序都能繼承這個配置。

2. 使用者級別。修改/etc/security/limits.conf檔案,新增以下配置,重新登入生效:

1
2
user    soft    nofile    10240
user    hard    nofile    10240

3. 系統級別。

1
# echo 10240 > /proc/sys/fs/file-max

上述設定只是針對proc檔案系統,相當於修改了作業系統的執行時引數,重啟後失效。要想永久生效,需要修改/etc/sysctl.conf檔案,加入配置項fs.file-max=10240。

一個程序能開啟的最大檔案描述符數量受限於上述三個級別配置中的最小值。理論上,系統級別的配置數值必須要大於使用者級別,使用者級別的要大於程序級別的,只有這樣配置才是安全的,否則程序容易因為開啟檔案數量問題受到來自作業系統的種種限制。作業系統為什麼要限制可開啟的檔案描述符數量?為了系統安全。因為檔案描述符本質上是一種記憶體中的資料結構,如果不加以限制,很容易被程序無意或惡意耗盡記憶體,比如fork bomb

相關推薦

RabbitMQ開啟連線

RabbitMQ自帶了顯示能夠接受的最大連線數,有2種比較直觀的方式: 1. rabbitmqctl命令。 1 2 3 4 5 6 7 8 9 10 11 12 n$ rabbitmqctl status Status of node '[e

一個IP建立的連線是多少?

在探討這個問題前,我們先假設一種經典的連線模型: Client -> Load Balancer-> RealServer Pool 並且我們假設這裡使用NAT模式的負載均衡,在這種模式下: 1.負載均衡器只留給客戶端一個公網IP地址(VIP); 2.客戶端發來的請求都被負載均衡器端截,

mysql在linux下表名大小寫以及mysql連線

“Can not connect to MySQL server. Too many connections”-mysql 1040錯誤,這是因為訪問MySQL且還未釋放的連線數目已經達到MySQL的上限。通常,mysql的最大連線數預設是100, 最大可以達到16384。 第一種:命

ubuntu環境mosquitto安裝及測試連線

ubuntu環境mosquitto安裝及測試最大連線數 #!/bin/bash c=1 -d while [ $c -le 5000 ] do mosquitto_sub -d -t hexiang -k 900 & (( c++ )) done 檢視連線數 ne

Nginx 單個程序允許的連線

(1) 控制 Nginx 單個程序允許的最大連線數的引數為 worker_connections ,這個引數要根據伺服器效能和記憶體使用量來調整 (2) 程序的最大連線數受 Linux 系統程序的最大開啟檔案數限制,只有執行了 “ulimit -HSn 65535” 之後,worker_

遠端登陸Windows2000系統,提示計算機已經超過連線

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

TCP連線測試工具

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

MYSQL 檢視連線和修改連線

MySQL檢視最大連線數和修改最大連線數 1、檢視最大連線數show variables like '%max_connections%';2、修改最大連線數set GLOBAL max_connections = 200;   以下的文章主要是向大家介紹的是MySQL最大連線數的修改,我們大家

Linux下高併發socket連線各種限制的調優

1、修改使用者程序可開啟檔案數限制  在Linux平臺上,無論編寫客戶端程式還是服務端程式,在進行高併發TCP連線處理時,最高的併發數量都要受到系統對使用者單一程序同時可開啟檔案數量的限制(這是因為系統為每個TCP連線都要建立一個socket控制代碼,每個socket控制代碼同時也是一個檔案控制代碼)。可使用

mysql查詢連線及鎖

1、檢視最大連線數 show variables like '%max_connections%'; 2、修改最大連線數 set GLOBAL max_connections = 200; 3.root 檢視所有使用者當前連線 -- show processlist;只列出

Mysql MariaDB修改連線

1.mariadb資料庫最大連線數,預設為151 MariaDB [(none)]> show variables like 'max_connections'; +-----------------+-------+ | Variable_name   | Value |

科學地增加postgresql連線

首先如何檢視最大連線數 This SQL will help you select max_conn,used,res_for_super,max_conn-used-res_for_super res_for_normal from (select count(*) used from pg_s

突破netty單機連線

實現單機的百萬連線,瓶頸有以下幾點: 1、如何模擬百萬連線 2、突破區域性檔案控制代碼的限制 3、突破全域性檔案控制代碼的限制 在linux系統裡面,單個程序開啟的控制代碼數是非常有限的,一條TCP連線就對應一個檔案控制代碼,而對於我們應用程式來說,一個服務端預設建立的連線數是有限制的。 如下圖所

Oracle修改連線的步驟

修改Oracle最大連線數 1、修改Oracle最大連線數的方法      a、以sysdba身份登陸PL/SQL 或者 Worksheet    b、查詢目前連線數       show parame

Android軟體限制AP的連線

最近有個需要是要做成AP的最大連線數使用者可配置,此處不討論硬體限制,僅僅從軟體方面去對Android原始碼做修改。 讓/data/misc/wifi/hostapd.conf裡面帶上max_num_sta引數即可達到目的,例如要限制成10個,則max_num_sta=10

SignalR 行實時通訊連線

SignalR 搭建實時重新整理應用雖然非常方便,但是有個問題你必須考慮到,就是一般的瀏覽器,對於SignalR的全雙工通訊方式,絕大多數瀏覽器都只支援6個新視窗,如果你開啟第7個,那麼新的框口頁面是不會載入的。 這其實是客戶端瀏覽器的限制,這是以連線的域名為單位來限制, 如果是最新版本的IE似乎沒有這個限制

遠端桌面超出連線的解決方法/實現多使用者遠端桌面

遠端桌面超出最大連線數的解決方法/2003 解決方法1】 1、找到一臺能連上網路的windows2003的機器 2、開始–執行–輸入“tsmmc.msc”,跳出一個遠端桌面控制檯 3、右鍵點選左邊的“遠端桌面”,選擇“新建遠端桌面”,按照要求填寫要連線的虛擬主機

tomcat執行緒等待連線

tomcat是目前較為常用的Web容器,那麼怎麼配置tomcat才能使得自己的服務效率更高,今天我主要解釋一下tomcat的最大執行緒數(maxThreads)、最大等待數(acceptCount)和最大連線數(maxConnections)。     maxThreads

Tomcat容器做到自我保護,設定連線(服務限流:tomcat請求限制)

http://itindex.net/detail/58707-%E5%81%87%E6%AD%BB-tomcat-%E5%AE%B9%E5%99%A8 為了確保服務不會被過多的http長連線壓垮,我們需要對tomcat設定個最大連線數,超過這個連線數的請求會拒絕,讓其負載到其它機器。達到保護自己的同時起到

gerrit允許連線修改

Received disconnect from 12.xx.xx.xx port 29418:12: Too many concurrent connections (64) - max. allowed: 64 此時需要修改gerrit上的配置檔案 etc/ge