10种最常见的Web应用程序的性能问题

10种最常见的Web应用程序的性能问题

2015/04/07 · HTML5,
JavaScript ·
性能

本文由 伯乐在线 –
段昕理
翻译,艾凌风
校稿。未经许可,禁止转载!
英文出处:www.neotys.com。欢迎加入翻译组。

Web应用程序总是不可避免的会发生问题。Neotys公司(法国一家负载测试解决方案提供商)的业务主要是通过网站监控和测试帮助您避免这些问题。但任何地方都可能出问题,有时候你只需要知道去哪找就可以了。因此,我们将您经常碰到的一些性能问题并整理成一个简短的指引。

请务必要记住,解决性能问题的最佳方式就是在其影响用户之前就发现并消除。一个良好的维护计划可以成为你的好帮手。制定停机时间策略,创建冗余和扩展计划。为用户负载在一个月或一年后可能会达到的量级做提前的思考。当然,首先要定期做测试负载并持续监控产品性能。

无论你对网站考虑得如何周全,但是有些问题总是要发生的。下面是一些常见性能问题的原因和解决办法。

一个了不起的创意会产生一个很棒的产品,如果它一炮走红,你发现手中的是下一个facebook
或者twitter,而且随着用户越来越多,会变得越来越慢,该怎么办呢?对全栈而言,解决这类问题的一个重要技能就是——负载均衡。

问题 1: 糟糕的代码

糟糕的代码会使Web应用程序出现诸如算法低效、内存溢出、以及死锁等问题。软件版本过旧,或是集成了历史遗留的系统同样会拖累性能。确保你的团队成员都在使用适合其岗位的工具
– 从自动化分析到最佳编程实践的代码审查工具。

什么是负载均衡

负载(load)一词起源于典型系统,指连接在电路中消耗电能的装置,负载(用电器)的功能是把电能转变为其他形式能。引申出来,一个是实体,一个转化。

于是,对于实体,有了通信帧或者报文中数据字段的内容被称为信息负载(payload),网络负载指的就是网络中继承载的流量以及网络设备承载的用户量。

转化被进一步阐释为资源的使用情况,系统平均负载是CPU的Load
即workload,它所包含的信息不是CPU的使用率状况,而是在一段时间内CPU正在处理以及等待CPU处理的进程数之和的统计信息。

了解了负载,那么负载均衡就容易理解了。wiki百科给出的定义是这样的:

负载均衡(Load
balancing)是一种计算机网络技术,用来在多个计算机(计算机集群)、网络连接、CPU、磁盘驱动器或其他资源中分配负载,以达到最佳化资源使用、最大化吞吐率、最小化响应时间、同时避免过载的目的。使用带有负载平衡的多个服务器组件,取代单一的组件,可以通过冗余提高可靠性。负载平衡服务通常是由专用软件和硬件来完成。

并且,wiki百科自身的系统就使用了负载均衡。

wikipedia

每一种技术都有它应用的场景和领域,负载均衡主要解决的是系统性能问题。但是,了解了根源,就可以知道不能够一提到性能问题就非负载均衡莫属,如果负载减少了,可能少一点均衡也可以解决问题,这样的技术例如缓存。

问题 2:未经优化的数据库

优化好的数据库可以达到很好的安全级别和处理性能,反之,没有优化的数据库可能会拖垮生产环境下的应用程序。索引的缺失会减慢SQL的查询性能,从而使整个网站变慢。一定要用脚本和文件分析检查任何低效的查询。

基于DNS的负载均衡

基于DNS的负载均衡是负载均衡的最简方法,可以说是穷人的负载均衡。

DNS会将域名映射为IP地址,反之亦然。所有核心DNS服务器都是集群,用的最多的DNS服务器大概就是BIND了。查询DNS服务器时,推荐使用dig;查询DNS解析时,推荐使用nslookup。
使用DNS缓存可以提高DNS解析的性能。Dig 在mac上的使用示例如下:

dig 用法

对于DNS实现的负载均衡非常简单,采用轮转的方式,只要为所要服务的域名增加多个A记录即可。
例如:

abel.com. IN A 168.168.168.168 

abel.com. IN A 168.168.168.168 

abel.com. IN A 168.168.168.168 

abel.com. IN A 168.168.168.168

基于DNS的负载均衡简单,易于调试且容易扩展。缺陷在于它有慢性失忆症,无法将会话信息从一个请求保留到下一个请求。而且,只是对目标服务地址进行了均衡,无法考虑请求处理的负载强度进行均衡,同时容错性较差。

支持DNS 负载均衡的服务商有AWS Route 53 以及dnspod。

问题 3:失控的数据增长

数据系统一般会随时间的推移变慢。制定一项计划来管理和监控数据,因为维持数据的增长对高性能的Web应用不可或缺。首先,找出业务中导致数据增长的主因。然后,研究并制定合适的存储解决方案。留意所有数据库、缓存、以及更复杂存储方案的选项。

HTTP 负载均衡

负载均衡解决的是性能问题,要先了解单个服务器的状况。一般地,nginx
的应答率比Apache 高,所以,有时更换Web 服务器就可以提高性能。

提高Apache
Http的方法有禁用空载模块,禁用DNS查询,采用压缩模块,不使用SymLinksIfOwnerMatch选项,并且在Directory选项中启用FollowSymLinks,等等。

Nginx本身就是高性能的,但可以通过worker_processes
和worker_cpu_affinity调整来匹配服务器的硬件平台,还可以对压缩进行区分对待,使用其缓存的能力。例如

Http{
        gzip on;
        gzip_static on;
        gzip_comp_level 2;
        gzip_types application/javascript;
}

HTTP的负载均衡相当于7层负载均衡,不论Apache 还是 Nginx
都可以充当HTTP的负载均衡器。

以基于权重的负载均衡为例,可以配置Nginx把请求更多地分发到高配置的后端服务器上,把相对较少的请求分发到低配服务器。配置的示例如下:

http{ 
  upstream sampleapp { 
    server 192.168.1.23 weight=2; 
    server 192.168.1.24; 
  } 
  .... 
  server{ 
    listen 80; 
    ... 
    location / { 
     proxy_pass http://myapp; 
    } 
 } 

Nginx
作为负载均衡工作在7层,可以对做正则规则处理(如针对域名、目录进行分流等)
,配置简单,能ping通就能进行负载功能,可以通过端口检测后端服务器状态,不支持url检测。Nginx
负载均衡抗高并发,采用epoll网络模型处理客户请求,但应用范围受限。

问题 4:流量峰值

我们通常认为流量的增长是件好事。但是当做完市场推广或是经历了疯狂传播的热门视频后,应用程序如果没有做好相应的准备,任何人都知道流量峰值会造成什么结果。提前准备是关键,同时搭建一个通过模拟用户做监测的预警系统例如 NeoSense。这样一来,你就会提前发现流量增长影响到了业务,从而避免了用户的糟糕体验。

数据库负载均衡

数据库负载均衡的一般用法从读写分离开始的,因为一般的应用都是读多写少的缘故吧。将数据库做成主从,主数据用于写操作,从数据库用于读操作,事务一般在主库完成。

数据库集群是数据库负载均衡的典型方式,集群管理服务器作为负载均衡器,例如mysql
cluster。

更简单的方式是通过Haproxy 来完成负载均衡的调度。

Haproxy 均衡数据库

HAProxy能够补充Nginx的一些缺点比如Session的保持,Cookie的引导等工作,支持url检测后端的服务器出问题的检测会有很好的帮助。

HAProxy拥有更多的负载均衡策略比如:动态加权轮循(Dynamic Round
Robin),加权源地址哈希(Weighted Source
Hash),加权URL哈希和加权参数哈希(Weighted Parameter
Hash)等,单纯从效率上来讲HAProxy更会比Nginx有更出色的负载均衡速度。

问题 5:糟糕的负载分发

糟糕的分发机制会将新的请求分配到已经当机的服务器,而不是备用待机服务器上,导致服务器响应速度急剧变慢。如果过多的人同时访问同一个服务器,即使这个系统性能远低于瓶颈,还是会造成这样的问题。利用类似NeoLoad的工具测试产品势在必行,它有助于你发现任何薄弱的环节。

网络连接的负载均衡

LVS(IPVS,IP虚拟服务器)是在四层交换上设置Web服务的虚拟IP地址,对客户端是可见的。当客户访问此Web应用时,客户端的Http请求会先被第四层交换机接收到,它将基于第四层交换技术实时检测后台Web服务器的负载,根据设定的算法进行快速交换。常见的算法有轮询、加权、最少连接、随机和响应时间等。

LVS抗负载能力强,使用IP负载均衡技术,只做分发,所以LVS本身并没有多少流量产生。
LVS的稳定性和可靠性都很好应用范围比较广,可以对所有应用做负载均衡,缺陷是不支持正则处理,不能做动静分离。

通过LVS+Keepalived构建的LVS集群,LVS负载均衡用户请求到后端服务器,Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器。

下图是Keepalived的原理图:

KeepLived 的原理图

问题 6:默认设置

系统必须适当调整。默认设置会让一个新的组件很容易启动并运行,但对真正生产环境中的Web应用程序来说未必适合。检查每一项设定:线程数、内存和权限分配。确保所有的配置参数匹配Web应用程序的要求,而不是仅仅为了方便。

SSL负载均衡

信任是互联网的基石,出于安全性的考量,服务中往往需要SSL的连接。SSL
有两种认证方式:双向认证 SSL 协议要求服务器和用户双方都有证书;单向认证
SSL
协议不需要客户拥有CA证书。一般Web应用,配置SSL单向认证即可。但部分金融行业用户的应用对接,可能会要求对客户端(相对而言)做身份验证。这时就需要做SSL双向认证。

SSL 属于应用层的协议,所以只能在 7 层上来做,而 HAProxy 也是支持 SSL
协议的,所以一种方式是只需简单的让 HAProxy 开启 SSL
支持完成对内解密对外加密的处理, 但引入 SSL
处理是有额外的性能开销的(如上面谈到的认证), 所以 一般采用SSL proxy
farm, 典型的架构如下:

SSL 负载均衡

发表评论

电子邮件地址不会被公开。 必填项已用*标注