PHPの高い同時実行性を効果的に管理する方法:パフォーマンステストと最適化戦略

PHP の高同時性とは何ですか?

アプリケーションの開発やデプロイ時に、高い同時実行性の問題がしばしば発生します。課題たとえば、インターフェイスの応答タイムアウト、CPU負荷の上昇、頻繁なGC、デッドロック、大規模なデータストレージなど。例:淘宝網のダブル11、数十万の要求毎秒スパイクシステム、注文の数千万の毎日の注文システム、情報フローシステムの毎日の活動の数百万の毎日。

图片[1]-如何有效管理PHP高并发:性能测试与优化策略-光子波动网 | 专业WordPress修复服务,全球范围,快速响应

高度な同時処理フロー:

  • 性能試験
  • サーバー拡張
  • 監視システム
  • 例外処理

I. パフォーマンステスト

高荷重下での試験システムの性能を理解することで発見潜在的なボトルネックや問題を採用可能ストレステスト歌で応える性能試験方法論以下は、システム性能評価のために多数の同時ユーザーアクセスをシミュレートするための手順とツールです:

1.テスト目的と測定基準の定義

  • パフォーマンス指標レスポンス・タイム、スループット(リクエスト/秒)、同時ユーザー数、リソース使用量(CPU、メモリ、ディスク、ネットワーク)など、測定したいパフォーマンス・メトリクスを決定します。
  • テストシナリオすべての主要な機能がカバーされていることを確認するために、特定のユーザー行動とインタラクションパターンを定義します。

2. 適切なストレステストツールの選択

  • JMeterApache JMeterは、静的および動的リソース、Web動的アプリケーションのパフォーマンスをテストするために使用できます。サーバ、サーバグループ、ネットワーク、またはオブジェクトにかかる高負荷をシミュレートし、それらの強度をテストしたり、異なる負荷タイプの下での全体的なパフォーマンスを分析するために使用できます。
  • ガトリングGatlingは、詳細なレポートと書きやすいスクリプトを提供する、もう1つの高性能負荷テストツールです。
  • ロードランナーLoadRunner は、より複雑なテストニーズに対応する商用ソフトウェアで、広範なモニタリングおよび分析機能を提供します。
  • イナゴ: LocustはPythonで書かれた軽量な負荷テストツールで、拡張やカスタマイズが簡単です。
图片[2]-如何有效管理PHP高并发:性能测试与优化策略-光子波动网 | 专业WordPress修复服务,全球范围,快速响应

3. テストスクリプトとシナリオの構築

  • 定義されたユーザー行動パターンに基づいてテストスクリプトを記述します。これらのスクリプトは、ログイン、ページの閲覧、フォームの送信など、実際のユーザーのさまざまな行動をシミュレートする必要があります。
  • 並行性の高い環境をシミュレートするために、同時ユーザー数とリクエストの頻度を設定します。

にはイナゴ一例として

from locust import HttpUser, between, task


class WebsiteUser(HttpUser).
    wait_time = between(5, 15)

    def on_start(self).
        self.client.post("/login", {
            "username": "test_user", "password": "", "password": "test_user", {
            「パスワード": ""
        })

    タスク
    def index(self).
        self.client.get("/")
        self.client.get("/static/assets.js")

    タスク
    def about(self).
        self.client.get("/about/")

4. テストの実行とシステムパフォーマンスの監視

  • テスト環境でストレステストを実施します。正確な結果を得るために、テスト環境が本番環境と可能な限り類似していることを確認してください。
  • CPU、メモリ、ネットワークIOなど、アプリケーションとサーバーのパフォーマンス・メトリクスをリアルタイムで監視します。

5. 試験結果の分析

  • テスト中に収集したデータを詳細に分析し、パフォーマンスのボトルネックや障害箇所を特定します。
  • 応答時間、エラー率、システム・リソースの使用状況を見て、システムのパフォーマンスが低下している箇所を特定します。

6. 最適化と調整

  • テスト結果に基づくアプリケーションとインフラの最適化。可能な最適化には、コードの最適化、データベースの最適化、サーバーリソースの増加などがあります。
  • テストを繰り返して最適化を検証し、加えた変更が実際にシステム・パフォーマンスを向上させていることを確認します。

7. ドキュメンテーションと継続的テスト

  • テスト結果と最適化を文書化し、パフォーマンスベンチマークを確立します。
  • 継続的インテグレーション/継続的デプロイメント(CI/CD)プロセスにパフォーマンス・テストを組み込むことで、時間の経過や機能の追加に伴ってシステムが優れたパフォーマンスを維持できるようになります。

このようにして、同時並行性の高い条件下でのユーザーアクセスを効果的にシミュレートし、システムをテストして最適化することで、実際の運用環境で優れたパフォーマンスを発揮できるようになります。

图片[3]-如何有效管理PHP高并发:性能测试与优化策略-光子波动网 | 专业WordPress修复服务,全球范围,快速响应

サーバーの拡張

パフォーマンステストの結果、サーバーが並行性の高い要求を処理できないことが判明した場合は、サーバーの拡張を検討してください。CPUやメモリなどのリソースを追加するなど、サーバーのハードウェア構成を増やすことができます。パフォーマンスを向上させるためにサーバーを追加することで、負荷分散を実現することもできます。

III.監視システム

アプリケーションをデプロイした後、サーバのパフォーマンスをリアルタイムで監視するために、監視システムをセットアップする必要があります。監視システムは、サーバの負荷、応答時間、エラー率、およびその他のメトリクスに関するリアルタイムのデータを提供し、開発者がパフォーマンスの問題をタイムリーに特定し、解決するのに役立ちます。

IV.例外処理

並行性の高い環境では、さまざまな例外が頻繁に発生する可能性があります。開発者は、例外をタイムリーに処理するコードを書く必要があります。即座に解決できない例外については、劣化処理やメルトダウンなどのフォールト・トレラ ンス・メカニズムを使用して、システムの安定性を確保することができます。以下はその一部です。高い同時実行性への対応方法論の参考文献:

  • キャッシュの使用キャッシュはパフォーマンスを向上させる最も重要なツールの1つです。メモリキャッシュ、データベースキャッシュ、分散キャッシュなど、さまざまなタイプのキャッシュを使用して、よく使用されるデータやページを保存することができます。データベースへのアクセスを減らすことで、サーバーの負担を大幅に軽減し、レスポンスタイムを改善することができます。
  • アプリケーションサーバーとデータベースの拡張HAProxyやAWS ELBを使うなどして)サーバーを増やし、ロードバランシングを使ってリクエストを分散させることで、アプリケーションの高い並行処理能力を大幅に向上させることができます。データベースクエリを最適化し、より効率的なインデックスを使用するか、マスタースレーブレプリケーションのような、より読み書きの少ない操作に適したデータベースアーキテクチャの使用を検討します。場合によっては、ライブラリとテーブルを分割することも、データベースの処理能力を向上させる効果的な戦略となります。
  • 非同期処理アプリケーションに時間のかかる処理がある場合は、非同期処理を使って並行性を向上させることを検討してください。時間のかかる処理をメッセージキューやバックグラウンドタスクに入れて処理し、ユーザーに高速なレスポンスを返します。
图片[4]-如何有效管理PHP高并发:性能测试与优化策略-光子波动网 | 专业WordPress修复服务,全球范围,快速响应

の使用もあります。ファイル除外ロックウェイ

  • 妨害モードあるプロセスがファイルに対する排他ロックを取得し、そのロックを他のプロセスが占有している場合、そのプロセスはハングし、他のプロセスがロックを解放するのを待ちます。例
set(array(
 'reactor_num' => 2, //リアクターのスレッド数
 'worker_num' => 4 //ワーカープロセス番号
));

 $uniqid = uniqid('uid-', TRUE);
 $redis = new Redis();
 $redis->connect('127.0.0.1', 6379);
 $fp = fopen("lock.txt", "w+");
 排他ロック(書き込み手順)を取得するための // ブロッキング(待機)モード
 if (flock($fp,LOCK_EX)) { // 現在のポインタをロック。
 // ロックがかかると、安心してオーダーを処理できます。
 $rest_count = intval($redis->get("rest_count"));
 $value = "{$rest_count}-{$uniqid}";
 if ($rest_count > 0) { // 何かをする ...
 // 何かをする ...
 $rand = rand(100, 1000000);
 $sum = 0; $sum = 0; $sum = 0; $sum = 0
 for ($i = 0; $i lPush('uniqids', $value);
 $redis->decr('rest_count');
 }
 // 注文が処理された後、ロックを解放します。
 flock($fp, LOCK_UN);
 }
 fclose($fp); }.
});
$http->start();

アブテストを使ってください:

$ ab -t 20 -c 10 http://192.168.1.104:9510/
  • ノンブロッキングモード他のプロセスがロックの占有中にプロセスがファイルの排他ロックを取得した場合、そのプロセスは即座にロックの取得に失敗したと判断し、実行を続行します。コード例
set(array(
 'reactor_num' => 2, //リアクターのスレッド番号
 'worker_num' => 4 //ワーカープロセス番号
));

 $uniqid = uniqid('uid-', TRUE);
 $redis = new Redis();
 $redis->connect('127.0.0.1', 6379);
 $fp = fopen("lock.txt", "w+");
 // ロック時にflock()をブロックさせたくない場合は、ロックにLOCK_NBを付けてください。
 if(flock($fp,LOCK_EX | LOCK_NB)) // 現在のポインタをロック。
 {
 // ロックの取得に成功したら、自信を持ってオーダーを処理
 $rest_count = intval($redis->get("rest_count"));
 $value = "{$rest_count}-{$uniqid}";
 if($rest_count > 0){
 // 何かをする ...
 $rand = rand(100, 1000000);
 $sum=0.
 for ($i=0;$ilPush('uniqids', $value);
 $redis->decr('rest_count');
 }
 // 注文が処理された後、ロックを解放します。
 flock($fp,LOCK_UN);
 } else {
 // ロックの取得に失敗したら、ここですぐに実行します。
 echo "{$uniqid} - system busy, please try again later".PHP_EOL; } else { // ロック取得に失敗したら、すぐにここに移動します。
 }
 fclose($fp); }.
});
$http->start();

概要

キャッシング、ロードバランシング、非同期処理、データベースの最適化などを合理的に利用することで、システムの同時実行性とパフォーマンスを向上させることができます。 また、パフォーマンステスト、サーバーの拡張、監視システム、例外処理などの運用手順により、同時実行性が高い状況でもシステムを安定的に運用することができます。


お問い合わせ
記事が読めない?無料でお答えします!個人サイト、中小企業サイトのための無料ヘルプ!
電話:020-2206-9892
QQ咨询:1025174874
Eメール:info@361sale.com
勤務時間: 月~金、9:30~18:30、祝日休み
© 複製に関する声明
この記事を書いた人: Xiesong
終わり
好きなら応援してください。
クドス0 分かち合う
xiesong的头像-光子波动网 | 专业WordPress修复服务,全球范围,快速响应
解説 ソファ購入

コメントを投稿するにはログインしてください

    コメントなし