为什么Dropbox使用这么多线程?

时间:2017-04-24 08:25:30

标签: multithreading dropbox

我对线程的理解是,在开始失去效率之前,每个核心只能有一个线程,两个带有超线程。

这台计算机有八个内核,所以应该最好用8/16个线程,但是很多应用程序使用了几次,尤其是Dropbox。

Dropbox windows 7 process, 104 threads highlighted.

它在我的笔记本电脑上闲置时使用了95个线程,它只有4个核心。

为什么会这样?它是否有如此多的线程用于编程方便,我是否误解了线程效率还是其他完全不同的东西?

2 个答案:

答案 0 :(得分:2)

我看了一下客户端的 Mac 版本,它似乎是用 Python 编写的,并且使用了多个框架。

  • 一些内部actor系统中似乎使用了一堆线程
  • 他们使用核心进行应用分析
  • 似乎有一个 p2p 网络
  • 一些网络线程(每个炒作核心一个)
  • 一个全局池(每个物理核心一个)
  • 用于文件监控和缩略图生成的多个线程
  • 任务调度器
  • 登录
  • 指标
  • 数据库检查点
  • 一种叫做无限配置的东西

大部分都是闲置的。

它看起来像是一个子系统的大杂烩,每个子系统都启动自己的线程,但在内存或 CPU 方面似乎并不太昂贵。

答案 1 :(得分:1)

<块引用>

我对线程的理解是,在开始失去效率之前,每个内核只能有一个线程,两个具有超线程。

不,这不是真的。我不知道你为什么这么认为,但事实并非如此。

作为证明它是错误的最明显的方式,假设您有一定数量的线程,其中一个访问了不在 RAM 中的内存页面,并且必须加载到磁盘。如果您没有任何其他线程可以运行,那么在从磁盘读取该内存页所需的整个时间里,一个内核都被浪费了。

如果不知道导致错误的推理链是什么,就很难直接解决这种误解。但最常见的情况是,如果您准备运行的线程多于您一次可以执行的线程数,那么您将需要进行大量上下文切换,而且上下文切换的成本很高。

但这显然是错误的。如果所有线程都准备好运行,则不需要上下文切换。仅当正在运行的线程停止准备运行时才需要上下文切换。

如果所有上下文切换都是自愿的,那么实现可以选择上下文切换的最佳次数。而这正是它的作用。

当且仅当大量线程执行少量工作,然后在其他等待线程准备运行时不再准备运行时,拥有大量线程会导致您失去效率。这会强制执行上下文,即使它不是最佳的。

一些使用大量线程的应用程序实际上会这样做。这确实会导致性能不佳。但 Dropbox 没有。