CPU 密集型的操作是否只能横向堆机器,从软件层面上没有什么好的解决方案么?

2020-06-02 20:40:37 +08:00
 SystemLight

CPU 密集型多核 CPU 下可以采用进程或者方式来执行程序,但是这种资源是有限的,在高并发的前提下非 IO 密集型的操作是不是只能堆机器了呢!

3188 次点击
所在节点    程序员
17 条回复
unixeno
2020-06-02 20:50:58 +08:00
CPU 密集型任务的瓶颈是 CPU
要么减少计算量=用更高效的算法优化
要么提升机器计算能力=换更高性能的 CPU 或者堆机器
reus
2020-06-02 20:55:51 +08:00
改进算法啊
lithiumii
2020-06-02 21:29:48 +08:00
算法?
AX5N
2020-06-02 21:41:27 +08:00
换成 c++
cljnnn
2020-06-02 21:47:10 +08:00
数据结构与算法
namelosw
2020-06-02 21:51:31 +08:00
优化算法,优化技术栈,以前还有换专用 CPU,现在有的计算可以 GPU 之类的。

而且大部分软件也不能直接横向堆机器,得能横向执行的代码才行,比如 Spark 上跑的那种。我们面试默写的大部分算法是不能有效率地横向执行的。
cabing
2020-06-02 22:00:48 +08:00
瓶颈在 cpu,得看那些功能影响 cpu,分层次去优化。

程序 cpu 性能监控。对当前程序的消耗能有个了解啊。方便后续优化对比。
编程语言层级:越靠近操作系统的语言性能越高,有些地方可以用汇编代替
代码层级:优化代码功能
代码设计层级:合理的设计,是否充分利用了每个 cpu
业务层级:业务能否优化和改进
架构层级:架构上是否合理?是否高效?如果单机不合理,是否能够多机部署呢?
就像上面说的也可以换专业的 GPU 来,GPU 编程可能有点不一样,需要学习下。


当然算法也很重要。如果真的是很耗费资源,是时候对关键部分做算法分析了。


土豪只用看下架构能够堆机器就行,不用太管其他的优化。
dazhangpan
2020-06-02 22:21:40 +08:00
能做的事情特别多,特别特别多...先学个 profiler 作为入门吧..
nightwitch
2020-06-02 22:43:58 +08:00
CPU 密集型
高并发

这两个词是矛盾的,CPU 密集型的应用都期望尽可能的抢占 CPU 和系统资源, 而高并发需要每一个会话尽可能的少占用资源。
Mithril
2020-06-02 22:50:22 +08:00
改算法
换 Cpp+Intel Compiler
手写并行指令
横向堆机器的前提是你的算法可以横向扩展,并不是所有算法都可以这么干的。有的时候你横向扩展带来的通信损耗都比收益高
tanranran
2020-06-02 22:51:08 +08:00
换语言
MiffyLiye
2020-06-02 23:59:37 +08:00
1L 已经指出来了两个大方向

补充一下要减少计算量,除了改进算法之外,还有其他选项

1. 降低资源消耗
改进算法
降低对精确度的要求:用精确度不高的算法(例如 Monte Carlo method )
降低对实时性的要求:用任务队列异步处理
降低其他要求:需要综合很多因素权衡利弊

2. 提高资源供给
换更强的 CPU
加 CPU
ConradG
2020-06-03 00:11:14 +08:00
还可以撸专用芯片,比如写个 FPGA 之类。
penguinWWY
2020-06-03 01:28:53 +08:00
Profile-guided optimization
msg7086
2020-06-03 04:18:53 +08:00
还可以想办法改用 GPU 。显卡同价位下性能可不是强一点点。
p2pCoder
2020-06-03 08:44:36 +08:00
性能调优 先跑个 profiler 找下瓶颈在哪
并发的 cpu 密集计算 建议 几方面优化 ,首先是合理的 计算分片,减少线程 进程切换的 cpu 消耗,然后是并行计算要考虑中间结果的缓存,看逻辑上是否有大量的重复计算,最后,就是优化算子,比如 整形 浮点型的位数,字符串转 hash,减少字符串操作,用取 hash 及 hash 后的整数的位运算取代
如果是 java golang python 这些语言,还要考虑在计算密集型的应用中,gc 的巨大压力,以及语言本生的限制,如果最后真的是调优无法达到要求,就建议 c++重写,性能会有质的提升,还可以从编译器以及硬件架构层面进行优化
wtsamuel
2020-06-03 12:33:26 +08:00
调优以及
能用硬件解决的事,别用软件解决

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

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

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

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

© 2021 V2EX