- 引言
- 本书涉及的内容
- 第 1 部分 Python 开发入门
- 第 1 章 Python 入门
- 第 2 章 开发 Web 应用
- 第 3 章 Python 项目的结构与包的创建
- 第 4 章 面向团队开发的工具
- 第 5 章 项目管理与审查
- 第 6 章 用 Mercurial 管理源码
- 第 7 章 完备文档的基础
- 第 8 章 模块分割设计与单元测试
- 第 9 章 Python 封装及其运用
- 第 10 章 用 Jenkins 持续集成
- 第 11 章 环境搭建与部署的自动化
- 第 12 章 应用的性能改善
- 第 13 章 让测试为我们服务
- 第 14 章 轻松使用 Django
- 第 15 章 方便好用的 Python 模块
- 附录 A VirtualBox 的设置
- 附录 B OS(Ubuntu)的设置
12.1 Web 应用的性能
Web 应用负荷过重时会产生哪些问题?面对负荷过重应采取什么对策?选择对策时又应该进行哪些考量呢?接下来我们将了解一下这些问题。
12.1.1 Web 应用面对大量集中请求时会产生哪些问题
当应用服务器接收到的请求增多时,如果一个请求尚未处理完又接到了下一个请求(即两个请求几乎同时到达),那么后一个请求将被加入队列,等待前一个请求处理完毕。即便是可以并行处理多个请求的服务器,一旦到了并行处理数的极限,后到的请求也会被加入队列,等待处理的线程将越来越多。
这种状态会使应用服务器进入高负荷状态,出现 CPU 负担加重、内存空间不足等问题。
高负荷状态下应用可能无法正常运行,或者性能出现明显下降。以第 2 章中编写的 Web 应用为例,这个应用在 Python 的 SimpleHTTPServer 模块的 Web 应用服务器上运行,然而这个服务器是单进程单线程的,无法同时处理多个请求。因此请求集中到达时等待处理的请求会增多,应用性能会下降。
另外,等待队列也是有上限的,具体上限与硬件本身的性能有关。一旦等待数达到上限,新的请求将被视为无法处理的请求,表现为切断连接,请求失败。另外,队列达到上限有时会造成服务器的程序异常停止,导致无法连接服务器。
这些问题在客户端会表现为无法连接、反应慢、频繁报错等。该状态会影响用户对应用的正常使用。
12.1.2 针对高负荷的对策
解决高负荷状态需要哪些对策呢?
高负荷其实可以细分为很多种,不同种的负荷解决方法也不同。比如应用服务器的 CPU 处理能力不足了,结果我们换了一块性能更好的硬盘,这显然无法解决问题。
因此要明确问题所在,选择合适的对策。下面是几种典型问题及其对策。
问题- | 解决方法 |
CPU 占用率高 | 增加处理的进程和线程数。更换成性能更好的 CPU |
硬盘 I/O 负荷高 | 优化读取、写入数据的方法。更换成性能更好的硬盘。 |
内存不足 | 释放被无用程序占用、分配的内存。增加物理内存。 |
除此之外还有许多解决方法,不过本章将以上述 3 点为中心进行说明。另外,为提高改善性能的效率,需要遵循以下原则。
· 从预期效果最大的方法开始尝试
· 从所需资金、步骤、时间最少的方法开始尝试
· 实施对策前后各评估一次性能
第一条“从预期效果最大的方法开始尝试”是因为如果先采用了效果较小的方法,日后再采用效果较大的方法时,前一个方法的效果会被覆盖掉,这就使前一次的工作成了无用功。
第二条“从所需资金、步骤、时间最少的方法开始尝试”指优先选择性价比高的方法,把成本高成效低的方法摆到次要位置。
第三条“实施对策前后各评估一次性能”是为了掌握该对策的实际效果。评估结果能明确告诉我们成本换来了多少效果。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论