關於SignalR併發量測試

取经路上發表於2024-06-27

由於業務需要,需要做一個強制下線的功能(類似QQ、釘釘這種在相同平臺上登入多個賬號,下線之前已登入的賬號)。

經過一些列的調研,發現SignalR這個框架實現起來比較簡單

由於我們的客戶是零散的終端使用者,併發量是首先需要考慮的,寫個測試案例進行連線例項測試。

建立了一臺虛擬機器Centos7版本,開始連線,每次連線不到1024個,就無法建立連線了

這裡主要有2個原因,

第1個是linux的檔案訪問數量被限制,可以透過命令ulimit -n 檢視1024

第2個是nginx的預設最大連線數也是1024.

需要進行如下調整,為了測試併發量,下面的併發數量統一設定為102400左右進行驗證

**增加系統資源限制

編輯 /etc/sysctl.conf 中設定了適當的引數
fs.file-max = 201200
net.core.somaxconn = 65535
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 15

編輯 /etc/security/limits.conf 檔案,新增以下內容:
* soft nofile 102400
* hard nofile 102400

編輯 /etc/sysctl.conf,新增或修改以下內容:
fs.file-max =102400

/etc/systemd/system.conf 檔案中新增或修改以下行:
DefaultLimitNOFILE=102400
DefaultLimitNPROC=102400  #這行可以先不加

/etc/systemd/user.conf 檔案中新增或修改以下行
DefaultLimitNOFILE=102400
DefaultLimitNPROC=102400  #這行可以先不加

調整 Nginx 配置
worker_processes auto;
worker_rlimit_nofile 102400;
events {
    worker_connections 102400;
    multi_accept on;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    tcp_nopush      on;
    tcp_nodelay     on;
    keepalive_timeout  65;
    types_hash_max_size 2048;
    server_tokens off;

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;

  #server 這部分可以單獨配置在
/etc/nginx/conf.d/*.conf;
    server {
        listen 80;
        server_name 192.168.208.131;

        location / {
            proxy_pass http://localhost:5000;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_set_header Host $host;
            proxy_cache_bypass $http_upgrade;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
}

後臺介面程式碼中增加了這些,可能沒什麼用途,有時間在移除單獨測試
//
用來實現實時通訊 builder.WebHost.ConfigureKestrel(serverOptions => { serverOptions.Limits.MaxConcurrentConnections = 102400; serverOptions.Limits.MaxConcurrentUpgradedConnections = 102400; serverOptions.Limits.MaxRequestBodySize = 52428800; // 50 MB serverOptions.Limits.RequestHeadersTimeout = TimeSpan.FromMinutes(1); // 配置更多 Kestrel 伺服器設定 serverOptions.Limits.KeepAliveTimeout = TimeSpan.FromMinutes(2); serverOptions.Limits.RequestHeadersTimeout = TimeSpan.FromSeconds(30); serverOptions.AddServerHeader = false; // 監聽特定的 IP 和埠 serverOptions.ListenAnyIP(5000, listenOptions => { listenOptions.Protocols = Microsoft.AspNetCore.Server.Kestrel.Core.HttpProtocols.Http1AndHttp2; }); });

經過上面的一些列設定後,本機可以連線過萬,部署到雲端伺服器,同時擁有7臺終端進行連線,測試併發量到1.7萬連線沒有問題,由於終端數量有限,無法測試更多的連線。理論上應該是支援更多的連線。

相關文章