我有一台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
答案 0 :(得分:2)
对于完成所有工作的单个进程,这些数字看起来相对合理 - 取决于您当然正在进行的查询类型。
一般情况下,您将拥有数千个网络服务器进程(取决于您的应用程序工作负载和CPU数量,可能只有几百个),这将产生流量 - 因此您将有数千个套接字打开服务器,允许您单独扩展基础架构中的任何组件。
对于单个流程应用程序,您将陷入“等待循环”,因为每次只需要处理这么多个别资源,因此您只能通过一个进程,一个套接字来最大化您的潜力一个任务。您希望始终占用所有资源。
要实现这一目标,您需要尽可能多地并行化您的工作流程。没有预定义数量的工作人员是正确的答案,因此每个流程应该做多少工作是你必须通过尝试自己想出来的。
如果CSV文件中有数百万个条目,您可能希望开始将工作分成10个片段,创建10个寻找文件的PHP进程,并通过100.000个条目读取工作。 基准测试,然后可以尝试100个过程,每个过程一次处理10,000个条目,并与之前的结果进行比较。