课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
并发编程开发是大多数Java编程开发程序员在开发软件的时候会经常用到的一种编程开发方式,而本文我们就通过案例分析来了解一下,Java并发编程多进程的优缺点分析。
纯CPU密集型的应用
在单核上并发执行多个请求,不能提高吞吐量
由于任务来回场景切换的开销,吞吐量反而会下降
只有多核并行运算,才能有效提高吞吐量
IO密集型的应用
由于请求过程中,很多时间都是外部IO操作,CPU在wait状态,所以并发执行可以有效提高系统吞吐量。
并发模型模型发展
multi-process(多进程)
multi-thread(多线程)
multi-process+multi-thread(GIL)(多进程+多线程)
eventI/O(事件驱动)
coroutine(协程)
常见多进程Web服务端编程模型
PHP
Python
Ruby
多进程优点
并发模型非常简单
由操作系统调度运行稳定强壮
非常容易管理
很容易通过操作系统方便的监控,例如每个进程CPU,内存变化状况,甚至可以观测到进程处理什么Web请求很容易通过操作系统管理进程,例如可以通过给进程发送signal,实现各种管理:unicorn。
隔离性非常好
一个进程崩溃不会影响其他进程
某进程出现问题的时候,只要杀掉它重启即可,不影响整体服务的可用性
很容易实现在线热部署和无缝升级
代码兼容性极好,不必考虑线程安全问题
多进程可以有效利用多核CPU,实现并行处理
多进程监控
监控进程CPUtop–ppid
简单处理甚至可以查看进程处理的URL请求
监控进程的IOiotop–ppid
监控进程的物理内存使用ps,/proc
多进程缺点
内存消耗很多
每个独立进程都需要加载完整的应用环境,内存消耗超大。(COW模式可以缓解这个问题)
例如每个Rails进程物理内存占用为150MB,20个workers,则需要3GB物理内存。
CPU消耗偏高
多进程并发,需要CPU内核在多个进程间频繁切换,而进程的场景切换(contextswitch)是非常昂贵的,需要大量的内存换页操作。
很低的I/O并发处理能力
多进程的并发能力非常有限
每个进程只能并发处理1个请求
单台服务器启动的进程数有限,并发处理能力无法有效提高
只适合处理短请求,不适合处理长请求
每个请求都能在很短时间内执行完毕,因而不会造成进程被长期阻塞一旦某个操作特别是IO操作阻塞,就会造成进程阻塞
当大面积IO操作阻塞发生,服务器就无法响应了
对于无法预知的外部IO操作,应用代码必须设置timeout参数,以防进程阻塞
缓解多进程低IO并发问题
用nginx做前端WebServer
适当增大proxybuffersize,避免多进程request/responsebufferIO开销
使用X-sendfile,避免多进程读取大文件IO开销
凡IO操作都要设置timeout
避免无法预知的IO挂起造成进程阻塞
长请求和短请求分离开,不要放在一起
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。