【问题标题】:Multithreading issue on linuxlinux上的多线程问题
【发布时间】: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


【解决方案1】:

如果没有代码和您正在轮询的目标服务器,这很难回答,但我可以假设您在访问远程服务器时遇到了许多问题之一。 您的 ISP、远程服务器或您自己的服务器提供商都在限制您每秒可以发送的连接数量,从而减慢您建立的每个连接。这在DDOS protection 软件中很常见。

【讨论】:

    【解决方案2】:

    这是最简单的代码

    线程:

    for i in {1..50}; do
    curl -s --connect-timeout 3 -o /root/tmp/${1}_${i}.txt 
    http://example.com/html;
    done
    

    启动器:

    for i in {1..50}; do
    nohup ./m.sh ${i} > /dev/null &
    done
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-15
      • 2012-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多