系统性能优化
性能优化现象和判断
- 提出性能优化现象
- 前台访问很慢,请帮忙分析优化
- 用户对性能很不满意,再不解决就要投诉
- 数据库负载很重,请帮忙分析一下
- xxx功能打开需要1分钟,请帮忙分析一下
- 在接到这些性能优化的时候,运维工程师希望能够了解下面的信息以判断问题的类型:
- 系统性问题:比如CPU利用率,SWAP利用率,或者IO过高导致的整体性能下降
- 功能性问题:整体性能良好,个别功能时延很长
- 新出现问题:什么时候开始的?之前系统有哪些变动?(升级或者管理的资源大量增加)
- 不规律问题:有时候快,有时候慢,没有特定的规律
- 性能快慢的衡量标准是什么?原来多少秒,现在多少秒,目标是多少秒?
性能分析目的
- Linux性能分析的目的
- 找出系统性能瓶颈(包括硬件瓶颈和软件瓶颈)
- 提供性能优化方案(升级硬件?改进系统结构?)
- 达到合理的硬件和软件配置
- 使系统资源使用达到最大的平衡
- 一般情况下系统良好运行的时候恰恰各项资源达到了一个平衡状态,任何一项资源的过度使用都会造成平衡体系破坏,从而造成系统负载极高或者响应迟缓
- 比如cpu过度使用会造成大量进程等待cpu资源,系统响应变慢,等待会造成进程数增加,进程增加又会造成内存使用增加,内存耗尽又会造成虚拟内存使用,使用虚拟内存又会造成磁盘IO增加和cpu开销增加
性能分析步骤
需要系统监控工具和性能分析工具
- 对资源使用状况进行长期的监控和数据采集(nagios、cacti、ganglia、zabbix)
- 使用常见的性能分析工具(vmstat、top、htop、iotop、free、iostat、ifstat等)
- 实战技能和经验积累
出现性能问题的可能原因
- 应用程序设计的缺陷和数据库查询的滥用最可能导致性能问题
- 性能瓶颈可能使因为程序差、内存不足、磁盘瓶颈,但最终表现出的结构就是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集群+读写分离
CDN、分布式缓存、分库分表
- CDN
-
分布式缓存
-
垂直分区
-
水平分区
多数据中心+分布式存储与计算
(33) 单条记录高并发访问的优化
服务器端:
- 使用缓存,如redis等
- 使用分布式架构进行处理
- 将静态页面和静态资源存储在静态资源服务器,需要处理的数据使用服务器进行计算后返回
- 将静态资源尽可能在客户端进行缓存
- 采用ngnix进行负载均衡 (nginx读作恩静埃克斯 = Engine X)
数据库端:
- 数据库采用主从赋值,读写分离措施
- 建立适当的索引
- 分库分表