V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ybw
V2EX  ›  程序员

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

  •  
  •   ybw · 2020-01-20 09:25:58 +08:00 via Android · 4508 次点击
    这是一个创建于 1777 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    38 条回复    2020-01-20 23:24:26 +08:00
    BingoXuan
        1
    BingoXuan  
       2020-01-20 09:31:08 +08:00
    nc 设置优先级?
    augustheart
        2
    augustheart  
       2020-01-20 09:31:41 +08:00
    让出时间片啊,但是要达到具体的效果得自己手动测试阈值了。我记得看过一本微软的人写的书,网名字了,他们让实习生拿 cpu 占用表画波形图玩。
    hmzt
        3
    hmzt  
       2020-01-20 09:32:29 +08:00
    sleep, 现在电脑这么多核, 占满一个又怎么了
    liuxey
        4
    liuxey  
       2020-01-20 09:32:58 +08:00
    cpulimit
    ybw
        5
    ybw  
    OP
       2020-01-20 09:34:34 +08:00 via Android
    @augustheart 这不叫测试阈值,而是猜阈值,有运气成分在里面
    ybw
        6
    ybw  
    OP
       2020-01-20 09:35:46 +08:00 via Android
    @hmzt 多线程程序,如果有 3 个这种线程,那就是 3 个核。有可能让别的程序卡死。
    augustheart
        7
    augustheart  
       2020-01-20 09:37:45 +08:00
    @ybw 老哥你真严格……
    tigerstudent
        8
    tigerstudent  
       2020-01-20 09:42:03 +08:00
    @augustheart 好像是《编程之美》?
    tigerstudent
        9
    tigerstudent  
       2020-01-20 09:43:08 +08:00
    每执行完一些任务就 sleep 一下
    wdf86
        10
    wdf86  
       2020-01-20 09:43:15 +08:00
    cgroup 试试
    augustheart
        11
    augustheart  
       2020-01-20 09:53:16 +08:00
    @tigerstudent 好像就是这本书
    jasonyang9
        12
    jasonyang9  
       2020-01-20 09:54:50 +08:00
    什么平台?有 systemd ?有的话用 slice,一个配置档就成了
    ybw
        13
    ybw  
    OP
       2020-01-20 09:56:15 +08:00 via Android
    icyalala
        14
    icyalala  
       2020-01-20 09:57:16 +08:00
    用 setaffinity 不停切换绑定的 CPU。。
    但你这么搞,Cache 和分支预测之类的会不断失效,总 CPU 消耗反而会提升非常多。。
    cloudyplain
        15
    cloudyplain  
       2020-01-20 10:14:07 +08:00
    cputhrottle
    lishulong
        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. 异步任务最好池化
    wangyzj
        17
    wangyzj  
       2020-01-20 10:59:01 +08:00
    @augustheart 编程之美——微软技术面试心得
    wangyzj
        18
    wangyzj  
       2020-01-20 11:00:31 +08:00
    cgroup 吗?
    单纯的为了限制没意义把
    计算密集型不就是为了把 cpu 干满么
    happy7902
        19
    happy7902  
       2020-01-20 11:05:13 +08:00 via iPhone
    你的问题就是伪命题,看似很有道理,实则是没什么常识的。一个线程同一时刻只能用一个 core 计算,理论上只有多线程才能占满所有 cpu。另外你想这个 cpu 占用率控制在 60% 你想让另外 40 睡眠吗? 调度算法会这么傻吗。或者你应该换个更加强大的 cpu 他的利用率自然会下来。在 linux 上 cgroup 可以解决你这些奇葩需求,限制 cpu 核心,占用率 网络带宽 io 带宽等
    ybw
        20
    ybw  
    OP
       2020-01-20 11:05:59 +08:00 via Android
    @wangyzj 比起占满系统资源从而 3 分钟完成任务,我更想要占用低资源,从而 10 分钟完成任务。
    star00
        21
    star00  
       2020-01-20 11:08:09 +08:00
    为什么要限制 cpu,cpu 不够加机器啊
    ybw
        22
    ybw  
    OP
       2020-01-20 11:08:57 +08:00 via Android
    @happy7902 我就是想让剩下的 40 空闲,以便其他程序使用。
    wangyzj
        23
    wangyzj  
       2020-01-20 11:09:20 +08:00
    @ybw 多核的话你得代码层面拆分线程也许能做得到
    star00
        24
    star00  
       2020-01-20 11:19:02 +08:00
    “线程会占满一个核心,直到它做完工作” ? 对这句话有点疑问。 现在的操作系统执行任务不是分时间片的吗? 如果有多个线程。一个线程执行一个时间片后,它们不会重新争夺 cpu 吗? 为什么这个线程会占满一个核心,直到它做完工作。 我也不太懂,只是有点疑问。
    ybw
        25
    ybw  
    OP
       2020-01-20 11:20:24 +08:00 via Android
    @star00 这只是我对实际观察到的现象的描述。
    ddup
        26
    ddup  
       2020-01-20 11:21:24 +08:00
    Thread.Sleep(1000)
    sagaxu
        27
    sagaxu  
       2020-01-20 11:23:23 +08:00 via Android
    第一句话就是错的,CPU 密集型线程,在调度时会受到一定惩罚,实际优先级低于同静态优先级的 IO 密集型线程。其它线程不但有机会运行,还更优先。
    pmispig
        28
    pmispig  
       2020-01-20 11:31:47 +08:00
    搞个 docker 就行了
    ybw
        29
    ybw  
    OP
       2020-01-20 11:34:42 +08:00 via Android
    @sagaxu 不多说了,cpux.net
    lambdaq
        30
    lambdaq  
       2020-01-20 11:38:10 +08:00
    买主频更高的 cpu ?
    opengps
        31
    opengps  
       2020-01-20 11:40:15 +08:00
    sleep(10),让出 10 毫秒间隔
    cigarzh
        32
    cigarzh  
       2020-01-20 11:47:48 +08:00
    “在系统的默认调度策略下,这个线程会占满一个核心,直到它做完工作。”

    哪个 OS 的啥 Scheduler 这么傻逼?
    augustheart
        33
    augustheart  
       2020-01-20 12:18:00 +08:00   ❤️ 1
    @sagaxu 至少从 windows 的内核来说,是没有这个说法的。
    sagaxu
        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.
    windyland
        35
    windyland  
       2020-01-20 13:09:19 +08:00 via Android
    实际上调低优先级就可以了
    augustheart
        36
    augustheart  
       2020-01-20 14:06:24 +08:00
    @sagaxu 这个说法我倒是没注意到。我推敲一下。
    无论核心编程还是深入解析我好像都没有看到过有提到会特意将 cpu 密集型降低优先级的说法(实际上在我看来这个也无从判断,只能通过时间片的占用情况才能判断)。我再翻翻书,也可能我跳过了某句话。
    BB9z
        37
    BB9z  
       2020-01-20 22:17:05 +08:00
    应用限制?比如 App Tamer、AppPolice。
    zado
        38
    zado  
       2020-01-20 23:24:26 +08:00
    调低优先级就可以了,强行控制 CPU 占有率可以做到,如果想要控制精确一点还非常复杂,费力不讨好。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2663 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 09:43 · PVG 17:43 · LAX 01:43 · JFK 04:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.