【问题标题】:Java - Thread Priorities & SocketsJava - 线程优先级和套接字
【发布时间】:2015-02-13 07:53:32
【问题描述】:

我正在开发一个网络爬虫。程序的每个线程尝试读取 3 个主机/秒(330ms 连接和读取超时)。每个线程的优先级为 10(Ubuntu 12.04)。

当我设置 10 个线程时,爬虫返回 150 个活着的主机(主机没有超时)。

当我设置 400 个线程时,爬虫只返回 20 个活着的主机。我不知道有多少主机是真正活着或存在的。

我的问题是,有没有可能一个线程在短时间内没有执行,并且当它确实需要时间继续(从 CPU 调度)时,套接字已经超时? (因为线程处理请求的时间过长)。

如果是这种情况,我必须设置多少个线程,以便所有线程都有相同的时间?

我使用的是 ubuntu 12.04 x64 - 桌面,4GB 内存,CPU i5

【问题讨论】:

  • 只是出于好奇,你为什么要玩线程优先级?
  • 当然,@fge 只是礼貌地问你一个关于优先级的问题,而不是马上告诉你别管线程优先级。
  • 你所有的线程都应该得到尽可能多的时间,因为网络爬取不是 CPU 密集型的。但是,他们可能在需要时 得不到它。处理所有其他线程并返回第一个线程可能需要超过 330 毫秒。
  • 发生的事情是您受 io 限制,您将网络负载增加了 40 倍,并且您的响应时间增加了。在这里,这不是真正的线程问题;您刚刚完成了经典的延迟/吞吐量权衡。
  • @MikeNakis 感谢您的告知!

标签: java multithreading


【解决方案1】:

感觉你需要了解Amdahl's Law。基本上,对于 N 个线程,您的操作将 [大大] 少于 N 倍的加速。你只有一个 i5,它可以同时支持 2 到 4 个并行任务。由于启动线程、在线程之间切换以及(如果您不使用调度程序或线程池)破坏线程的成本,向它抛出比您的系统更多的线程可以真正处理性能下降。

您也无法保证相等的执行时间,因为您取决于外部因素,例如该服务器的套接字打开情况以及服务器自身的连接速度。有些服务器会比其他服务器慢,这意味着线程从套接字读取的总时间会比其他服务器慢。

我不能肯定你的性能会像推测的那样因为 IO 而下降,但我建议进行分析和测试。在系统上设置尽可能多的线程,然后从那里开始工作。尽可能对您的代码进行概要分析。向它抛出更多线程不是是个好主意。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-22
    • 1970-01-01
    • 2011-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多