应用程序的运行方式以及如何提高性能
如何通过多线程提高程序运行速度

多线程是一种并行计算的方式,可以同时执行多个任务,从而提高程序运行速度。
在计算机系统中,每个线程都有自己的程序计数器、寄存器集合、栈和局部变量等。
多个线程可以共享全局变量和堆内存,从而实现任务的并行处理。
一、多线程的概念与好处多线程是指一个进程中同时运行多个线程,每个线程处理不同的任务。
相比于单线程,多线程可以更充分地利用计算机系统的资源,提高程序的运行效率。
多线程的好处有以下几个方面:1. 提高程序运行速度:通过同时执行多个任务,可以实现并行计算,从而减少程序的运行时间。
2. 提高计算机系统的资源利用率:通过合理安排线程的执行顺序,可以充分利用计算机系统的CPU、内存等资源,提高系统的整体性能。
3. 增强用户体验:多线程可以使程序的响应更加迅速,用户操作不再被等待,提高了用户的操作体验。
二、多线程的实现方式在Java语言中,多线程可以通过继承Thread类或者实现Runnable接口来实现。
下面分别介绍这两种方式。
1. 继承Thread类:通过继承Thread类,重写其run方法,即可创建一个新的线程。
然后调用start方法启动线程,并通过join方法等待线程执行完毕。
这种方式简单直接,但是由于Java不支持多重继承,因此在使用时可能会受到限制。
2. 实现Runnable接口:通过实现Runnable接口,重写其run方法,然后创建Thread对象,将实现了Runnable接口的对象作为参数传入,即可创建一个新的线程。
与继承Thread类相比,实现Runnable接口的方式更具灵活性,因为Java支持多个接口的实现。
三、多线程的注意事项在使用多线程的过程中,需要注意以下几点:1. 线程安全:多线程访问共享资源时,可能会导致数据不一致或者冲突的问题,因此需要采取一定的措施来保证线程的安全性,如使用锁机制、同步代码块等。
2. 上下文切换:在多线程之间进行切换时,需要保存和恢复线程的上下文信息,可能涉及到一定的开销。
电脑中的软件运行速度慢这些方法或许能提升效率

电脑中的软件运行速度慢这些方法或许能提升效率如今,电脑已经成为我们日常生活中必不可少的工具。
然而,随着时间的推移,我们可能会发现电脑软件的运行速度逐渐变慢,给我们的使用体验带来了许多不便。
为了提升电脑软件的运行效率,我们可以尝试以下几种方法。
1. 清理磁盘空间电脑硬盘上存储的大量无用文件会占据磁盘空间,导致软件运行缓慢。
因此,为了提升电脑软件的运行速度,我们应该定期清理磁盘空间。
可以通过删除临时文件、清理回收站、卸载不再使用的程序等方式来释放磁盘空间,从而提升软件的响应速度。
2. 禁用不必要的启动程序在电脑开机时,许多程序会自动启动并在后台运行,占用系统资源,导致电脑运行变慢。
为了加快软件的运行速度,我们可以禁用不必要的启动程序。
在任务管理器中找到启动选项卡,禁用那些不需要开机自启的程序,只保留必要的系统进程和常用软件的启动项目,从而提高系统的运行效率。
3. 更新和优化软件软件开发者会不断更新软件以修复bug、提高性能。
因此,为了提升软件的运行速度,我们应该及时更新已安装的软件版本。
此外,一些软件还提供了优化选项,可以根据自己的需求进行设置,以提高其运行效率。
4. 增加内存和硬盘空间电脑的内存和硬盘空间是影响软件运行速度的重要因素。
如果电脑的内存较小或者硬盘空间不足,那么软件的运行速度就会受到限制。
因此,我们可以考虑增加电脑的内存或者扩展硬盘空间,从而提升软件的运行效率。
5. 执行病毒扫描电脑中的病毒或恶意软件也会导致软件运行缓慢。
为了提高软件的运行速度,我们应该定期执行病毒扫描,并确保安装了可靠的杀毒软件。
及时清除电脑中的病毒,可以减少恶意软件对软件运行速度造成的影响。
6. 停用视觉效果虽然视觉效果能够为电脑界面增添美感,但它们也会占用系统资源,导致软件运行变慢。
为了提高软件的运行速度,我们可以停用或降低视觉效果。
在系统设置中,可以禁用桌面背景的动画、减少窗口动画效果等,从而提升软件的响应速度。
电脑软件优化技巧提升软件运行速度的方法

电脑软件优化技巧提升软件运行速度的方法在使用电脑软件时,我们常常会遇到软件运行速度过慢的问题,这不仅影响了工作效率,还给用户带来了不好的体验。
本文将介绍几种优化技巧,帮助您提升软件运行速度。
一、清理系统垃圾文件系统垃圾文件是指在日常使用中产生的临时文件、缓存文件等,它们堆积在系统中会占用大量的存储空间,进而影响软件运行速度。
因此,定期清理这些垃圾文件是提升软件运行速度的有效方法。
1. 使用磁盘清理工具:Windows系统自带了磁盘清理工具,您可以在文件资源管理器中找到“计算机”选项,右键点击C盘,并选择“属性”-“磁盘清理”。
在弹出的对话框中,选择要清理的文件类型,如临时文件、回收站文件等,点击“确定”即可进行清理。
2. 定期清理浏览器缓存:浏览器会在访问网页时缓存部分数据,这些数据会占用硬盘空间,同时也可能导致软件运行缓慢。
打开浏览器,找到“设置”选项,选择“清除浏览数据”,勾选清除缓存,并点击“清除数据”按钮。
二、关闭不必要的后台进程在电脑运行时,有许多后台进程在默默地运行,这些进程会占用系统资源,导致软件运行缓慢。
因此,关闭不必要的后台进程是提高软件运行速度的有效方法。
1. 使用任务管理器:按下“Ctrl+Shift+Esc”组合键,打开任务管理器。
在“进程”选项卡中,找到不必要的进程,右键点击并选择“结束任务”。
2. 禁用启动项:部分软件会在系统开机时自动启动,这些软件可能会占用大量的系统资源。
打开任务管理器,切换到“启动”选项卡,禁用那些不必要的启动项。
三、优化硬盘空间硬盘空间的优化也是提升软件运行速度的重要因素之一。
合理利用硬盘空间可以减少硬盘碎片、提高文件读写速度,从而加快软件运行速度。
1. 碎片整理工具:定期使用碎片整理工具对硬盘进行整理,可以将碎片文件整理成连续的存储块,提高读写速度。
Windows系统自带了磁盘碎片整理工具,您可以在“计算机”选项中找到“磁盘碎片整理”。
2. 清理硬盘空间:删除不必要的文件和程序,可以释放硬盘空间,减少读写时的寻址时间,提高软件运行速度。
解决计算机软件的性能问题和优化技巧

解决计算机软件的性能问题和优化技巧一、介绍计算机软件在实际应用中常常面临性能问题,如响应速度慢、资源利用不充分等。
本文将从不同角度介绍解决计算机软件的性能问题和优化技巧。
二、代码优化代码优化是提高软件性能的关键步骤。
在代码编写过程中,需要遵循一些基本原则:减少函数调用次数、避免重复计算等。
此外,通过合理使用数据结构、算法和设计模式等方法,可以降低时间和空间复杂度,进而提高软件性能。
三、内存管理内存管理对软件性能有着重要影响。
过多的内存占用会导致性能下降和资源浪费。
因此,开发人员需要重点关注内存泄漏和内存碎片化问题。
为避免内存泄漏,可以使用垃圾回收机制或手动释放不再使用的内存;为减少内存碎片化,应尽量减少动态内存分配或合理地进行内存分配。
四、多线程优化多线程是提高软件性能的重要手段。
通过将任务划分为多个线程并发执行,可以充分利用多核处理器的优势。
但多线程带来的线程同步和数据共享等问题同样需要解决。
使用线程池等技术可以控制线程数量,避免资源竞争和线程创建销毁开销。
此外,使用无锁数据结构和并行算法等方法,可以在保证线程安全的前提下提高并发性能。
五、数据库优化数据库是许多软件的核心组件,对其进行优化对提高软件性能至关重要。
首先,设计数据库结构需要合理选择索引、表关系和查询语句等,以最小化查询时间。
其次,对数据库连接和事务管理进行优化,避免过多连接和锁等资源浪费。
最后,定期进行数据库性能监测和调优,找出慢查询和瓶颈,并进行优化处理。
六、网络通信优化网络通信是现代软件中常见的性能瓶颈。
为了解决网络通信的性能问题,可以采用多种方法。
首先,使用分布式架构和负载均衡技术,将请求分散到多台服务器上,提高处理能力。
其次,使用高效的协议和压缩算法,减少数据传输的大小和时延。
此外,使用缓存技术和数据预加载减少网络请求的频次和耗时。
七、硬件升级与配置要解决软件性能问题,硬件的升级与配置同样重要。
可以通过增加内存、更换硬盘或升级处理器等方式,提高计算机运行速度。
优化软件性能和稳定性的方法

优化软件性能和稳定性的方法1.代码优化:-使用高效的算法和数据结构,减少计算量和内存占用。
-减少不必要的计算和存储,避免浪费资源。
-避免频繁的文件或数据库操作,可使用缓存来减少对数据的读写次数。
-避免重复计算,将计算结果缓存起来。
-避免死循环和递归调用,防止系统崩溃或死机。
-避免内存泄漏,及时释放不再使用的内存。
2.并发优化:-使用多线程或多进程处理并发任务,提高系统的处理能力。
-使用线程池或进程池来管理线程和进程的创建和销毁。
-合理分配资源,避免资源竞争和死锁。
-使用适当的同步机制,避免线程安全问题。
-使用异步编程,提高系统的响应速度。
3.数据库优化:-设计合理的数据库结构,减少冗余和重复数据。
-使用索引来优化查询速度。
-避免频繁的大量的数据库操作,可以使用批量操作或者缓存来减少对数据库的访问次数。
-定期清理数据库中过期或无用的数据,减小数据库的存储和查询压力。
4.网络优化:-减少网络请求的次数和数据量,优化网络传输效率。
-使用压缩和加密算法,减小数据的传输体积和提高安全性。
-使用缓存和CDN来加快数据的访问速度。
5.内存管理:-合理分配内存,避免内存不足或过多的问题。
-及时释放不再使用的内存,避免内存泄漏。
-使用内存池或者缓存来减少内存的分配和回收次数。
6.日志和错误处理:-合理设置日志级别和参数,减少日志输出的数量。
-使用合适的日志框架,提高日志记录的效率和稳定性。
-对异常和错误进行及时捕获和处理,避免系统崩溃。
7.监控和性能测试:-使用监控工具来监测系统的性能和稳定性。
-定期进行性能测试,找出系统的瓶颈和性能问题。
-根据性能测试结果,进行优化和调整,提高软件的性能和稳定性。
综上所述,优化软件性能和稳定性需要综合考虑各个方面的因素,包括代码、并发、数据库、网络、内存、日志和错误处理等。
通过合理的优化和改进,可以提高软件的性能和稳定性,提高用户体验和系统的可靠性。
如何优化手机APP的性能

如何优化手机APP的性能随着手机APP的普及和使用量的增加,用户对于APP性能的要求也越来越高。
一个好的性能能够提升用户的使用体验,增加用户粘性,提高市场竞争力。
那么如何优化手机APP的性能呢?本文将从多个方面分析,并提供相应的解决方案。
一、减少内存占用1. 代码优化:在编写APP代码时,尽量避免使用大量全局变量和重复创建对象的情况,有效减少内存占用。
另外,合理使用循环和条件语句,避免无效的内存消耗。
2. 图片资源优化:图片是APP中常用的资源,对于图片的使用也要注意优化。
可以通过压缩图片大小、选择合适的图片格式、避免不必要的图片加载等方式来减少内存占用。
3. 内存泄漏排查:及时监测和排查内存泄漏问题。
使用内存分析工具,定位内存泄漏点,并进行相应的修复。
二、加快启动速度1. 冷启动优化:通过减少APP第一次启动时的初始化工作,提升冷启动速度。
可以将一些耗时的操作延迟到APP启动后的后台线程执行,保证用户能够尽快进入APP。
2. 热启动优化:通过合理使用应用程序缓存、数据预加载等技术手段,提升APP的热启动速度。
同时,避免在热启动阶段进行耗时的网络请求或文件读写操作。
三、降低耗电量1. 优化网络请求:合理利用HTTP缓存、使用GZIP压缩、减少重复请求等方式,减少网络请求对手机电池的消耗。
2. 控制后台服务:合理使用后台服务,并及时释放资源,避免无效消耗电量。
3. 优化算法:在APP开发中,合理使用算法可以减少CPU的计算负担,从而减少电量的消耗。
选择高效的数据结构、避免循环嵌套等方式都可以提高应用程序的执行效率。
四、提升渲染性能1. 减少布局层级:视图层级越多,渲染性能越低。
通过减少布局层级、使用扁平化布局等方式,可以提升渲染性能。
2. 图形渲染优化:对于复杂的图形界面,可以使用硬件加速技术或者使用图片代替部分矢量图,减少图形渲染的消耗。
3. 异步加载:对于大量数据或者耗时的UI操作,可以使用异步加载的方式,避免界面卡顿。
提高应用程序执行速度的几种方法

提高应用程序执行速度的几种方法1. 仔细优化应用程序:(1) 杜绝不必要的循环,指令和函数调用;(2) 避免使用容易引起冲突的数据结构,如数组;(3) 使用封装函数和延迟评估或可变声明,以减少多余的开销;(4) 利用编译器(有些语言可能不支持)优化程序代码,因为编译器比许多开发者有更全面的视野;(5) 理解变量的使用和语句的表示,以节省在程序运行中的时间。
2. 减少访问:减少数据库访问,降低内存访问,减少I/O操作,减少网络请求,它们都是在获取数据或存在数据改变的情况下消耗时间的可观的步骤,因此它们将对应用程序的整体性能有显着影响。
3. 多核心CPU:添加多颗独立运行的多核CPU上,可以帮助在双核或多核处理器上运行应用程序时可以尽可能高效地分发任务。
4. 并发处理:将它们拆分为可以并行处理的非相关任务,而不是按顺序一个接一个地处理,这样可以加快应用程序的速度。
5. 合并计算:合并计算,优化内存分配,降低数据量,减少函数调用的次数,这些都可以显著提高执行速度。
6. 使用高速缓存:为了缩短调用程序花费的准备时间,可以考虑使用高速缓存来降低访问时间,以及在多个处理器中或分布式系统中处理数据。
7. 利用现代浏览器技术:通过使用现代浏览器技术可以改进应用程序的性能,减少闲置时间,提高响应速度和渲染页面速度。
8. 使用类C++语言:应用C++语言的类机制可以有效地增加应用程序的运行速度,类的实现可以节省缓存和内存排序的时间,而且对对象的分配也更加高效。
9. 使用缩放:缩放有助于使应用程序运行更快,缩放技术在内存中维护更少的数据,因此可以减少查询时间,更快地将数据下放,以及降低I/O操作。
同时,缩放也将使应用程序更加稳定,减少崩溃几率。
10. 利用专业工具:使用专业工具(如性能调度、压力测量工具等),可以模拟特定的应用程序环境,以发现导致应用程序不佳性能的点或原因,此外,这些工具还能够演示和优化方案,让您可以改善应用程序在真实环境中的行为。
5个必备的软件性能优化步骤

软件性能优化是软件开发中的重要环节,它可以提高软件的运行效率和响应速度,使用户体验更佳。
下面将介绍5个必备的软件性能优化步骤。
1. 代码审查与优化:首先,对软件的代码进行审查是至关重要的。
通过仔细审查代码,可以发现可能存在的性能问题,并进行相应的优化。
一些常见的问题包括代码冗余、频繁的循环、不必要的变量或函数调用等。
通过优化代码,可以减少不必要的计算和内存消耗,提高软件的性能。
另外,合理使用数据结构和算法也是优化代码的关键。
选择适当的数据结构和算法可以降低时间复杂度和空间复杂度,提高程序的执行效率。
例如,使用哈希表而不是线性查找可以大大加快数据查找的速度。
2. 内存管理与资源优化:内存管理是软件性能优化的重要一环。
合理管理内存资源可以减少内存泄漏和内存碎片,提高软件的执行效率。
首先,及时释放不再使用的内存是保证软件性能的关键。
存储在堆上的对象,在其不再使用时需要手动释放内存以防止内存泄漏。
此外,合理使用缓存和临时变量可以减少频繁的内存分配与释放,提高内存利用率。
还有,对I/O操作的优化也是提高软件性能的重要一环。
例如,通过批量读写和异步I/O等技术,可以减少I/O操作的次数和延迟,提高软件的响应速度。
3. 并发与并行处理:并发和并行处理是现代软件开发不可忽视的问题。
通过合理利用多线程、多进程和异步编程等技术,可以提高软件的并发性和并行度,进而提高软件的执行效率。
在设计并发系统时,需要考虑线程间的同步与互斥。
使用适当的同步机制和锁可以保证并发操作的正确性和一致性。
此外,还可以通过任务拆分和负载均衡等策略来充分利用多核处理器的性能,提高软件的并行处理能力。
4. 数据库优化:数据库是许多软件的关键组成部分。
通过优化数据库的设计和查询语句,可以提高软件的性能。
首先,对数据库进行合理的规划和设计是重要的。
使用适当的索引、分区和缓存等技术可以提高查询效率和减少数据的读写次数。
此外,数据库参数的优化和定期的数据清理也可以提高系统的性能。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Web 应用程序的运行方式以及如何提高性能了解Web应用程序的运行方式以及如何提高性能文档选项级别:中级Sean A.Walberg,高级网络工程师,P.Eng 2009年4月13日了解Web应用程序的各种组件如何交互,以及在哪些地方可能发现性能瓶颈。
开发人员和管理员都可以从本文受益,因为获得更好的性能是他们的责任。
动态的Web 应用程序能够存储大量信息,让用户能够通过熟悉的界面立即访问这些信息。
但是,随着应用程序越来越受欢迎,可能会发现对请求的响应速度没有以前那么快了。
开发人员应该了解Web应用程序处理Web请求的方式,知道在Web应用程序开发中可以做什么,不能做什么,这有助于减少日后的麻烦。
静态的Web请求(比如图1所示的请求)很容易理解。
客户机连接服务器(通常通过TCP端口80),使用HTTP协议发出一个简单的请求。
服务器解析这个请求,把它映射到文件系统上的一个文件。
然后,服务器向客户机发送一些描述有效负载(比如网页或图像)的响应头,最后向客户机发送文件。
在上面的场景中可能出现几个瓶颈。
如果请求的变化很大,导致无法有效地使用操作系统的磁盘缓存,那么服务器的磁盘会很忙,到了某种程度之后,就会减慢整个过程。
如果为客户机提供数据的网络通道饱和了,就会影响所有客户机。
但是,除了这些状况之外,"接收请求,发送文件"过程还是相当高效的。
通过做一些假设,可以大致体会静态服务器的性能。
假设一个请求的服务时间是10ms(主要受到磁头寻道时间的限制),那么大约每秒100个请求就会使磁盘接近饱和(10msec/request/1 second=100 requests/second)。
如果要发送10K的文档,就会产生大约8mbit/sec的Web通信流(100 requests/second*10KBytes/request*8bits/byte)。
如果可以从内存缓存中获取文件,就可以降低平均服务时间,因此增加服务器每秒能够处理的连接数。
如果您有磁盘服务时间或平均请求延时的真实数据,可以把它们放进上面的算式,从而计算出更准确的性能估计值。
既然服务器的处理容量是平均请求服务时间的倒数,那么如果服务时间加倍,服务器的处理容量(每秒处理的连接数)就会减半。
请记住这一点,下面看看动态应用程序的情况。
动态应用程序的流程依赖于应用程序的具体情况,但是一般情况下与图2相似。
与前一个示例中的客户机一样,图2中的客户机首先发出一个请求。
静态请求和动态请求之间实际上没什么差异(有时候.php或.cgi等扩展名可能意味着动态请求,但是它们可能引起误解)。
如何处理请求是由Web服务器决定的。
在图2中,请求被发送到一个应用服务器,比如运行一个Java应用程序的Solaris系统。
应用服务器执行一些处理,然后向数据库查询更多的信息。
得到这些信息之后,应用服务器生成一个HTML页面,这个页面由Web服务器转发给客户机。
因此,这个请求的服务时间是几个部分的总和。
如果数据库访问花费7ms,应用服务器花费13ms,Web服务器花费5ms,那么网页的服务时间就是25ms。
根据前面介绍的倒数规则,各个组件的容量分别是每秒142、77和200个请求。
因此,瓶颈是应用服务器,它使这个系统每秒只能处理77个连接;超过这个数量之后,Web 服务器被迫等待,连接开始排队。
但是,一定要注意一点:因为系统每秒只能分派77个连接,而一个连接需要的处理时间是25ms,所以并非每个应用程序用户的请求都能够在25ms内得到处理。
每个组件每次只能处理一个连接,所以在高峰负载下,请求不得不等待CPU时间。
在上面的示例中,考虑到排队时间和25ms的处理时间,平均请求服务时间最终会超过1.1秒。
关于解决这些排队问题的更多信息,请参见。
通过这些示例可以得出以下结论:在用户发出请求和获得最终页面之间的步骤越多,整个过程就越慢,系统容量就越低。
随着页面请求速率的增加,这种效应会越来越显著。
在项目开始时做出的体系结构决策也会影响站点处理负载的能力。
本文的其余部分将深入讨论这些问题。
应用程序(包括Web应用程序)的体系结构常常按照层来描述。
静态站点可以被看作只有一层--Web服务器。
如果用Web服务器运行某种脚本语言(比如PHP),从而连接数据库,那么这可以看作两层。
前一节中的示例有三层,即前端Web服务器、应用服务器和数据库。
一个软件也可能由多层组成,这取决于您谈话的对象。
例如,PHP脚本可能使用一个模板引擎把业务逻辑与表示分隔开,它可以被看作单独的两层。
Java应用程序可能通过Java servlet执行表示任务,servlet通过与Enterprise JavaBean(EJB)通信执行业务逻辑,EJB通过连接数据库获取更多信息。
因此,换一个角度来看,三层体系结构可能是另一副样子,尤其是在涉及不同的工具集时。
尽管应用程序的体系结构各不相同,但是有一些常见的体系结构趋势。
在一般情况下,应用程序需要四个功能层:客户机层表示层业务逻辑层数据层在Web应用程序中,客户机层由Web浏览器处理。
浏览器显示HTML并执行Javascript(以及Java applet、ActiveX或Flash applet),从而向用户显示信息和收集用户信息。
表示层是从服务器到客户机的接口,它负责控制输出的格式,让输出可以在客户机上显示。
业务逻辑层实施业务规则(比如计算和工作流),从而驱动应用程序。
最后,数据访问层是持久化的数据存储,比如数据库或文件存储。
大多数应用程序需要所有这四层的功能,尽管它们可能不需要明显完整地实现这些层。
另一种流行的体系结构是Model-View-Controller,这是一种用于分隔应用程序组件的模式。
在MVC模式中,模型封装业务逻辑层,并与框架一起封装数据层。
视图负责处理发送给客户机的数据表示。
控制器的作用是控制应用程序流程。
扩展Web应用程序的容量意味着让它能够处理更多的通信流。
容量扩展的一个方面是如何根据需求部署硬件。
另一个方面是应用程序如何响应新的硬件环境。
从概念上说,在出现性能问题时,往往首先想到使用功能更强的服务器;但是应用程序本身很可能造成其他瓶颈。
把应用程序划分为一系列层有助于收缩问题的范围,可以简化容量扩展。
现在先不考虑应用程序瓶颈。
扩展应用程序的硬件通常有两种方式:水平扩展和垂直扩展。
水平扩展意味着在一层中添加更多的服务器。
在前面的示例中,应用服务器的瓶颈把请求速率限制在每秒77个请求,通过添加第二个应用服务器并在两个服务器之间共享负载,可能可以解决此问题。
这会把理论容量提高到每秒154个请求,瓶颈位置就会转到数据库。
另一方面,垂直扩展意味着使用功能更强的计算机。
可以使用功能更强的计算机运行应用服务器的两个实例,或者更快地处理请求。
初看上去,您可能会完全排除垂直扩展方式,因为购买多台小型计算机通常比不断购买更高级的服务器便宜。
但是,在许多情况下,垂直扩展是更好的方法。
如果您有通过逻辑分区(LPAR)支持硬件分区的IBM Power服务器,就可以把空闲的容量添加到应用服务器层。
应用程序的需求也可能促使您选择垂直扩展。
在一台服务器上很容易通过共享内存段共享用户的会话状态。
如果使用两台服务器,就需要通过其他方式共享状态,比如数据库。
数据库访问比内存访问慢,所以两台服务器的处理速度达不到一台服务器的两倍。
数据库是另一个常常适合使用垂直扩展的场合。
让数据集跨越不同的服务器需要在应用程序层做大量工作,比如跨两个数据库联结列并确保数据是一致的。
使用更强大的数据库服务器要容易得多,而且不需要通过重新构建应用程序来支持分散的数据。
根据前面对应用程序体系结构的讨论可以看出,Web请求会通过多个阶段,每个阶段花费一定的执行时间。
请求排队通过每个步骤,完成一个步骤之后,再排队进入下一个步骤。
每个步骤很像人们在商店里排队结帐的情况。
可以把Web应用程序建模为一系列步骤(称为"队列")。
应用程序的每个组件都是一个队列。
建模为一系列队列的典型WebSphere应用程序如图3所示。
图3显示请求等待Web服务器处理它们,然后等待Web容器,依此类推。
如果进入某个队列的请求速率超过了此队列处理请求的速率,请求就会聚集起来。
当出现请求聚集时,服务时间是不可预测的,用户会察觉到浏览器会话延迟。
图3中的队列代表最糟糕的情况,因为Web服务器可以自己处理一些请求,即不需要访问数据库。
队列在UNIX环境中很常见。
当应用程序发出磁盘请求的速率快于磁盘返回数据的速率时,操作系统会让磁盘请求排队,还可能调整请求的次序以降低寻道时间。
另一个队列是运行队列,其中包含等待运行的进程的有序列表。
应用程序会等待轮到它们使用某些有限的资源(比如CPU)。
因此,队列调优是一种平衡的艺术。
队列太小,就会在仍然有富余容量的情况下拒绝用户。
队列太大,就会试图为过多的用户提供服务,导致性能很差。
导致情况更复杂的另一个因素是,这些排队位置并不是无成本的。
保留排队位置会导致内存开销,对于应用服务器,这会与正在处理请求的线程争用内存。
因此,在一般情况下,在应用服务器上排队并不是好方法。
推荐的方法是在应用服务器之前(比如在Web服务器上)排队。
这意味着Web服务器要保持与Web客户机的连接,并在应用服务器空闲时发出请求。
应用服务器只需处理它能够及时派发的请求。
IBM的文档中推荐了Web应用程序布局方法和各种队列的调优方法。
但是注意,IBM建议应该避免在WebSphere中排队。
这意味着应该把发送给WebSphere应用服务器的请求速率控制在能够立即处理的范围内。
Web服务器(或Web服务器前面的代理服务器)应该限制过多的连接,让它们等待处理。
这确保负载比较重的应用服务器队列能够把时间花在为有限的请求提供服务上,而不是试图同时为所有请求提供服务。
作为开发人员,应该按照一些一般原则提高应用程序的可伸缩性。
这些原则可以应用于大多数Web应用程序。
应用程序应该以某种方式向收集系统提供度量值(即使收集系统仅仅是日志文件)。
这些度量值包括访问应用程序中某个函数的频率或处理一个请求花费的时间等。
这并不会使应用程序运行得更快,但是有助于了解应用程序为什么会变慢以及代码的哪些部分花费的时间最长。
了解什么时候调用某些函数,这有助于把在系统上观察到的现象(比如CPU忙或磁盘活动量高)与应用程序中的活动(比如上传图像)联系起来。
能够了解站点上发生的情况,这是扩展站点容量的关键。
您认为不够优化的代码部分可能不会造成问题。
只有通过适当的度量,才能发现真正的瓶颈。
Web在本质上是无状态的。
用户发出的每个请求都独立于以前的请求。
但是,应用程序常常是有状态的。
用户必须登录应用程序以证明自己的身份,在访问站点期间可能要维护购物车的状态,还可能要填写供以后使用的个人信息。