我已经对linux调度程序进行了一些测量。 linux是“Linux版本2.6.18-194.el5(mockbuild@x86-005.build.bos.redhat.com)”,机器是8 cpus。测量是该机器上唯一的工作负载。
测量是两组。在第一组中,设置了8个线程,每个线程具有相同的计算成本。第二组是将一个线程拆分为两个,从而产生总共9个线程(其中2个线程是其他7个线程的成本的一半)。
当我运行两个测量集时,我预计吞吐量是相同的,因为总计算成本是相同的,并且linux调度程序应该(尽管我不确定)在一个核心中安排这两个较小的线程。结果表明,从8个线程到9个线程的吞吐量急剧下降。任何人都有想法可能是什么原因。
编辑:@Waldheinz。这些线程按顺序设置(比如0,1 ... 7),并且(无限的)元组流从线程0,1传递到线程7.每个元组在每个线程上花费一些时间,进行一些计算。所有8个线程的计算成本与第一组测量值相同。
更新:如果线程数变为16,意味着每个核心都有两个线程,则吞吐量会提高到8个线程...
答案 0 :(得分:1)
Linux 2.6.18现在已经相当陈旧,可以追溯到2006年,当时多核系统并不常见或重要。您的基准测试可能会运行内核在2.6.23之前使用的O(1) scheduler的一些缺陷。我完全忘记了那些问题,但听起来似乎有道理。 O(1)部分指的是调度的开销基本上是不变的,但即使是这种情况,调度程序在某些情况下也做出了糟糕的决策。
如果可以,请尝试更新的内核(在2.6.23之后)并查看新的completely fair scheduler是否有所作为。
答案 1 :(得分:0)
9个月内,9名女性可以生育9个婴儿,每个婴儿每个婴儿可以生9个月。一个女人可以在九个月内生一个孩子,每个孩子每人可以再生九个月。但是,9名女性仍然需要18个月才能生育10个婴儿,每个婴儿每个婴儿的生育率要超过16个月!
您正在为线程分配太大而且没有运行测试的工作块足够长的时间来平滑块大小。