如何降低计算密集线程的 CPU 占用率?

2020-01-20 09:25:58 +08:00
 ybw

在系统的默认调度策略下,这个线程会占满一个核心,直到它做完工作。

有没有办法让这个线程的 CPU 占用率始终保持在某个数值之下,比如不得超过 60%。

4296 次点击
所在节点    程序员
38 条回复
BingoXuan
2020-01-20 09:31:08 +08:00
nc 设置优先级?
augustheart
2020-01-20 09:31:41 +08:00
让出时间片啊,但是要达到具体的效果得自己手动测试阈值了。我记得看过一本微软的人写的书,网名字了,他们让实习生拿 cpu 占用表画波形图玩。
hmzt
2020-01-20 09:32:29 +08:00
sleep, 现在电脑这么多核, 占满一个又怎么了
liuxey
2020-01-20 09:32:58 +08:00
cpulimit
ybw
2020-01-20 09:34:34 +08:00
@augustheart 这不叫测试阈值,而是猜阈值,有运气成分在里面
ybw
2020-01-20 09:35:46 +08:00
@hmzt 多线程程序,如果有 3 个这种线程,那就是 3 个核。有可能让别的程序卡死。
augustheart
2020-01-20 09:37:45 +08:00
@ybw 老哥你真严格……
tigerstudent
2020-01-20 09:42:03 +08:00
@augustheart 好像是《编程之美》?
tigerstudent
2020-01-20 09:43:08 +08:00
每执行完一些任务就 sleep 一下
wdf86
2020-01-20 09:43:15 +08:00
cgroup 试试
augustheart
2020-01-20 09:53:16 +08:00
@tigerstudent 好像就是这本书
jasonyang9
2020-01-20 09:54:50 +08:00
什么平台?有 systemd ?有的话用 slice,一个配置档就成了
ybw
2020-01-20 09:56:15 +08:00
icyalala
2020-01-20 09:57:16 +08:00
用 setaffinity 不停切换绑定的 CPU。。
但你这么搞,Cache 和分支预测之类的会不断失效,总 CPU 消耗反而会提升非常多。。
cloudyplain
2020-01-20 10:14:07 +08:00
cputhrottle
lishulong
2020-01-20 10:53:26 +08:00
1. 首先要明确的是降低 cpu 占用率目的?是为了提升系统的性能、还是单纯的想限制 cpu 的利用率。
2. 计算密集型系统区别于 io 密集型,对于计算密集型的,在无法优化系统代码层面的情况下,最直接的方式就是提升 cpu 的核数
3. 单纯的降低单进程单线程的 cpu 占用率,程序层面会很难操纵吧。
1. 多进程开发,单进程单线程跑 100%,多核均摊计算充分利用多核来达到"降低 cpu 的占用率",
2. `使用 docker 将服务容器化--cpus 参数限制该服务使用的 cpu 核数`
4. 为了提升系统的性能,主要是针对耗费 cpu 的一些计算来进行优化
1. 正则,一定要预编译
2. 不必要的运算,比如 潜在的 for 循环计算重复的计算任务,
3. NPE
4. 异步任务最好池化
wangyzj
2020-01-20 10:59:01 +08:00
@augustheart 编程之美——微软技术面试心得
wangyzj
2020-01-20 11:00:31 +08:00
cgroup 吗?
单纯的为了限制没意义把
计算密集型不就是为了把 cpu 干满么
happy7902
2020-01-20 11:05:13 +08:00
你的问题就是伪命题,看似很有道理,实则是没什么常识的。一个线程同一时刻只能用一个 core 计算,理论上只有多线程才能占满所有 cpu。另外你想这个 cpu 占用率控制在 60% 你想让另外 40 睡眠吗? 调度算法会这么傻吗。或者你应该换个更加强大的 cpu 他的利用率自然会下来。在 linux 上 cgroup 可以解决你这些奇葩需求,限制 cpu 核心,占用率 网络带宽 io 带宽等
ybw
2020-01-20 11:05:59 +08:00
@wangyzj 比起占满系统资源从而 3 分钟完成任务,我更想要占用低资源,从而 10 分钟完成任务。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/639344

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX