一、性能优化需求提出
- 前台访问慢、请帮忙分析优化
- 用户对性能很不满意、在不解决就投诉
- 数据库负载很重、请分析一下
- xxx功能打开需要一分钟、请帮忙分析一下
在接到这些性能优化要求的时候,运维工程师希望能够了解下面的信息以判断问题的类型,而通常情况下,大部分提出性能需求者都给不出这样的信息:
- a)系统性的问题?比如CPU利用率,SWAP利用率或者IO过高导致的整体性能下降?
- b)功能性问题?整体性能良好,个别功能时延很长
- c)新出现问题?什么时候开始的,之前系统有哪些变动?(升级或者管理的资源大量增加) 、
- d)不规律问题?有时候快,有时候慢,没有特定规律
还有性能快慢的衡量标准是什么?原来多少秒,现在多少秒,目标是多少秒?只有上述问题得到了准确的回答,优化工作才能开始。
二、Linux性能分析的目的
-
找出系统性能瓶颈(包括硬件瓶颈和软件瓶颈);
-
提供性能优化的方案(升级硬件?改进系统系统结构?);
-
达到合理的硬件和软件配置;
-
使系统资源使用达到最大的平衡。
一般情况下系统良好运行的时候恰恰各项资源达到了一个平衡体,任何一项资源的过渡使用都会造成平衡体系破坏,从而造成系统负载极高或者响应迟缓。
比如CPU过渡使用会造成大量进程等待CPU资源, 系统响应变慢, 等待会造成进程数增加, 进程增加又会造成内存使用增加, 内存耗尽又会造成虚拟内存使用, 使用虚拟内存又会造成磁盘IO增加和CPU开销增加)
三、性能分析的步骤
1、需要系统监控工具和性能分析工具
- (1) 、对资源的使用状况进行长期的监控和数据采集(nagios、cacti、ganglia、zabbix)
- (2) 、使用常见的性能分析工具(vmstat、top、h top、io top、free、iostat等)
- (3)、实战技能和经验积累。
2、出现性能问题的可能原因
- (1)、应用程序设计的缺陷和数据库查询的滥用最有可能导致性能问题
- (2) 、性能瓶颈可能是因为程序差/内存不足/磁盘瓶颈,但最终表现出的结果就是CPU耗尽, 系统负载极高, 响应迟缓, 甚至暂时失去响应
- (3) 、物理内存不够时会使用交换内存,使用swap会带来磁盘IO和cpu的开销
- (4) 、可能造成cp瓶颈的问题:频繁执Perl, php, java程序生成动态web;数据库查询大量的where子句、orderby/group by排序…
- (5) 、可能造成内存瓶颈问题:高并发用户访问、系统进程多,java内存泄露……
- (6) 、可能造成磁盘IO瓶颈问题:生成cache文件, 数据库频繁更新, 或者查询大表……
四、影响Linux性能的因素
4.1、系统硬件资源
1.CPU
CPU是操作系统稳定运行的根本, CPU的速度与性能在很大程度上决定了系统整体的性能, 因此, CPU数量越多、主频越高,服务器性能也就相对越好。但事实并非完全如此。
目前大部分CPU在同一时间内只能运行一个线程, 超线程的处理器可以在同一时间运行多个线程, 因此, 可以利用处理器的超线程特性提高系统性能。另外, Linux内核会把多核的处理器当作多个单独的CPU来识别, 例如两个4核的CPU, 在Lnux系统下会被当作8个单核CPU。但是从性能角度来讲, 两个4核的CPU和8个单核的CPU并不完全等价, 根据权威部门得出的测试结论,前者的整体性能要比后者低25%~30%。
可能出现CPU瓶颈的应用有邮件服务器、动态Web服务器等, 对于这类应用, 要把CPU的配置和性能放在主要位置。
2.内存
内存的大小也是影响Linux性能的一个重要的因素, 内存太小, 系统进程将被阻塞, 应用也将变得缓慢, 甚至失去响应; 内存太大, 导致资源浪费。Linux系统采用了物理内存和虚拟内存两种方式, 虚拟内存虽然可以缓解物理内存的不足,但是占用过多的虚拟内存,应用程序的性能将明显下降,要保证应用程序的高性能运行,物理内存一定要足够大.
可能出现内存性能瓶颈的应用有red is内存数据库服务器、cache服务器、静态Web服务器等, 对于这类应用要把内存大小放在主要位置。
3.磁盘I/O性能
磁盘的I/O性能直接影响应用程序的性能,在一个有频繁读写的应用中,如果磁盘I/O性能得不到满足,就会导致应用停滞。好在现今的磁盘都采用了很多方法来提高I/O性能, 比如常见的磁盘RAID技术。
根据磁盘组合方式的不同, RAID可以分为RAID 0, RAID 1、RAID 2、RAID 3、RAID 4、RAID 5、RAID 6、RAID 7、RAID 0+1、RAID 10等级别, 常用的RAID级别有RAID 0、RAID 1、RAID 5、RAID 0+1, 这里进行简单介绍。
- RAIDO:这种方式成本低, 没有容错和数据修复功能, 因而只能用在对数据安全性要求不高的环境中。
- RAID 1:也就是磁盘镜像, 通过把一个磁盘的数据镜像到另一个磁盘上, 最大限度地保证磁盘数据的可靠性和可修复性,具有很高的数据冗余能力,但磁盘利用率只有50%,因而,成本最高,多用在保存重要数据的场合。
- RAID 5:采用了磁盘分段加奇偶校验技术, 从而提高了系统可靠性, RAID 5读出效率很高, 写入效率一般, 至少需要3块盘。允许一块磁盘故障,而不影响数据的可用性。
- RAID 0+1:把RAIDO和RAID 1技术结合起来就成了RAID 0+1, 至少需要4个硬盘。此种方式的数据除分布在多个盘上外,每个盘都有其镜像盘,提供全冗余能力,同时允许一个磁盘故障,而不影响数据可用性,并具有快速读/写能力。
通过了解各个RAID级别的性能, 可以根据应用的不同特性, 选择适合自身的RAID级别, 从而保证应用程序在磁盘方面达到最优性能。
目前常用的磁盘类型有STAT、SAS、SSD磁盘, STAT、SAS是普通磁盘, 读写效率一般, 如果要保证高性能的写操作, 可采用SSD固态磁盘, 读写速度可达600MB/s。
4.网络带宽
- 网络带宽也是影响性能的一个重要因素,低速的、不稳定的网络将导致网络应用程序的访问阻塞,而稳定、高速的网络带宽,可以保证应用程序在网络上畅通无阻地运行。幸运的是,现在的网络一般都是千兆带宽或光纤网络,带宽问题对应用程序性能造成的影响也在逐步降低。
- 组建网络时,如果局域网内有大量数据传输需求(hadoop大数据业务、数据库业务), 可采用千兆、万兆网络接口,针对每个服务器,如果单网卡效率不够,可采用双网卡绑定技术,提高网卡数据传输带宽和性能。
4.2、操作系统相关资源
1、系统安装优化
- 系统优化可以从安装操作系统开始, 当安装Linux系统时, 磁盘的划分, SWAP内存的分配都直接影响以后系统的运行性能, 例如,磁盘分配可以遵循应用的需求:对于对写操作频繁而对数据安全性要求不高的应用, 可以把磁盘做成RAID0; 而对于对数据安全性较高,对读写没有特别要求的应用, 可以把磁盘做成RAID 1; 对于对读操作要求较高, 而对写操作无特殊要求, 并要保证数据安全性的应用, 可以选择RAID 5; 对于对读写要求都很高, 并且对数据安全性要求也很高的应用,可以选择RAID 01。这样通过不同的应用需求设置不同的RAID级别, 在磁盘底层对系统进行优化操作。
- 随着内存价格的降低和内存容量的日益增大, 对虚拟内存SWAP的设定, 现在已经没有了所谓虚拟内存是物理内存两倍的要求, 但是SWAP的设定还是不能忽略, 根据经验, 如果内存较小(物理内存小于4GB) , 一般设置SWAP交换分区大小为内存的2倍;如果物理内存大于8GB小于16GB, 可以设置SWAP大小等于或略小于物理内存即可; 如果内存大小在16GB以上,原则上可以设置SWAP为0, 但并不建议这么做, 因为设置一定大小的SWAP还是有一定作用的。
2.内核参数优化
系统安装完成后,优化工作并没有结束,接下来还可以对系统内核参数进行优化,不过内核参数的优化要和系统中部署的应用结合起来整体考虑。例如, 如果系统部署的是Oracle数据库应用, 那么就需要对系统共享内存段(kernel.shmmax、kernel .shmmni、kernel .shmall) 、系统信号量(kernel.sem) 、文件句柄(fs. file-max) 等参数进行优化设置; 如果部署的是Web应用, 那么就需要根据Web应用特性进行网络参数的优化, 例如修改net.ipv4.ip_local_port_range、net.ipv4.tcp_tw_reuse、net.core.somaxconn等网络内核参数。
3.文件系统优化
文件系统的优化也是系统资源优化的一个重点, 在Linux下可选的文件系统有ext 3、ext 4、xfs, 根据不同的应用,选择不同的文件系统。
Linux标准文件系统是从VFS开始的, 然后是ext, 接着就是ext2, 应该说,ext 2是Linux上标准的文件系统,ext 3是在ext 2基础上增加日志形成的, 从VFS到ext4, 其设计思想没有太大变化, 都是早期UNIX家族基于超级块和inode的设计理念。
五、系统性能分析工具
1、vmstat命令
vmstat是Virtual Meo mory Statistics(虚拟内存统计) 的缩写, 很多linux发行版本都默认安装了此命令工具, 利用vmstat命令可以对操作系统的内存信息、进程状态、CPU活动等进行监视, 不足之处是无法对某个进程进行深入分析。vmstat使用语法如下:
vmstat [-V] [-n] [delay[count] ]
各个选项及参数含义如下:
-V:表示打印出版本信息,是可选参数。
-n:表示在周期性循环输出时,输出的头部信息仅显示一次。
delay:表示两次输出之间的间隔时间。
count:表示按照“delay”指定的时间间隔统计的次数。默认为1。
例如:
vmstat 3
表示每3秒钟更新一次输出信息, 循环输出, 按ctrl+c停止输出。
vmstat 3 5
表示每3秒更新一次输出信息,统计5次后停止输出。
2.iostat命令
iostat是I/Ostatistics(输入/输出统计)的缩写, 主要的功能是对系统的磁盘I/O操作进行监视。它的输出主要显示磁盘读写操作的统计信息, 同时也会给出CPU使用情况。同vmstat一样,iostat也不能对某个进程进行深入分析,仅对系统的整体情况进行分析。
iostat一般都不随系统安装, 要使用iostat工具, 需要在系统上安装一个Sysstat的工具包,Sysstat是一个开源软件,官方地址为http://pagesperso-orange.fr/sebastien.godard
安装完毕, 系统会多出3个命令:iostat、sar和mp stat。然后就可以直接在系统下运行iostat命令了。
iostat使用语法如下:
iostat[-c|-d] [-k] [-t] [-x[device] ] [interval[count] ]
各个选项及参数含义如下:
-C:显示CPU的使用情况。
-d:显示磁盘的使用情况。
-k:每秒以kbytes为单位显示数据。
-t:打印出统计信息开始执行的时间。
-xdevice:指定要统计的磁盘设备名称,默认为所有的磁盘设备。
interval :指定两次统计间隔的时间;
count :按照“interval”指定的时间间隔统计的次数。
3、sar命令
sar命令很强大, 是分析系统性能的重要工具之一, 通过sar指令, 可以全面的获取系统的CPU、运行队列、磁盘I/O、分页(交换区) 、内存、CPU中断、网络等性能数据。
sar使用格式为:
sar[options] [-o filename] [interval[count] ]
各个选项及参数含义如下:
options为命令行选项, sar命令的选项很多, 下面只列出常用选项:
-A:显示系统所有资源设备(CPU、内存、磁盘) 的运行状况。
-U:显示系统所有CPU在采样时间内的负载状态。
-P:显示当前系统中指定CPU的使用情况。
-d:显示系统所有硬盘设备在采样时间内的使用状况。
-r:显示系统内存在采样时间内的使用状况。
-b:显示缓冲区在采样时间内的使用情况。
-V:显示进程、文件、I节点和锁表状态。
-n:显示网络运行状态。参数后面可跟DEV、E DEV、SOCK和FULL。DEV显示网络接口信息, E DEV显示网络错误的统计数据, SOCK显示套接字信息, FULL显示三个所有的信息。它们可以单独或者一起使用。
interval:表示采样间隔时间, 是必须有的参数。
count:表示采样次数, 是可选参数, 默认值是1。
六、系统性能分析标准
性能调优的主要目的是使系统能够有效的利用各种资源,最大的发挥应用程序和系统之间的性能融合,使应用高效、稳定的运行。但是,衡量系统资源利用率好坏的标准没有一个严格的定义,针对不同的系统和应用也没有一个统一的说法,因此,这里提供的标准其实是一个经验值,下面给出了判定系统资源利用状况的一般准则:
其中:
%user :表示CPU处在用户模式下的时间百分比。
%sys:表示CPU处在系统模式下的时间百分比。
%iowait:表示CPU等待输入输出完成时间的百分比。
swapin:即si, 表示虚拟内存的页导入, 即从SWAP DISK交换到RAM。
swapout:即so, 表示虚拟内存的页导出, 即从RAM交换到SWAP DISK。
新能调优思路
调优的方法与思路
#yum -y install tuned
[root@cipserver ~]# rpm -ql tuned
/etc/dbus-1/system.d/com.redhat.tuned.conf
/etc/modprobe.d/kvm.rt.tuned.conf
/etc/modprobe.d/tuned.conf
/etc/tuned
/etc/tuned/active_profile
/etc/tuned/bootcmdline
/etc/tuned/profile_mode
/etc/tuned/recommend.d
/etc/tuned/tuned-main.conf
/run/tuned
/usr/lib/python2.7/site-packages/tuned
/usr/lib/python2.7/site-packages/tuned/__init__.py
/usr/lib/python2.7/site-packages/tuned/__init__.pyc
/usr/lib/python2.7/site-packages/tuned/__init__.pyo
/usr/lib/python2.7/site-packages/tuned/admin
/usr/lib/python2.7/site-packages/tuned/admin/__init__.py
/usr/lib/python2.7/site-packages/tuned/admin/__init__.pyc
/usr/lib/python2.7/site-packages/tuned/admin/__init__.pyo
/usr/lib/python2.7/site-packages/tuned/admin/admin.py
/usr/lib/python2.7/site-packages/tuned/admin/admin.pyc
/usr/lib/python2.7/site-packages/tuned/admin/admin.pyo
/usr/lib/python2.7/site-packages/tuned/admin/dbus_controller.py
/usr/lib/python2.7/site-packages/tuned/admin/dbus_controller.pyc
/usr/lib/python2.7/site-packages/tuned/admin/dbus_controller.pyo
/usr/lib/python2.7/site-packages/tuned/admin/exceptions.py
/usr/lib/python2.7/site-packages/tuned/admin/exceptions.pyc
/usr/lib/python2.7/site-packages/tuned/admin/exceptions.pyo
/usr/lib/python2.7/site-packages/tuned/consts.py
/usr/lib/python2.7/site-packages/tuned/consts.pyc
/usr/lib/python2.7/site-packages/tuned/consts.pyo
/usr/lib/python2.7/site-packages/tuned/daemon
/usr/lib/python2.7/site-packages/tuned/daemon/__init__.py
/usr/lib/python2.7/site-packages/tuned/daemon/__init__.pyc
/usr/lib/python2.7/site-packages/tuned/daemon/__init__.pyo
/usr/lib/python2.7/site-packages/tuned/daemon/application.py
/usr/lib/python2.7/site-packages/tuned/daemon/application.pyc
/usr/lib/python2.7/site-packages/tuned/daemon/application.pyo
/usr/lib/python2.7/site-packages/tuned/daemon/controller.py
/usr/lib/python2.7/site-packages/tuned/daemon/controller.pyc
/usr/lib/python2.7/site-packages/tuned/daemon/controller.pyo
/usr/lib/python2.7/site-packages/tuned/daemon/daemon.py
/usr/lib/python2.7/site-packages/tuned/daemon/daemon.pyc
/usr/lib/python2.7/site-packages/tuned/daemon/daemon.pyo
/usr/lib/python2.7/site-packages/tuned/exceptions.py
/usr/lib/python2.7/site-packages/tuned/exceptions.pyc
/usr/lib/python2.7/site-packages/tuned/exceptions.pyo
/usr/lib/python2.7/site-packages/tuned/exports
/usr/lib/python2.7/site-packages/tuned/exports/__init__.py
/usr/lib/python2.7/site-packages/tuned/exports/__init__.pyc
/usr/lib/python2.7/site-packages/tuned/exports/__init__.pyo
/usr/lib/python2.7/site-packages/tuned/exports/controller.py
/usr/lib/python2.7/site-packages/tuned/exports/controller.pyc
/usr/lib/python2.7/site-packages/tuned/exports/controller.pyo
/usr/lib/python2.7/site-packages/tuned/exports/dbus_exporter.py
/usr/lib/python2.7/site-packages/tuned/exports/dbus_exporter.pyc
/usr/lib/python2.7/site-packages/tuned/exports/dbus_exporter.pyo
/usr/lib/python2.7/site-packages/tuned/exports/interfaces.py
/usr