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>
上記の項目については、下記を参考にしました。
ulimitの設定
- 今これが1024になっている。設定変えて10000にしたのですが、反映されてないっぽい。色々やるには権限的にも面倒そうで、そもそも500同時接続が問題なければOKだったので、設定反映されないまま終了した。
PM2
PM2は便利です。下記のようなコマンドが使えます。
$ pm2 start server.js $ pm2 reload server $ pm2 ls $ pm2 monit
PM2のクラスターモードを使うと、CPUを並列的に使ってくれるらしい。
でもsocket.io使う場合は、ここに書いてあるSticky load balancingなどをする必要があるらしい。あと、CPU負荷見ていたのですが、特に1つのCPUだけ極端に多く使われてる感じもなかったし、同時接続500は余裕だったので、これもやらないで終了した。