node.js、mongodb、redis、本番環境でのubuntuのパフォーマンス低下、RAMは無料、CPU 100%
質問のタイトルが示すように、許容可能なパフォーマンスを達成するために、アプリケーションで何を改善できるか(またはos、ubuntuで調整できるか)を理解するのは困難です。ただし、最初にアーキテクチャについて説明します。 フロントエンドサーバーは、Ubuntu 12.04を実行する8ギガバイトのRAMを備えた8コアマシンです。アプリケーションは完全にjavascriptで記述され、node.js v 0.8.22で実行されます(一部のモジュールはノードの新しいバージョンで不満があるようです)。nginx1.4を使用して、ポート80および443から管理される8つのノードワーカーにHTTPトラフィックをプロキシしますノードクラスターAPIの使用を開始しました。socket.io 0.9.14の最新バージョンを使用して、WebSocket接続を処理します。WebSocketでは、利用可能なトランスポートとしてwebsocketとxhr-pollingのみを有効にしました。このマシンでは、Redis(2.2)のインスタンスも実行します 4ギガのRAMと2つのコアを備えたmongodb(3.6)の2番目のサーバーに永続的なデータ(ユーザーやスコアなど)を保存します。 このアプリは数か月間運用されており(数週間前まで1つのボックスで実行されていました)、1日あたり約18,000人のユーザーによって使用されています。これは、パフォーマンスの低下という主要な問題を除いて、常に非常にうまく機能しています。使用すると、各プロセスで使用されるCPUの量は、ワーカーが安定化するまで増加します(ワーカーは要求を処理しなくなります)。私は一時的に各ワーカーが使用しているCPUを1分ごとにチェックし、98%に達したら再起動します。したがって、ここでの問題は主にCPUであり、RAMではありません。socket.io 0.9.14(以前のバージョンではメモリリークが発生していました)に更新したため、RAMはもう問題ではないので、特にCPUが急速に成長するため、メモリリークの問題であるとは思えません(各ワーカーを1日に10〜12回再起動する必要があります!)。使用中のRAMも同様に大きくなり、しかし、非常にゆっくりと、使用の2〜3日ごとに1ギガ、そして奇妙なことは、アプリケーション全体を完全に再起動してもリリースされないことです。サーバーを再起動した場合にのみリリースされます!これは本当に理解できない... 私は驚くべきnodeflyを発見したので、ようやく本番サーバーで何が起こっているのかを見ることができ、数日からデータを収集しています。誰かがチャートを見たいなら、私はあなたにアクセスを与えることができますが、基本的に私は80から200の同時接続を持っていることがわかります!node.jsが数百のリクエストではなく、数千のリクエストを処理することを期待していました。また、HTTPトラフィックの平均応答時間は500〜1500ミリ秒の間で変動しますが、これは非常に大きいと思います。また、1300人のユーザーがオンラインになっているこの瞬間に、これは「ss -s」の出力です。 Total: 5013 (kernel 5533) TCP: 8047 (estab 4788, closed 3097, orphaned 139, synrecv 0, timewait 3097/0), ports 0 Transport Total IP IPv6 * 5533 - - RAW 0 0 0 UDP 0 0 0 TCP 4950 4948 2 INET …