Apache
私は、、、などのサービスMysql
やRedis
アプリを実行するウェブサーバーを持っていますNodeJS
。トラフィックが多いときには、サーバーが高負荷をサポートできないようです。この問題が発生すると、ページにアクセスしようとすると、 から次のメッセージを受け取ることがよくありますmysql
。
Warning: mysqli_connect(): (HY000/2003): Can't connect to MySQL server on '127.0.0.1' (99)
このメッセージは断続的に表示されますが、ほとんどの場合、ページを更新するとこのメッセージは再び表示されません。また、mysqltuner.pl から常に次の結果が得られるため、これは mysql の構成の問題ではないと思います。
[OK] Highest usage of available connections: 74% (336/450)
同様に、Redis サーバーはサーバーへの接続に問題があることを示すメッセージを表示します。
Could not connect to Redis at 127.0.0.1:6379
その間サーバーを監視していたところ、Mysql、Redis、NodeJS のプロセスに SWAP バイトを使用しないで約 2G の RAM が必要であることがわかりました。しばらく調査した後 (追跡すべき北がないまま)、Ephemearal Ports について読みました。そこで、パラメーターを調整して net.ipv4.ip_local_port_range
ポート範囲を拡大してみました (から に調整32768 61000
) 10000 65000
。結果はひどいものでした。Web サーバーの応答時間が平均 180 ~ 200 ミリ秒から約 6000 ミリ秒に増加し、サーバーの負荷平均も大幅に増加しました (ただし、エラー メッセージは消えます)。
私の NodeJS アプリ (すべて) は Socket.io を使用しており、サーバー上の別のポートから応答します。この問題の解決策を見つけようとしています。これはポートの可用性の問題ですか? net.ipv4.ip_local_port_range パラメータの調整によってサーバーの速度が低下するのはなぜですか?
サーバー構成:
- Ubuntu サーバー x64
- インテル Xeon E5520 クアッドコア
- 8GBのRAM
- 2x 1000 GB SATA 2.5" 5.400 rpm (RAID 1)
- 2x 60 GB SSD 2.5インチ (RAID1) (データベース関連のものはすべてここに保存されます)
答え1
ピーク時にサーバーを最適に監視する方法に関する質問の場合、ピーク時には監視が難しいため、監視に役立つ軽量ツールを探すことをお勧めします。 トップ、PS、DFいつもカットするわけではありません。
私は使ったことがある収集するパーティション、メモリ、CPU、Apache、MySQLなどのデータポイントをキャプチャします。データをキャプチャしてデータポイントを保存します。その後、データを取得するには別のツールが必要になります。たとえば、データを表示するためのウェブフロントエンド。
次に、トラブルシューティングを行うには、サーバーにアクセスして使用率の高いシナリオを作成するツールが必要になるかもしれません。Apache Benchmark (ab) または Siege は、この目的に適したツールです。