性能优化现象和判断

系统性能优化

性能优化现象和判断

  • 提出性能优化现象
    • 前台访问很慢,请帮忙分析优化
    • 用户对性能很不满意,再不解决就要投诉
    • 数据库负载很重,请帮忙分析一下
    • xxx功能打开需要1分钟,请帮忙分析一下
  • 在接到这些性能优化的时候,运维工程师希望能够了解下面的信息以判断问题的类型:
    • 系统性问题:比如CPU利用率,SWAP利用率,或者IO过高导致的整体性能下降
    • 功能性问题:整体性能良好,个别功能时延很长
    • 新出现问题:什么时候开始的?之前系统有哪些变动?(升级或者管理的资源大量增加)
    • 不规律问题:有时候快,有时候慢,没有特定的规律
    • 性能快慢的衡量标准是什么?原来多少秒,现在多少秒,目标是多少秒?

性能分析目的

  • Linux性能分析的目的
    • 找出系统性能瓶颈(包括硬件瓶颈和软件瓶颈)
    • 提供性能优化方案(升级硬件?改进系统结构?)
    • 达到合理的硬件和软件配置
    • 使系统资源使用达到最大的平衡
  • 一般情况下系统良好运行的时候恰恰各项资源达到了一个平衡状态,任何一项资源的过度使用都会造成平衡体系破坏,从而造成系统负载极高或者响应迟缓
  • 比如cpu过度使用会造成大量进程等待cpu资源,系统响应变慢,等待会造成进程数增加,进程增加又会造成内存使用增加,内存耗尽又会造成虚拟内存使用,使用虚拟内存又会造成磁盘IO增加和cpu开销增加

性能分析步骤

需要系统监控工具和性能分析工具

  • 对资源使用状况进行长期的监控和数据采集(nagios、cacti、ganglia、zabbix)
  • 使用常见的性能分析工具(vmstattop、htop、iotopfreeiostatifstat等)
  • 实战技能和经验积累

出现性能问题的可能原因

  • 应用程序设计的缺陷和数据库查询的滥用最可能导致性能问题
  • 性能瓶颈可能使因为程序差、内存不足、磁盘瓶颈,但最终表现出的结构就是cpu耗尽,系统负载极高,响应迟缓,甚至暂时失去响应
  • 物理内存不够时会使用交换内存,使用swap会带来磁盘io和cpu的开销
  • 可能造成cpu瓶颈的问题:频繁执行perl,php,java程序生成动态web;数据库查询大量where子句、order by、group by排序等
  • 可能造成内存瓶颈的问题:高并发用户访问、系统进程多、java内存泄漏等
  • 可能造成磁盘io瓶颈的问题:生成cache文件,数据库频繁更新,或者查询大表等

影响linux性能的因素

  • cpu
    • cpu使操作系统稳定运行的根本,cpu的速度与性能在很大程度上决定了系统整体的性能,因此,cpu数量越多、主频越高,服务器性能就相对越好,但事实并非如此
    • 目前大vu分cpu在同一时间内只能运行一个进程,超线程的处理器可以在同一时间运行多个线程,因此可以利用处理器的超线程特性提高系统性能。另外,linux内核会把多核的处理器当作多个单独的cpu来识别,例如两个4核的cpu,在linux系统中会被当做8个单核cpu。但是从cpu性能角度来说,两个4核的cpu喝8个单核的cpu并不完全等价,根据权威部门得出的测试结论,前者的整体性能要比后者低25%~30%
    • 可能出现cpu性能瓶颈的应用有邮件服务器、动态web服务器等,对于这列应用,要把cpu的配置和性能放在主要位置
  • 内存
    • 内存的大小也是影响linux性能的一个重要因素,内存太小,系统进程将被阻塞,应用也会变得缓慢,甚至失去响应;内存太大,导致资源浪费。linux系统采用了物理内存和虚拟内存两种方式,虚拟内存虽然可以缓解物理内存的不足,但是占用过多的虚拟内存,应用程序的性能将明显下降,要保证应用程序的高性能运行,物理内存一定要够大
    • 可能出现内存性能瓶颈的应用有redis内存数据库服务器、cache服务器、静态web服务器等,对于这类应用要把内存大小放在主要位置
  • 磁盘IO性能
    • 磁盘的io性能直接影响应用程序的性能,在一个有频繁读写的应用中,如果磁盘io性能得不到满足,就会导致应用停滞。好在如今的磁盘都采用了很多方法来提高io性能,比如常见的磁盘RAID技术
    • 根据磁盘组合方式的不同,RAID可以分为RAID0、RAID1、RAID2、RAID3、RAID4、RAID5、RAID6、RAID7、RAID0+1、RAID10等级别,常用的RAID级别有RAID0、RAID1、RAID5、RAID0+1
    • RAID0:这种方式成本低,没有容错和数据修复功能,因而只能用在对数据安全性要求不高的环境中
    • RAID1:也就是磁盘镜像,通过把一个磁盘的数据镜像到另一个磁盘上,最大限度地保证磁盘数据的可靠性和可修复性,具有很高的数据冗余能力,但磁盘利用率只有50%,因而,成本最高,多用在保存重要数据的场合
    • RAID5:采用了磁盘分段加奇偶校验技术,从而提高了系统可靠性,RAID5读出效率很高,写入效率一般,至少需要3块盘。允许一块磁盘 故障,而不影响数据的可用性
    • RAID0+1:把RAID0和RAID1技术结合起来就成了RAID0+1,至少需要4个硬盘。此种方式的数据除了分布在多个盘上外,每个磁盘都有其镜像盘,提供全冗余能力,同时允许一个磁盘故障,而不影响数据可用性,并具有快速读、写能力
    • 通过了解各个RAID级别的性能,可以根据应用的不同特性,选择适合自身的RAID级别,从而保证应用程序在磁盘方面达到最优性能
    • 目前常用的磁盘类型有STAT、SAS、SSD磁盘,STAT、SAS使普通磁盘,读写效率一般,如果要保证高性能的写操作,可以采用SSD固态磁盘,读写速度可达600MB/s
  • 网络带宽
    • 网络带宽也是影响性能的一个重要因素,低俗的、不稳定的网络将导致网络应用程序的访问阻塞,而稳定、高速的网络带宽,可以保证应用程序在网络上畅通无阻地运行。幸运地是,现在网络一般都是千兆带宽或光纤网络,带宽问题对应用程序性能造成的影响也在逐步降低
    • 组件网络时,如果局域网内有大量数据传输需求(hadoop大数据业务、数据库业务),可采用千兆、万兆网络接口,针对每个服务器,如果单网卡效率不够,可采用双网卡绑定技术,提高网卡数据传输带宽和性能

数据库瓶颈问题

  • 上层业务逻辑大并发访问数据库,数据库服务器无法短时间内处理所有请求

  • 解决办法(中间加一层):

    • 队列+连接池,建立数据库连接池,将所有请求入队,数据库服务器按本身处理速度从队列中取请求执行
    • 主要业务逻辑计算挪到应用服务器处理,数据库直左辅助查询业务处理
    • 缓存:如redis等能扛高并发的中间件缓存,先查询缓存,再查询数据库,这又会引起缓存同步问题

    • 数据库读写分离、负载均衡:数据库读操作»写操作
    • 数据分区(分库、分表)
      • 分库:数据库可以按照一定的逻辑,把表分散到不同的数据库,也称垂直分区
      • 分表:将一个表的数据分到多个表存储,查询时按照某种规则(如hash)定位数据所在表进行查询,也称为水平分区
  • 应用服务器负载均衡

    • 增加一个任务服务器(如nginx)实现,任务服务器可以监视应用服务器的负载,检测其是cpu负载高,还是IO、并发、内存换页高
    • 查询到这些信息后,选取负载最低的服务器分配任务

服务器性能四大杀手

  • 数据拷贝:使用缓存机制,指的是服务器内部的缓存,如内核空间到用户空间的缓存
  • 环境切换:线程切换开销,理性创建线程

  • 内存分配:内存池,减少内存分配,向操作系统申请内存
  • 锁竞争:避免锁使用

大型网站架构演变过程

Web服务器与数据库分离

  • 将Web服务器与数据库服务部署到不同的物理服务器上,避免造成二者互相影响性能

Web动静资源分离

  • 静态资源:html、js、css、images等
  • 动态资源:jsp、php等
  • 静态服务器:Apache、Nginx等
  • 动态(应用)服务器:Tomcat、Jetty等
  • 静态页面可以缓存在前端(静态)服务器中,动态请求则转发到后端(动态应用)服务器处理业务逻辑,实现动静分离

缓存处理

  • 客户端(浏览器)缓存
  • 前端页面缓存(squid)
  • 页面片段缓存ESI(Edge Side Includes)
  • 本地数据缓存
  • 数据库缓存

Web Server集群+读写分离

cluster_read_write_split

CDN、分布式缓存、分库分表

  • CDN

cdn

  • 分布式缓存

    dist_cache

  • 垂直分区

    vertical_split

  • 水平分区

    horizontal_split

多数据中心+分布式存储与计算

dist_data

(33) 单条记录高并发访问的优化

服务器端:

  • 使用缓存,如redis等
  • 使用分布式架构进行处理
  • 将静态页面和静态资源存储在静态资源服务器,需要处理的数据使用服务器进行计算后返回
  • 将静态资源尽可能在客户端进行缓存
  • 采用ngnix进行负载均衡 (nginx读作恩静埃克斯 = Engine X)

数据库端:

  • 数据库采用主从赋值,读写分离措施
  • 建立适当的索引
  • 分库分表