Linux 2.6.31调度程序和multithreading作业

Linux 2.6.31调度程序和multithreading作业,第1张

概述Linux 2.6.31调度程序和multithreading作业

我在24核心的共享linux计算机上运行大规模并行的科学计算作业。 大多数情况下,当这台计算机上没有其他任何东西运行时,我的作业可以扩展到24个内核。 但是,即使是一个不是我的单线程作业运行,我的24线程作业(我设置为很好的值)只能达到〜1800%cpu(使用linux标记)。 同时,大约500%的cpu周期(再次使用linux符号)是闲置的。 任何人都可以解释这种行为,我能做些什么来获得所有23个不被其他人使用的内核?

笔记:

如果它是相关的,我已经在略有不同的内核版本上观察到了这一点,尽pipe我不记得我的头顶是哪个。

cpu架构是x64。 我的24核心工作是32位还是其他64位的工作是相关的?

创build一个可打印的报告,显示来自windows性能分析器Xperf的统计信息

在AMD 15h的perf数据

是否有可能在C ++代码中使用linux Perf分析器?

我们如何指定variables的物理地址?

windows性能logging器logging具体的过程

编辑:我刚刚注意到的一件事是,多达30个线程似乎在一定程度上缓解了这个问题。 它让我高达2100%的cpu。

监视windows中的特定进程的内存和处理器使用情况?

以特定的速度执行stdout输出

IUpdateSearcher性能问题

如何以及何时使用/ dev / shm来提高效率?

在执行虚拟文件系统时可以安全忽略的各种系统文件列表

这可能是由于调度程序试图保持每个任务运行在与之前运行的cpu相同的cpu上(这是因为任务可能将其工作集引入该cpu的缓存 – 这是“缓存热“)。

这里有一些你可以尝试的想法:

运行的内核数量是内核的两倍;

运行一个或两个线程比你有核心;

减少/proc/sys/kernel/sched_migration_cost (可能为零);

将/proc/sys/kernel/sched_domain/.../imbalance_pct的值降低至接近100。

你的线程是否需要同步? 如果是这样,您可能会遇到以下问题:

假设你有一个4-cpu系统和一个4线程的工作。 当单独运行时,线程扇出使用所有4个核心,总​​使用率接近完美(我们将称这个为400%)。

如果添加一个单线程干扰作业,则调度程序可能会将2个线程放在同一个cpu上。 这意味着你的两个线程现在以正常速度的一半运行(戏剧性的简化),如果你的线程需要周期性的同步,你的工作的进度会受到最慢的线程的限制,在这种情况下,正常速度的一半。 你会看到利用率只有200%(从你的工作运行4×50%)加上100%(干扰工作)= 300%。

同样,如果您认为干扰作业只使用一个处理器时间的25%,则可能会在同一cpu上看到您的一个线程和干扰源。 在这种情况下,最慢的线程以3/4的正常速度运行,导致总利用率为300%(4×75%)+ 25%= 325%。 玩这些数字,不难想出类似于你所看到的东西。

如果这是问题的话,你当然可以玩优先级给不受欢迎的任务只有微小的可用cpu(我假设I / O延迟不是一个因素)。 或者,如你所见,尝试增加线程,使每个cpu有2个线程,减去几个线程以允许系统任务。 通过这种方式,24核心系统可以运行得最好,例如46个线程(总是将2个核心的一半时间用于系统任务)。

你的线程是否相互沟通?

尝试手动绑定每个线程到cpu, sched_setaffinity或pthread_setaffinity_np 。 调度程序在处理大量相关的线程时可能相当愚蠢。

使用mpstat ( sysstat软件包的一部分)可能是值得的,如果你有整个cpu闲置而其他充分利用。 它应该给你比top或vmstat更详细的使用情况视图:运行mpstat -P ALL查看每个cpu 1行。

作为一个实验,您可以尝试在每个线程上设置cpu亲和性,以使每个线程都绑定到单个cpu; 如果不让内核调度程序决定一个任务被安排在哪一个cpu上,这将让你看到性能如何。 这不是一个好的永久性解决方案,但是如果它有很大的帮助,它可以让你知道调度程序在哪里。

你认为瓶颈是在你的应用程序还是内核的调度算法? 在开始调整计划参数之前,我建议您尝试运行一个简单的多线程应用程序,以查看它是否显示与您的应用程序相同的行为。

// COMPILE WITH: gcc threads.c -lpthread -o thread #include <pthread.h> #define NUM_CORES 24 voID* loop_forever(voID* argument) { int a; while(1) a++; } voID main() { int i; pthread_t threads[NUM_CORES]; for (i = 0; i < NUM_CORES; i++) pthread_create(&threads[i],loop_forever,0); for (i = 0; i < NUM_CORES; i++) pthread_join(threads[i],0); }

总结

以上是内存溢出为你收集整理的Linux 2.6.31调度程序和multithreading作业全部内容,希望文章能够帮你解决Linux 2.6.31调度程序和multithreading作业所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1290441.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-09
下一篇 2022-06-09

发表评论

登录后才能评论

评论列表(0条)

保存