使用线程的一种说法是为了提高性能。多线程可以使程序充分利用闲置的资源,提高资源的利用率,同时能够并行处理任务,提高系统的响应性。 但是很显然,引入线程的同时也引入了系统的复杂性。另外系统的性能并不是总是随着线程数的增加而总是提高。
性能与伸缩性
性能的提升通常意味着可以用更少的资源做更多的事情。这里资源是包括我们常说的CPU周期、内存、网络带宽、磁盘IO、数据库、WEB服务等等。 引入多线程可以充分利用多核的优势,充分利用IO阻塞带来的延迟,也可以降低网络开销带来的影响,从而提高单位时间内的响应效率。
为了提高性能,需要有效的利用我们现有的处理资源,同时也要开拓新的可用资源。例如,对于CPU而言,理想状况下希望CPU能够满负荷工作。当然这里满负荷工作是指做有用的事情,而不是无谓的死循环或者等待。受限于CPU的计算能力,如果CPU达到了极限,那么很显然我们充分利用了计算能力。对于IO而言(内存、磁盘、网络等),如果达到了其对于的带宽,这些资源的利用率也就上去了。理想状况下所有资源的能力都被用完了,那么这个系统的性能达到了最大值。
为了衡量系统的性能,有一些指标用于定性、定量的分析。例如服务时间、等待时间、吞吐量、效率、可伸缩性、生成量等等。服务时间、等待时间等用于衡量系统的效率,即到底有多快。吞吐量、生成量等用于衡量系统的容量,即能够处理多少数据。除此之外,有效服务时间、中断时间等用于能力系统的可靠性和稳定性等。
可伸缩性的意思是指增加计算资源,吞吐量和生产量相应得到的改进。 从算法的角度讲,通常用复杂度来衡量其对应的性能。例如时间复杂度、空间复杂度等。
Amdahl定律
并行的任务增加资源显然能够提高性能,但是如果是串行的任务,增加资源并不一定能够得到合理的性能提升。 Amdahl定律描述的在一个系统中,增加处理器资源对系统行的提升比率。 假定在一个系统中,F是必须串行化执行的比重,N是处理器资源,那么随着N的增加最多增加的加速比:
理论上,当N趋近于无穷大时,加速比最大值无限趋近于1/F。 这意味着如果一个程序的串行化比重为50%,那么并行化后最大加速比为2倍。
加速比除了可以用于加速的比率外,也可以用于衡量CPU资源的利用率。如果每一个CPU的资源利用率为100%,那么CPU的资源每次翻倍时,加速比也应该翻倍。 事实上,在拥有10个处理器的系统中,程序如果有10%是串行化的,那么最多可以加速1/(0.1+(1-0.1)/10)=5.3倍,换句话说CPU的利用率只用5.3/10=53%。而如果处理器增加到100倍,那么加速比为9.2倍,也就是说CPU的利用率只有个9.3%。
显然增加CPU的数量并不能提高CPU的利用率。下图描述的是随着CPU的数量增加,不同串行化比重的系统的加速比。
很显然,串行比重越大,增加CPU资源的效果越不明显。
性能提升
性能的提升可以从以下几个方面入手。
系统平台的资源利用率
一个程序对系统平台的资源利用率是指某一个设备繁忙且服务于此程序的时间占所有时间的比率。从物理学的角度讲类似于有用功的比率。简单的说就是:资源利用率=有效繁忙时间/总耗费时间。
也就说尽可能的让设备做有用的功,同时榨取其最大值。无用的循环可能会导致CPU 100%的使用率,但不一定是有效的工作。有效性通常难以衡量,通常只能以主观来评估,或者通过被优化的程序的行为来判断是否提高了有效性。
延迟
延迟描述的是完成任务所耗费的时间。延迟有时候也成为响应时间。如果有多个并行的操作,那么延迟取决于耗费时间最大的任务。
多处理
多处理是指在单一系统上同时执行多个进程或者多个程序的能力。多处理能力的好处是可以提高吞吐量。多处理可以有效利用多核CPU的资源。
多线程
多线程描述的是同一个地址空间内同时执行多个线程的过程。这些线程都有不同的执行路径和不同的栈结构。我们说的并发性更多的是指针对线程。
并发性
同时执行多个程序或者任务称之为并发。单程序内的多任务处理或者多程序间的多任务处理都认为是并发。
吞吐量
吞吐量衡量系统在单位之间内可以完成的工作总量。对于硬件系统而言,吞吐量是物理介质的上限。在没有达到物理介质之前,提高系统的吞吐量也可以大幅度改进性能。同时吞吐量也是衡量性能的一个指标。
瓶颈
程序运行过程中性能最差的地方。通常而言,串行的IO、磁盘IO、内存单元分配、网络IO等都可能造成瓶颈。某些使用太频繁的算法也有可能成为瓶颈。
可扩展性
这里的可扩展性主要是指程序或系统通过增加可使用的资源而增加性能的能力。
线程开销
假设引入的多线程都用于计算,那么性能一定会有很大的提升么? 其实引入多线程以后也会引入更多的开销。
切换上下文
如果可运行的线程数大于CPU的内核数,那么OS会根据一定的调度算法,强行切换正在运行的线程,从而使其它线程能够使用CPU周期。
切换线程会导致上下文切换。线程的调度会导致CPU需要在操作系统和进程间花费更多的时间片段,这样真正执行应用程序的时间就减少了。另外上下文切换也会导致缓存的频繁进出,对于一个刚被切换的线程来说,可能由于高速缓冲中没有数据而变得更慢,从而导致更多的IO开销。
内存同步
不同线程间要进行数据同步,synchronized以及volatile提供的可见性都会导致缓存失效。线程栈之间的数据要和主存进行同步,这些同步有一些小小的开销。如果线程间同时要进行数据同步,那么这些同步的线程可能都会受阻。
阻塞
当发生锁竞争时,失败的线程会导致阻塞。通常阻塞的线程可能在JVM内部进行自旋等待,或者被操作系统挂起。自旋等待可能会导致更多的CPU切片浪费,而操作系统挂起则会导致更多的上下文切换。
了解了性能的提升的几个方面,也了解性能的开销后,应用程序就要根据实际的场景进行取舍和评估。没有一劳永逸的优化方案,不断的进行小范围改进和调整是提高性能的有效手段。当前一些大的架构调整也会导致较大的性能的提升。
简单的原则是在保证逻辑正确的情况小,找到性能瓶颈,小步改进和优化。
参考资料
- Amdahl's law: http://en.wikipedia.org/wiki/Amdahl%27s_law
- Gustafson's law: http://en.wikipedia.org/wiki/Gustafson%27s_law
- Sun-Ni law: http://en.wikipedia.org/wiki/Sun-Ni_law
- 多核系统中三种典型锁竞争的加速比分析 http://blog.csdn.net/drzhouweiming/article/details/1800319
- 阿姆达尔定律和Gustafson定律的等价性 http://book.51cto.com/art/201004/197506.htm
http://www.blogjava.net/xylz/archive/2011/12/31/367641.html
相关推荐
资源名称:数据访问宝典-...现在,最严重的性能和可伸缩性问题通常由与网络、数据库驱动程序、宽泛的软件/硬件环境,以及效率低下的数据请求编码等原因造成 资源太大,传百度网盘了,链接在附件中,有需要的同学自取。
陈斌等人的研究综述深入探讨了这一关键概念,指出可伸缩性不仅涉及系统的基本性能,还与资源管理和任务调度策略密切相关。 在分布式系统中,可伸缩性通常通过两种主要方式实现:一是增加硬件资源,如增加服务器数量...
《UFIDA U9 性能及伸缩性白皮书》深入探讨了用友软件股份有限公司新一代企业管理软件U9的性能表现与伸缩性策略,特别是在企业级关键应用中的表现。该白皮书不仅概述了U9软件的技术架构优势,还详细记录了其在特定...
本文将深入探讨MySQL与Oracle在性能、可伸缩性以及最佳实践方面的比较,并通过代码示例来展示它们在实际应用中的表现。 MySQL和Oracle在性能和可伸缩性方面各有优势。Oracle适合大型企业和数据密集型应用,而MySQL...
MySQL 大规模数据库的性能和伸缩性优化是确保网站高效运行的关键,尤其是在移动设备和平板电脑广泛应用的时代。本文将探讨一系列策略来优化处理大量数据的 MySQL 数据库。 首先,选择正确的存储引擎至关重要。...
《ArcGIS Server的性能及伸缩性探讨》 ArcGIS Server是Esri公司推出的一款强大的地理信息系统(GIS)服务器软件,它提供了丰富的地理空间服务,包括地图服务、地理编码服务、几何操作服务等,用于管理和分发地理...
第4章 改进性能与伸缩性的设计模式 性能问题的原因 伸缩性问题的原因 城市休假订票应用程序 标识提高性能的模式 标识提高伸缩性的模式 完整City Break体系结构 小结 第5章 管理安全性的设计模式 何谓安全模式 ...
易于安装的系统和应用功能 100%的asp.net的代码,没有COM,java或者其他的格式 完全基于MS建议的系统安全设计 最佳的应用程序,数据库和安全设定 MS建议的最佳用户密码管理设定 极强的系统性能与伸缩性 大量应用缓存以...
没有COM,java或者其他的格式完全基于MS建议的系统安全设计最佳的应用程序,数据库和安全设定MS建议的最佳用户密码管理设定极强的系统性能与伸缩性大量应用缓存以提升系统的性能和浏览速度方便的功能可伸缩设计
在IT领域,尤其是在系统管理和架构设计中,"可伸缩性"是一个至关重要的概念。Windows操作系统作为广泛应用的桌面和服务器平台,同样面临着如何提供高效、灵活的可伸缩性解决方案的挑战。本篇将深入探讨"Windows可...
高性能服务器网络可伸缩性.doc
没有COM,java或者其他的格式 完全基于MS建议的系统安全设计 最佳的应用程序,数据库和安全设定 MS建议的最佳用户密码管理设定 极强的系统性能与伸缩性 大量应用缓存以提升系统的性能和浏览速度 ...
在许多应用程序中,提供较高的可用性和较高的读取可伸缩性是十分重要的;而复制便可作为提供这两方面的性能的解决方案的关键部分。对于某些应用程序而言,其目标可能是通过复制来提高可用性或可伸缩性。
根据一项调查,用户对于MySQL有着明确的需求,其中最重要的关注点是产品的伸缩性,这意味着用户期望MySQL能更好地适应数据量的增长,同时保持高效性能。33%的受访者将此列为首要问题,这涉及到数据库在处理大量数据...
高性能服务器网络可伸缩性.doc
1. **高性能与伸缩性**:Oracle支持TB级别的海量数据存储,通过优化的查询处理和索引技术,保证在大数据量下的高效运行。同时,Oracle设计允许数据库系统随着需求增长进行水平或垂直扩展。 2. **安全性**:Oracle...