良い一日!
最近、私は顧客からの多かれ少なかれ単純な要求に応答する情報システムを構築することが可能な技術について、できるだけ迅速かつ確実に質問に興味を持ちました。
インターネットで少し検索した後、もちろん明確な答えが見つかりませんでしたので、自分でちょっとしたテストをすることにしました。
挑戦する
次のように問題を定式化しました。
- クライアントはいくつかのパラメーターを使用してサーバーにリクエストを送信する必要があります
- サーバーはパラメータをデータベースに配置する必要があります
- サーバーはデータベースIDを吐き出す必要があります
- クライアントは新しいTCPセッションを開始し、作成済みのレコードを要求する必要があります
- その後、サーバーはトランザクションが完了したことをマークします。
テスト
当初は、多数のオプションをテストする予定でした。つまり、
c ++セルフサーバー
nginx + php
nginx +自作モジュール
Apache + php
Apache +自作モジュール
.NETに独自のもの
しかし、他の自尊心のあるシステム管理者と同様に、私は怠け者になり、
nginx + phpと
apache + phpに制限されました。残りの実験を後で行うことを望んでいます
データベースとして、MySQLを使用しました。
ベース
表では、3つのコントロールポイントを作成しました。
1.レコード作成時間(ミリ秒単位の精度)
2.トランザクション終了時間(ミリ秒単位の精度)
3.レコード作成時間(秒単位の精度)
1秒間に作成されるレコードの数を理解するには、3つのコントロールポイントが必要です。
合計ベースは次のようになりました。
create table clients (id int not null auto_increment, amount double not null, hash char(32), Primary key (id)); alter table clients add cr_time char(100); alter table clients add ps_time char(100); alter table clients add column sec_time TIMESTAMP default NOW();
インフラ
サーバーとして、私が手元に置いたものは、Atomプロセッサ、2コア、4スレッド、10個のubuntuがインストールされた、最後の熱望の1つでした。
root@aspire-1-laptop:/etc
これは、ホームルーター(キャニオン、約40ドルのモデル、2年前)、100メガバイトの接続、ワイヤーに接続されています。
負荷を作成するためのボットとして、次のマシンを使用しました。
同じルーター内のワイヤーで接続されたコアデュオ(1つの古いデル、もう1つの古い富士通)を備えた2つのラップトップ
同じルーター内で、Wi-Fi経由で接続されたi5(新しいdell)を備えたラップトップブナ1台。
すべての設定は、最初の
Googleリンクの指示に基づいて行われたため、特定の最適化の問題はありません。
ボット
Windows 7はすべてのラップトップにインストールされていたので、c#でボットを構築する最も簡単なオプションであるように思われました。
主なボットコードは次のとおりです。
public void beginTransaction() { while (true) { string response = this.createRecord(); string id = response.Substring(0, response.IndexOf('|')); string final = this.updateRequest(id); StringReader strReader = new StringReader(response); StringReader strReader2 = new StringReader(final); } } public void start() { for (int i = 0; i < int.Parse(this.textBox1.Text); i++) { this.richTextBox2.BeginInvoke((MethodInvoker)(() => this.richTextBox2.AppendText("thread started \n"))); Thread oThread = new Thread(new ThreadStart(beginTransaction)); oThread.Start(); while (!oThread.IsAlive) ; } }
Webパーツ
実際に必要なことをすべて実行する小さなPHPスクリプトは、次のように実装しました。
<?php error_reporting(E_ALL); ini_set("display_errors", 1); mysql_pconnect('localhost','root','qwerty') or die(mysql_error()); mysql_select_db('test') or die(mysql_error()); if (isset($_REQUEST['id'])){ if (trim($_REQUEST['id'])!=''){
スクリプトとボットの微妙さはそれほどおもしろくないので、それらに集中するべきではないと思います。特に好奇心mind盛な人は、すべてを難なく理解するでしょう。
したがって、すぐにテスト結果から始めます。
結果
テストは絶対に客観的ではないことを理解し、そのようなことはデスクトップubuntで行われないという事実から始まり、通常のスイッチを使用する必要があるという事実で終わり、私はまだ異なる結果を期待していました。 私が見たものは非常に驚いた。 すなわち:
nginx
タイプリクエスト:
select count(*) from clients group by sec_time order by sec_time desc limit 0,20;
彼は、処理されたセッションの平均数:
205個 、平均時間:0.025秒であることを示しました。
(以降のセッションでは、最初の要求からレコードを作成してから、ストリームからの2番目の要求でレコードを更新するまでの時間を呼び出します)。
| 205 | | 200 | | 202 | | 208 |
| 155930 | 0 | K | 0.36527600 1339369721 | 0.38711300 1339369721 | 2012-06-11 02:08:41 |
| 155929 | 0 | K | 0.36156500 1339369721 | 0.38884600 1339369721 | 2012-06-11 02:08:41 |
Ubuntaは、すべてのコアが約80%均一にロードされ、ubuntのトラフィックが毎秒400 kbの速度で進み、ラップトップの1つがオフになっても状況がまったく変わらないことを示したため、仮説を立てましたルーターの速度が低下します。
アパッチ
同じリクエストで、次の写真を観察しました。
| 255 |
| 247 |
| 257 |
| 190582 | 0.102561082738713 | G | 0.46013900 1339370133 | 0.48647400 1339370133 | 2012-06-11 02:15:33 |
| 190581 | 0.266181369901719 | W | 0.45496900 1339370133 | 0.47832300 1339370133 | 2012-06-11 02:15:33 |
これは、1秒間に処理されるリクエストの数が約
255であり、nginxを超えていることを意味し、1つのリクエストの処理時間は増加せず、0.025秒に等しいままでした。
他のすべての仕様は同じままです。
裸の結論
正直なところ、これから結論を引き出すことは困難です。なぜなら、 Apacheはnginxよりも高速だとは思わない。 おそらく、nginxのブレーキはfastcgiを使用する必要性と関連しており、phpでより適切に動作するように設定する方法がありますが、すぐにそれを行う方法が見つかりませんでした。実験は主観的なパラメーターのために値をまったく表さない)、またはその結果をそのまま受け入れます。
とにかく、遠隔時間をありがとう:)
PS古典を思い出す:nginx、さあ、さようなら。