1

我有一个 64G RAM 的服务器,我正在运行一个脚本,它将 csv 文件中的一百万个数据与数据库进行比较。如果找到匹配项,则脚本仅在执行结束时打印匹配项数。

脚本在运行时需要 3 分钟才能完成。还使用 50,000、10 万、30 万、50 万个数据文件进行了测试,性能率或脚本执行率成正比。服务器中有足够的可用内存。脚本运行时的 mongostat 输出粘贴在下面。我的问题是,我相信脚本每秒执行近 5000 个查询。我读过很多帖子,他们平均每秒收到 5 万次查询。如何做到这一点?我的服务器运行 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

对于完成所有工作的单个进程,这些数字看起来相对合理 - 当然取决于您正在执行的查询类型。

一般来说,您将拥有数千个网络服务器进程(取决于您的应用程序工作负载和 cpu 数量,可能只有几百个),这将产生流量 - 因此您将有数千个对服务器开放的套接字允许您扩展任何一个独立于您的基础架构中的组件。

对于单进程应用程序,您将陷入“等待循环”,因为每次只要求执行这么多的单独资源,因此您将永远无法仅通过一个进程、一个套接字、一项任务来最大化您的潜力. 你想一直占用你所有的资源。

为了实现这一点,您需要尽可能多地并行化您的工作流程。没有预先定义的工人数量是正确的答案,因此每个流程应该做多少工作是您必须通过尝试自己弄清楚的事情。

如果您在 CSV 文件中有数百万个条目,您可能希望开始将工作分成 10 个部分,创建 10 个查找文件并读取 100.000 个条目的 PHP 进程。对其进行基准测试,然后可能尝试 100 个进程,每个进程一次处理 10.000 个条目,并与之前的结果进行比较。

于 2013-10-18T22:50:06.590 回答