1

64G RAM のサーバーがあり、csv ファイル内の 100 万個のデータをデータベースと比較するスクリプトを実行しています。一致が見つかった場合、スクリプトは実行の最後に一致の数を出力します。

スクリプトを実行すると、完了するまでに 3 分かかります。50,000、1 lakh、3 lakh、5 lakh のデータ ファイルでもテストされ、パフォーマンス レートまたはスクリプトが実行されるレートは比例します。サーバーには十分な空きメモリがあります。スクリプト実行時の mongostat 出力を以下に貼り付けます。私の質問は、スクリプトが毎秒 5000 近くのクエリを実行していると思います。多くの投稿で、1 秒あたり平均 50K のクエリを取得していることを読みました。これはどのように達成できますか?私のサーバーは Ubuntu、64 ビット、および 24 コアを実行しています。

insert  query update delete getmore command flushes mapped  vsize res faults            locked db idx miss %     qr|qw   ar|aw  netIn netOut  conn       time
    *0   3885     *0     *0       0     1|0       0    12g  24.2g 64m      0 db_list_restore:0.0%          0       0|0     1|0 380k   142k     2   03:09:26
    *0   4188     *0     *0       0     1|0       0    12g  24.2g 68m      0 db_list_restore:0.0%          0       0|0     0|0 410k   153k     2   03:09:27
    *0   4462     *0     *0       0     1|0       0    12g  24.2g 72m      0 db_list_restore:0.0%          0       0|0     0|0 440k   163k     2   03:09:28
    *0   4401     *0     *0       0     1|0       0    12g  24.2g 76m      0 db_list_restore:0.0%          0       0|0     0|0 435k   161k     2   03:09:29
    *0   4368     *0     *0       0     2|0       0    12g  24.2g 81m      0 db_list_restore:0.0%          0       0|0     1|0 432k   160k     2   03:09:30
    *0   4416     *0     *0       0     1|0       0    12g  24.2g 84m      0 db_list_restore:0.0%          0       0|0     1|0 437k   161k     2   03:09:31
    *0   4245     *0     *0       0     1|0       0    12g  24.2g 89m      0 db_list_restore:0.0%          0       0|0     0|0 420k   155k     2   03:09:32
    *0   4561     *0     *0       0     1|0       0    12g  24.2g 93m      0 db_list_restore:0.0%          0       0|0     1|0 451k   167k     2   03:09:33
    *0   3920     *0     *0       0     1|0       0    12g  24.2g 97m      0 db_list_restore:0.0%          0       0|0     0|0 388k   144k     2   03:09:34
    *0   4307     *0     *0       0     2|0       0    12g  24.2g 105m      0 db_list_restore:0.0%          0       0|0     0|0 426k   157k     2   03:09:35 
4

1 に答える 1

3

これらの数は、もちろん実行しているクエリの種類によって異なりますが、すべての作業を単一のプロセスで行うのに比較的妥当に見えます。

一般に、トラフィックを生成する何千もの Web サーバー プロセス (アプリケーションのワークロードと CPU 数に応じて、おそらく数百しかない) があり、サーバーに対して何千ものソケットが開いているため、どちらでもスケーリングできます。インフラストラクチャ内のコンポーネントを個別に。

単一プロセスのアプリケーションの場合、「待機ループ」に陥ります。これは、一度に実行するよう求められる個々のリソースが非常に多いためです。そのため、1 つのプロセス、1 つのソケット、1 つのタスクだけでは潜在能力を最大化することはできません。 . あなたは常にすべてのリソースを占有したいと考えています。

これを実現するには、ワークフローをできるだけ並列化する必要があります。正解となるワーカ数はあらかじめ決められているわけではないので、各プロセスがどれだけの作業を行うべきかは、実際に試してみる必要があります。

CSV ファイルに 100 万のエントリがある場合は、作業を 10 個に分割し、ファイルをシークして 100.000 個のエントリを読み取る 10 個の PHP プロセスを作成することをお勧めします。それをベンチマークし、一度に 10,000 個のエントリを処理する 100 個のプロセスを試して、以前の結果と比較します。

于 2013-10-18T22:50:06.590 に答える