質問のタイトルが示すように、許容可能なパフォーマンスを達成するために、アプリケーションで何を改善できるか(または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 4950 4948 2
FRAG 0 0 0
これは、timewaitで多くの閉じられた接続を持っていることを示しています。最大オープンファイルを999999に増やしました。ulimit-aの出力は次のとおりです。
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 63724
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 999999
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 63724
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
だから私は問題がいくつかの理由で利用可能なポート/ソケットを飽和させるhttpトラフィックにあると考えましたが、1つは意味がありません:なぜワーカーを再起動し、すべてのクライアントが数秒以内に再接続するのか、ワーカーのCPUの負荷は1%に低下し、約1時間後に(ピーク時に)飽和するまで要求を適切に処理できますか?
私は主にシステム管理者ではなくjavascriptプログラマーなので、サーバーでどの程度の負荷を処理する必要があるかわかりませんが、確かに期待どおりに動作していません。それ以外の場合、アプリケーションは安定しており、この最後の問題により、準備が整ったモバイルバージョンのアプリを出荷できません。明らかに、より多くの負荷がかかり、最終的にすべてがクラッシュします。
うまくいけば、私が間違っていることは明らかであり、誰かがそれを見つけるのに役立ちます...詳細についてはお気軽にお尋ねください、質問の長さは申し訳ありませんが、私は信じていました...前もって感謝します!
top
CPU使用率が100%に近い場合、何を見ますか?