在系统的默认调度策略下,这个线程会占满一个核心,直到它做完工作。
有没有办法让这个线程的 CPU 占用率始终保持在某个数值之下,比如不得超过 60%。
1
BingoXuan 2020-01-20 09:31:08 +08:00
nc 设置优先级?
|
2
augustheart 2020-01-20 09:31:41 +08:00
让出时间片啊,但是要达到具体的效果得自己手动测试阈值了。我记得看过一本微软的人写的书,网名字了,他们让实习生拿 cpu 占用表画波形图玩。
|
3
hmzt 2020-01-20 09:32:29 +08:00
sleep, 现在电脑这么多核, 占满一个又怎么了
|
4
liuxey 2020-01-20 09:32:58 +08:00
cpulimit
|
5
ybw OP @augustheart 这不叫测试阈值,而是猜阈值,有运气成分在里面
|
7
augustheart 2020-01-20 09:37:45 +08:00
@ybw 老哥你真严格……
|
8
tigerstudent 2020-01-20 09:42:03 +08:00
@augustheart 好像是《编程之美》?
|
9
tigerstudent 2020-01-20 09:43:08 +08:00
每执行完一些任务就 sleep 一下
|
10
wdf86 2020-01-20 09:43:15 +08:00
cgroup 试试
|
11
augustheart 2020-01-20 09:53:16 +08:00
@tigerstudent 好像就是这本书
|
12
jasonyang9 2020-01-20 09:54:50 +08:00
什么平台?有 systemd ?有的话用 slice,一个配置档就成了
|
13
ybw OP @jasonyang9 Mac
|
14
icyalala 2020-01-20 09:57:16 +08:00
用 setaffinity 不停切换绑定的 CPU。。
但你这么搞,Cache 和分支预测之类的会不断失效,总 CPU 消耗反而会提升非常多。。 |
15
cloudyplain 2020-01-20 10:14:07 +08:00
cputhrottle
|
16
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. 异步任务最好池化 |
17
wangyzj 2020-01-20 10:59:01 +08:00
@augustheart 编程之美——微软技术面试心得
|
18
wangyzj 2020-01-20 11:00:31 +08:00
cgroup 吗?
单纯的为了限制没意义把 计算密集型不就是为了把 cpu 干满么 |
19
happy7902 2020-01-20 11:05:13 +08:00 via iPhone
你的问题就是伪命题,看似很有道理,实则是没什么常识的。一个线程同一时刻只能用一个 core 计算,理论上只有多线程才能占满所有 cpu。另外你想这个 cpu 占用率控制在 60% 你想让另外 40 睡眠吗? 调度算法会这么傻吗。或者你应该换个更加强大的 cpu 他的利用率自然会下来。在 linux 上 cgroup 可以解决你这些奇葩需求,限制 cpu 核心,占用率 网络带宽 io 带宽等
|
20
ybw OP @wangyzj 比起占满系统资源从而 3 分钟完成任务,我更想要占用低资源,从而 10 分钟完成任务。
|
21
star00 2020-01-20 11:08:09 +08:00
为什么要限制 cpu,cpu 不够加机器啊
|
24
star00 2020-01-20 11:19:02 +08:00
“线程会占满一个核心,直到它做完工作” ? 对这句话有点疑问。 现在的操作系统执行任务不是分时间片的吗? 如果有多个线程。一个线程执行一个时间片后,它们不会重新争夺 cpu 吗? 为什么这个线程会占满一个核心,直到它做完工作。 我也不太懂,只是有点疑问。
|
26
ddup 2020-01-20 11:21:24 +08:00
Thread.Sleep(1000)
|
27
sagaxu 2020-01-20 11:23:23 +08:00 via Android
第一句话就是错的,CPU 密集型线程,在调度时会受到一定惩罚,实际优先级低于同静态优先级的 IO 密集型线程。其它线程不但有机会运行,还更优先。
|
28
pmispig 2020-01-20 11:31:47 +08:00
搞个 docker 就行了
|
30
lambdaq 2020-01-20 11:38:10 +08:00
买主频更高的 cpu ?
|
31
opengps 2020-01-20 11:40:15 +08:00
sleep(10),让出 10 毫秒间隔
|
32
cigarzh 2020-01-20 11:47:48 +08:00
“在系统的默认调度策略下,这个线程会占满一个核心,直到它做完工作。”
哪个 OS 的啥 Scheduler 这么傻逼? |
33
augustheart 2020-01-20 12:18:00 +08:00 1
@sagaxu 至少从 windows 的内核来说,是没有这个说法的。
|
34
sagaxu 2020-01-20 12:33:51 +08:00 via Android
@augustheart Windows NT-based operating systems use a multilevel feedback queue. 32 priority levels are defined, 0 through to 31, with priorities 0 through 15 being "normal" priorities and priorities 16 through 31 being soft real-time priorities, requiring privileges to assign. 0 is reserved for the Operating System. Users can select 5 of these priorities to assign to a running application from the Task Manager application, or through thread management APIs. The kernel may change the priority level of a thread depending on its I/O and CPU usage and whether it is interactive (i.e. accepts and responds to input from humans), raising the priority of interactive and I/O bounded processes and lowering that of CPU bound processes, to increase the responsiveness of interactive applications.[9] The scheduler was modified in Windows Vista to use the cycle counter register of modern processors to keep track of exactly how many CPU cycles a thread has executed, rather than just using an interval-timer interrupt routine.[10] Vista also uses a priority scheduler for the I/O queue so that disk defragmenters and other such programs do not interfere with foreground operations.
|
35
windyland 2020-01-20 13:09:19 +08:00 via Android
实际上调低优先级就可以了
|
36
augustheart 2020-01-20 14:06:24 +08:00
@sagaxu 这个说法我倒是没注意到。我推敲一下。
无论核心编程还是深入解析我好像都没有看到过有提到会特意将 cpu 密集型降低优先级的说法(实际上在我看来这个也无从判断,只能通过时间片的占用情况才能判断)。我再翻翻书,也可能我跳过了某句话。 |
37
BB9z 2020-01-20 22:17:05 +08:00
应用限制?比如 App Tamer、AppPolice。
|
38
zado 2020-01-20 23:24:26 +08:00
调低优先级就可以了,强行控制 CPU 占有率可以做到,如果想要控制精确一点还非常复杂,费力不讨好。
|