画像のサムネイルが多いため、CPU の負荷が高い Web サイトを実行しています。
これは私が現在やっている方法です:
- ユーザーがサーバーに画像をアップロード
- サーバーはコピーを保持し、Amazon S3 にイメージを保存します
- サムネイルが要求されると、サーバーはローカル コピーを使用してサムネイルを生成し、S3 に保存します。次に、S3 URL をクライアントに提供します
- 後続のリクエストは次のように最適化されます。サーバーは S3 URL を memcached にキャッシュするため、再度作業を行うことはありません。ファイルが存在する場合、サーバーは二度とサムネイルを生成しません。サーバーは中サイズのサムネイルを使用して小さなサイズのサムネイルを生成するため、必要のない大きなファイルを操作しないでください。
現在、私は Linode 4G インスタンス (4x 優先度の 8 コア、4GB RAM) でホストしており、最適化と 70% の memcached ヒット率にもかかわらず、私の平均 CPU は 170% です。8 つの CPU すべてが同時に動作し、それらの多くで 100% のスパイクが頻繁に発生するのを常に確認しています。
Django アプリケーションを提供するために nginx と gunicorn を使用しています。サムネイルは PIL で生成されます。
このアーキテクチャを改善するにはどうすればよいですか?
私はいくつかの可能性について考えていました:
#1。最も簡単な方法: 前にロード バランサーを備えた 2 番目の同一のサーバーを追加して、負荷を共有します。
これに関する問題は、2 つのサーバーがローカル イメージ キャッシュを共有しないことです。そのような共有をネットワークドライブに配置することでこれを解決できますか?それとも、遅延が最終的に利益を妨げますか?
#2。少し難しい: 2 番目のサーバーで実行される別の Web サービスとして、アプリからサムネイル コードを分割します。この方法では、メイン アプリケーションとデータベースが高い CPU 使用率に悩まされることはなく、Web ページは高速に処理されます。いずれにせよ、サムネイルはすでに JavaScript で非同期に提供されています
他のソリューションを推奨できる人はいますか?