每秒mongodb查询

时间:2013-08-28 08:58:43

标签: php mongodb

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

脚本运行时,需要3分钟才能完成。测试了50,000个,1万,3万,5万个数据文件以及执行脚本的性能速率或速率是成比例的。服务器中有足够的可用内存。脚本运行时的mongostat输出粘贴在下面。我的问题是,我相信脚本每秒执行接近5000次查询。我在很多帖子中都读过,他们平均每秒获得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 

1 个答案:

答案 0 :(得分:2)

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

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

对于单个流程应用程序,您将陷入“等待循环”,因为每次只需要处理这么多个别资源,因此您只能通过一个进程,一个套接字来最大化您的潜力一个任务。您希望始终占用所有资源。

要实现这一目标,您需要尽可能多地并行化您的工作流程。没有预定义数量的工作人员是正确的答案,因此每个流程应该做多少工作是你必须通过尝试自己想出来的。

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