【发布时间】:2017-04-23 19:48:59
【问题描述】:
我有一个服务器:Centos 6.6 \ 32 GB RAM \ 500 Mbit
任务: 我需要运行多线程 php 脚本来获取不同域的内容。
问题: 当我将线程数量从 20 增加到 100+ 时,每个线程的工作时间会更长,有时我什至无法从远程域获得结果。与 20 个线程相比,带宽也有很大不同。结果 - 增加线程数量并没有带来任何好处,但会降低结果的整体质量。
调试: 10 个线程 - 1 个线程工作 20 秒 20 个线程 - 1 个线程工作 21 秒 50 个线程 - 1 个线程工作 25 秒 100 个线程 - 1 个线程工作 45 - 100 秒 150 个线程 - 1 个线程工作 45 - 150 秒
替代方案: 我尝试了相同的脚本: - 使用 Centos 7 和另一个 php 版本的不同服务器 - 关于 Ruby 语言 - 在纯 bash 上:curl + GET 命令 我完全一样!
问题: 我应该在系统设置中增加什么以使多线程正常工作?
提前致谢!
【问题讨论】:
-
您通常不能拥有比可用内核更多的线程。假设应用程序没有阻塞您可以修复的问题,您需要更多的并行能力。当应用程序卡住时尝试转储/中断(在调试器上),也许你会知道线程都在等待什么。
-
我有 4 个物理内核,但问题从 70 - 100 个线程开始。 CPU 负载几乎为 0,因为 curl -s -o /dev/null example.com 的 100 个线程什么都不消耗。
-
它们正在竞争 /dev/null,在这种情况下,您需要将输出重定向到单个文件(或其他一些非共享资源),这样它们就不会相互阻塞。跨度>
-
我使用单独的文本文件进行输出。当我使用 50 个线程和 3 秒超时和每个线程 50 个请求时,我得到 100% 的结果(2500 个文件)当我使用 100 个线程时,我得到 90% 的结果,(4400 - 4600)个文件
标签: php linux multithreading networking centos