web-dev-qa-db-ja.com

「エントリプロセス」の制限の原因を調べる方法

このサイトでは、OpenCart 1.5.5.1カスタムテーマを使用しています。

順調に航海できず、次々と問題に直面しています。これまでの要点は、現在、サイト(uniqpcs.co.uk)のパフォーマンスをテストするためにビジネスSSDホスト(まだ共有していると思います)を使用していることです。サイト(負荷の影響を使用)。すべてのインスタンスで、テストを実行すると、エントリプロセスの制限に達し、サイトが応答しなくなり、最終的にクラッシュするように思われます(cPanelでエントリプロセスの制限は20に設定されます-40を試しましたが、それでも同じ問題です)。

ホストプロバイダー(NameCheap)とメールやライブチャットを介してやり取りしているのに、残念ながら何の助けもありませんでしたが、残念なことに、いくつかのことがわかりました。

私が理解していることから、プロセス(ほとんどの場合PHPスクリプト)が予想よりはるかに長くハングすると、Entry Process制限に達し、遅延によりますます多くのプロセスが蓄積されるため、サイトが応答しなくなり、最終的にその限界に達します。

MySQLエラーログから、データベースは126のテーブルと合計26791行で「明らかに」最適化されていないことがわかり、大量の行のために処理が長すぎるMySQLのSELECTクエリがあると述べました。

以下のMySQLサーバーログを見つけてください。

# Time: 140501  8:37:23
# User@Host: auniqpcs_uniqpc[auniqpcs_uniqpc] @ localhost []
# Query_time: 12.059221  Lock_time: 0.004748 Rows_sent: 1 Rows_examined: 26731
SET timestamp=1398947843;
SELECT COUNT(DISTINCT p.product_id) AS total FROM category_path cp LEFT JOIN product_to_category p2c ON (cp.category_id = p2c.category_id) LEFT JOIN product p ON (p2c.product_id = p.product_id) LEFT JOIN product_description pd ON (p.product_id = pd.product_id) LEFT JOIN product_to_store p2s ON (p.product_id = p2s.product_id) WHERE pd.language_id = '1' AND p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '0' AND cp.path_id = '211';

# User@Host: auniqpcs_uniqpc[auniqpcs_uniqpc] @ localhost []
# Query_time: 12.081561  Lock_time: 0.004338 Rows_sent: 1 Rows_examined: 26746
SET timestamp=1398947843;
SELECT COUNT(DISTINCT p.product_id) AS total FROM category_path cp LEFT JOIN product_to_category p2c ON (cp.category_id = p2c.category_id) LEFT JOIN product p ON (p2c.product_id = p.product_id) LEFT JOIN product_description pd ON (p.product_id = pd.product_id) LEFT JOIN product_to_store p2s ON (p.product_id = p2s.product_id) WHERE pd.language_id = '1' AND p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '0' AND cp.path_id = '258';
# Time: 140501  8:37:26

# User@Host: auniqpcs_uniqpc[auniqpcs_uniqpc] @ localhost []
# Query_time: 13.821338  Lock_time: 0.005288 Rows_sent: 1 Rows_examined: 26746
SET timestamp=1398947846;
SELECT COUNT(DISTINCT p.product_id) AS total FROM category_path cp LEFT JOIN product_to_category p2c ON (cp.category_id = p2c.category_id) LEFT JOIN product p ON (p2c.product_id = p.product_id) LEFT JOIN product_description pd ON (p.product_id = pd.product_id) LEFT JOIN product_to_store p2s ON (p.product_id = p2s.product_id) WHERE pd.language_id = '1' AND p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '0' AND cp.path_id = '245';
# Time: 140501  8:37:32

# User@Host: auniqpcs_uniqpc[auniqpcs_uniqpc] @ localhost []
# Query_time: 16.426658  Lock_time: 0.010242 Rows_sent: 1 Rows_examined: 26746
SET timestamp=1398947852;
SELECT COUNT(DISTINCT p.product_id) AS total FROM category_path cp LEFT JOIN product_to_category p2c ON (cp.category_id = p2c.category_id) LEFT JOIN product p ON (p2c.product_id = p.product_id) LEFT JOIN product_description pd ON (p.product_id = pd.product_id) LEFT JOIN product_to_store p2s ON (p.product_id = p2s.product_id) WHERE pd.language_id = '1' AND p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '0' AND cp.path_id = '245'; 

処理中に、ロードツールは別のPHPリクエストを送信し、リクエストをMySQLに「渡す」(最初のSQLクエリがまだ処理されている間)。 MySQLを参照するPHPリクエストが不適切にコーディングされている可能性もあります。

pingdom: http://tools.pingdom.com/fpt/#!/bzzDid/uniqpcs.co.uk

この問題の正確な原因を知りたいのですが、PHPスクリプトのコーディングが間違っているのか、MySQLデータベースのクエリなのか、それともホストなのでしょうか。

今、私は何をすべきかわからない....アドバイスは大歓迎です。

2
abab

これによれば:

http://docs.cloudlinux.com/entry_processes_limit.html

エントリプロセスの制限は、ハッカーがサーバーの速度を低下させないように設計されています。

あなたがすべきことは、処理時間を詳しく調べることです。

Webpagetest.orgでテストを実行し、「最初のバイトまでの時間」の値を確認します。 1/5秒を超える場合、処理の問題であり、最初に検討する必要があるのは、Webページ自体に必要なコンポーネントと、データベースのどの部分からいつデータを必要とするかです。

そのため、外部スタイルシート、外部javascriptファイル、およびWebページ自体と同じサーバーを指すURLを持つ外部イメージ(特に大きな高品質のイメージ)をロードするWebページを実行している場合、さらにスローダウンする可能性があります。ユーザーあたりのリクエスト数がかなり急速に増加することが予想されます。

また、データベースを確認してください。常に実行されるコードが、行のライブカウントを取得するなど、最大のテーブルを持つ複雑なものを探すことで構成されている場合、アイテム要求ごとに200ミリ秒の余分な待ち時間が予想されます。頻繁に要求されるデータを別のテーブルに保存し、そこから読み取ることにより、これを修正してください。

例:

フィールド名が「名前」と「値」であるランダムな構成データを保存するCFGと呼ばれるテーブルと、1,000,000以上のレコードを含むABCと呼ばれるテーブルがあり、正確にいくつあるかはわかりません。

当然、実行できます:

Select count(*) as Total from ABC;

アイテムの数を取得し、Totalという名前の一時的な新しい列に結果を保存します。ペンティアム4で900,000件を超えるレコードを使用してテーブルでこれを行ったところ、カウントを受け取るのに約4秒かかりました。

この例で代わりに行うことは、次のように常に参照できる新しい構成値を追加することです。

Insert Into CFG(Name,Value) Values("tabletotal","0");
Update CFG set Value=(Select count(*) as Total from ABC) where CFG.Name="tabletotal";

次に、番号が追加されたことを確認するには、次のステートメントで構成テーブル全体を検索します。

Select * from CFG;

次に、スクリプトで、次のような例を使用した場合、変更します。

Select count(*) as Total from ABC;

に:

Select Value from CFG where Name="tabletotal";

その後、処理時間を大幅に節約し、エントリ処理制限に達する確率はかなり低くなります。

1
Mike

「私が理解したことから.....」

あんまり。確かに、リクエストが増えるとプロセスが増え、リクエストが長くなると並行プロセスが増えます。しかし、ビジネスモデルが処理能力を売って収益を上げることでない限り、それはサーバーの能力を管理するための出発点ではありません。

スタックが処理できる同時要求の数を正確に決定することは複雑な問題であり、cpanelで公開されるよりもはるかに深いシステムへのアクセスが必要になる問題です。ハードウェアの仕様の詳細は提供していませんが、低スペックのデスクトップ(2コア/ 2Gb)に匹敵するものが約70-130のリクエストを同時に処理できると期待していますが、これはコード。

現在の最大の問題はDBMSです。データセットは小さいですが、クエリの実行に非常に長い時間がかかります。データベースは非常に小さいので、おそらくssdを使用しても大きなメリットは得られません。データはallRAMに収まる必要があります。しかし、これらのクエリ時間は本当に恐ろしいものです。残念ながら、それに対する簡単な修正はありません。スキーマを分析および変更する方法を知る必要があります。

テスト用に専用のマシンをセットアップすることをお勧めします。完全な管理者アクセスを必要とせずに、ほとんどのデータベースの問題の原因を特定するのに十分なアクセス権が必要ですが、一部の修正にはこれが必要です。また、PHPおよびWebサーバーの問題の底に到達するには、rootアクセスが必要です。

あなたの前に多くの学習があります。特定の製品を推奨することはここでは眉をひそめているので、Linux、Apache、MySQL、およびPHPパフォーマンスチューニングに関する書籍については、Googleにお勧めします。

更新

私はあなたのサイトを見ました。フロントページには、DBMSの問題の症状が表示されません。上記で引用したログエントリは異常である可能性があります。ただし、いくつかの恐ろしいフロントエンドレンダリングの問題があります。特に、フロントページに400以上の画像があるという事実。

1
symcbean

私のWebブラウザーによると、1つのHTMLページだけでもHTMLで約35KBであり、本来よりも約15KB高くなっています。また、読み込まれた要素の数は458で、6.4MB以上のデータが必要でした。最大速度で56Kダイヤルアップ接続を使用する可能性のある貧しい人々は、メインページ全体が読み込まれるまで少なくとも19分待つ必要があります。

非常に役立つことの1つは、画像とスクリプトを統合することです。

CSSスプライトを調べます。これは、画像の読み込みを高速化する簡単な方法であり、サーバーのヒット頻度を減らして、全体的に高速化するという利点があります。

すべてのCSSスタイルを結合し、不要なスペースを削除し、より高速にするためにコメントを削除します。 20+ではなく、ページごとに1つのCSSファイルのみを使用してください。

Javascriptファイルでも同じことを行います。それらを1つに統合します。

サイトを読み込むと、他のすべてが読み込まれる前に読み込まれた背景画像に気付きました。私はそれに対する本当の利益を見ません、そして、それを取り除くことはサイトをより速くするのを助けるでしょう。

また、ヘッダーを調べに行ったときに、ヘッダーの出力が悪いことに気付きました。

HTTP/1.1 200 OK
Date: Mon, 02 Feb 2015 01:39:12 GMT
Server: Apache/2.2.27 (Unix) mod_ssl/2.2.27 OpenSSL/1.0.1e-fips mod_bwlimited/1.4
X-Powered-By: PHP/5.3.28
Pragma: no-cache
Nitro-Cache: Enabled
Cache-Control: public, max-age=31536000
Expires: Wed, 04 Mar 2015 01:39:12 GMT
Set-Cookie: PHPSESSID=c37c0a5a0d115149b494fae5cf5b1d78; path=/
Last-Modified: Sun, 01 Feb 2015 23:41:06 GMT
Vary: Accept-Encoding,User-Agent
Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
Pragma: no-cache
Content-Type: text/html; charset=utf-8

このようなヘッダーを使用すると、最新のコピーがローカルに保存されている場合でも、ブラウザーはおそらくページを再要求します。これを修正するには、次の行を削除する必要があります。

Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
Pragma: no-cache

コマンドラインツールCURLを使用してヘッダーを確認しました。

0
Mike