代码之家  ›  专栏  ›  技术社区  ›  STEEL

在双核cpu上运行GO runtime.GOMAXPROCS(4)

  •  0
  • STEEL  · 技术社区  · 6 年前

    对不起,如果这听起来很愚蠢的话。

    如果跑了会发生什么 runtime.GOMAXPROCS(4) 虽然 runtime.NumCpu() == 2

    1 回复  |  直到 6 年前
        1
  •  3
  •   kostix    6 年前

    runtime.GOMAXPROCS 控制将创建多少操作系统级线程来运行程序的goroutine(以及为其提供电源的运行时)。(运行时本身将为自己创建多个线程,但这不重要。)

    基本上,就是这样。

    但是,假设你真的想问“这会对我的程序的性能产生什么影响?”,对吧? 如果是,答案是“这取决于”。 我不确定您是否有机会使用只有一个CPU和一个内核的系统(基本上是大多数消费级IBM PC兼容计算机,直到有所谓“超线程”技术的奔腾CPU的一代),但是这些系统通常在一个“单核”上运行成百上千个OS线程(这个术语在主流中并不存在,但OK)。

    另一件要考虑的事情是,你的程序不是孤立运行的:有其他程序在同一个CPU上运行,内核本身也有几个内核线程。 你可以使用像 top htop 要评估系统当前在所有核心上调度的线程数。

    这时,您可能想知道为什么Go运行时默认创建的线程数量与物理内核的数量一样多,以支持goroutine。

    据推测,这来自一个简单的事实,即在典型的服务器端工作负载中,您的程序将是某种“主程序”。 换句话说,它的线程与线程的争用 其他进程和内核将相当低。