edo1z blog

プログラミングなどに関するブログです

socket.ioの最大同時接続数とサーバ負荷の確認

Adonis.jsでsocket.ioを動かして、リアルタイムにプッシュ配信させるプログラムをPM2で動かしています。webサーバはApacheです。Apacheの設定についてはここにメモしました。socket.ioを使ったので同時接続どのくらいできるのか確認しました。とりあえず同時接続500いけば問題ない状況です。最初はサイトにJMeterを使って同時接続テストをしようと思ったのですが、フロントの開発サーバと本番サーバが同じサーバだったので、下記プログラムを使いました。

同時接続テスト用のプログラム

const io = require('socket.io-client');
const connectNumber = 1;
let sockets = Array(connectNumber);
for(let i = 0; i < connectNumber; i++) {
  sockets[i] = io("https://example.com/", { path: '/realtime/', transports: ["websocket"], timeout:10000 });
  sockets[i].on('connect_error', data => {
    console.log("connect_error", data);
  })
  sockets[i].on('connect_timeout', data => {
    console.log("connect_timeout", data);
  })
}

このコードで、connectNumberを1~2000まで上げて試してみました。最初は360位以上接続数が増えませんでした。Apacheの設定が原因だったので、調整したら1000までいけるようになりました。CPU負荷も同時接続数1でも1000でもあんまり変わらない感じでした。

Apacheの設定

Apacheのバージョン

$ httpd -v
Server version: Apache/2.4.37 (centos)

httpd.confに追記した内容

<IfModule mpm_event_module>
   StartServers             2
   MinSpareThreads          25
   MaxSpareThreads          200
   ThreadLimit              150
   ThreadsPerChild          100
   MaxRequestWorkers        2000
   MaxConnectionsPerChild   0
</IfModule>

上記の項目については、下記を参考にしました。

qiita.com

ulimitの設定

  • 今これが1024になっている。設定変えて10000にしたのですが、反映されてないっぽい。色々やるには権限的にも面倒そうで、そもそも500同時接続が問題なければOKだったので、設定反映されないまま終了した。

PM2

PM2は便利です。下記のようなコマンドが使えます。

$ pm2 start server.js
$ pm2 reload server
$ pm2 ls
$ pm2 monit

PM2のクラスターモードを使うと、CPUを並列的に使ってくれるらしい。

pm2.keymetrics.io

でもsocket.io使う場合は、ここに書いてあるSticky load balancingなどをする必要があるらしい。あと、CPU負荷見ていたのですが、特に1つのCPUだけ極端に多く使われてる感じもなかったし、同時接続500は余裕だったので、これもやらないで終了した。