Django をホスティングするサーバーの性能

記事
IT・テクノロジー

Django をホスティングするサーバーの性能

通常の一般的な Web サイトをホスティングする場合、サーバー側の負荷は比較的軽い場合が多く、通常の Web ホスティングでは余り高性能のサーバーを利用するケースは少なくなっています。 Django を利用したアプリを考えた場合、サーバー側でデータ処理をする機会も多くホスティングをする際のサーバーの性能も気になるところです。この記事では、Web ホスティングをするサーバーの性能についてポイントをまとめてみました。

一般的な Web ホスティングの処理
まず最初に一般的な Web ホスティングの処理を考えてみます。 一般的な Web サイトのホスティングで必要な処理は、HTTP のリクエストの処理です。 Web ブラウザからの HTTP リクエストを受けて必要なページの情報を返送するというのが主な処理です。 特にバックエンドの処理がない場合は、一つの処理に要する時間は、せいぜいミリ秒程度の時間です。従って余程処理が集中しない限りサーバーには余り負荷がかかりません。

多くの、低価格の Web ホスティングでは、サーバーとして仮想マシーンを割り当てて、最小限の CPU とメモリを割り当ててサービスを提供するケースが多くなっています。基本的に、HTML や CSS などのファイルや、ページに貼り付けてある画像情報などを送るだけなので、余り CPU に負荷がかかる処理はありません。

ブログなどのサービスでバックエンドでデータベースを動かす場合は、データベースの処理が入ってくるので多少 CPU の処理も必要になりますが、通常はシンプルなテーブル構成とクエリなので大きな負荷になることも少なく、大量のデータの書き込みなどが発生しないので、多くの場合は、高性能のサーバーは必要ありません。

React や Vue のアプリは?
React や Vue などのフロントエンドのフレームワークを利用して作成したアプリの場合も、通常の Web サイトとほぼ同じです。理由はシンプルで、Web サーバーの役割は「プログラムを実行することではない」からです。Web サーバーは必要な Javascript のファイルをフロントエンド(Web ブラウザ)に渡すだけなので殆ど実際の処理は行わないからです。

実際に処理を行うのは、Web ブラウザなので、Web サイトの利用者の PC や端末(スマホやタブレット)という事になります。

従って、この場合も余りサーバーの性能を意識する必要がないと言えます。

通常の Web サイトにしても、React や Vue のアプリの場合は、アクセスがどの程度集中するかがポイントになります。短時間に余程たくさんの人がサイトをアクセスする状態でない限り高性能のサーバーは必要ありません。

バックエンドの処理をする場合
ところがバックエンドの処理を始めると話が変わってきます。 バックエンドのサービスは基本的にホスティングしているサーバーで動くので処理の内容によってはサーバー側に大きな負荷がかかる事になります。ページのレンダリングだけの場合はまだ限定的ですが、サーバー側でいろいろなデータの処理を始めるとサーバーの負荷は急速に大きくなります。

React や Vue のように処理を Web ブラウザー側で行う場合は、処理の負荷が分散するので一度にアクセスがある程度集中しても、サーバーの負荷は限定的です。しかし、バックエンドの処理は全てサーバー側で処理する必要があるので、処理が少し集中するだけでもサーバーの負荷が高くなります。

サーバーの性能を決めるのが難しい理由
サーバーの性能を決めるのは意外に難しい事です。 これは Web ホスティングの性能は、実際のサーバーの負荷の評価が難しいからです。 特に、ポイントになるのは「瞬間的な負荷」です。全体のアクセス数が多くてもアクセスがある程度分散している場合、サーバーの負荷が瞬間的に大きくなるケースは少なくなります。しかし、全体のアクセス数自体は少なくてもアクセスが集中するとサーバーの性能を超えた処理が発生する可能性が高くなるからです。

大きな企業の大きなプロジェクトの場合は、実際の運用に近いアクセスパーターンでの試験も行える場合が多いですが、個人的な開発案件では現実的にはこうしたテストは難しくなります。

ほとんどの場合、開発者が行う基本的な機能テストというケースが殆どです。この場合、多くの場合同時アクセスは1件だけだったり、多くても数件のみという事になります。

今回 Django のフレームワークについて幾つか記事を書いていますが、もともと Django を利用するきっかけは、Python で機械学習の機能を使ったアプリを提供するのが目的でした。この案件では、複数のファイルから数万から数十万件のデータをデータベースに入れて、さらにそのデータを使った解析作業をするという非常に負荷の高い処理が動きます。

データ量が膨大なので、データをデータベースに書き込むだけでも、かなりの時間がかかります。複数のテーブルに複雑な依存関係があるデータを書いていますので、1件のデータ解析の為のアクセスでもデータを一つずつ書き込むと数十分かかります。現在まだ開発中なので、まだ処理の最適化などは行っていませんが、サーバーの処理は非常に大きなものになっています。

当初、CPU を2つ割り当てて動作させていましたが、データをデータベースに書き込むだけで、2つの CPU の使用率は、ほぼ 100%の状態が続く感じでした。CPU の割り当てを 8 個にすると、100%に張り付く状態は発生しなくなりましたが、処理時間は数分以上かかっています。このシステムの場合、同時に利用するユーザーは数人程度というサービスなのでもう少し調整すれば大丈夫そうですが、これが一般的にインターネットに公開されるサービスの場合には大きな問題になります。

また、使用するメモリ容量もこのサービスの場合1件あたり3〜4 GB のメモリを少なくても数分間は占有するので、アクセスする人数が増えると膨大なメモリが必要になります。

このサービスで利用するサーバーは現在予定しているものは、36CPU(72 スレッド)で、メモリは 512GB という高性能のサーバーを割り当てることになっています。通常のサービスで提供されているサーバーではちょっと対応するのが厳しい性能です。

まとめ
この記事では、Web アプリや Web サービスをホスティングするサーバーの性能についてポイントをまとめてみました。通常の Web サイトやフロントエンド中心のアプリやサービスの場合は余り意識する必要はありませんが、サーバー側でレンダリング以外にデーター処理をする場合などは、必要なサーバーの性能が非常に高いものになってしまう可能性もあります。

実際の利用者の数やアクセスの集中などを考慮して性能を決める必要があります。ちょっとしたデータ処理でも利用が集中すると十分なサービスを提供するのは意外に難しいものです。

また、本題とは少し違った話になりますが、フロントエンド中心の React や Vue のサービスでも、開発用の環境は十分なメモリや CPU の性能の PC で開発する場合が多いので問題を見落としがちですが、利用者の PC や端末が開発用の PC のような高性能の物ではない場合も多いので、利用者の環境を考えて開発する必要があります。 React などでは、Redux を使ってページ間でデータを共有する場合も多いと思いますが、こうしたデータはたくさんのメモリを消費します。プログラムを開発するサイドではデータが REDUX にあるのは便利ですが、利用者の事を考えると、REDUX で利用するデータは必要最小にしたほうが利用者に優しい設計になります。

サーバーの性能もそうですが、作成するサービスの利用形態をよく理解して、利用者に使いやすく便利なサービスにすることが重要です。
サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す