1.性能分析目的
一般情况下系统良好运行的时候恰恰各项资源达到了一个平衡体,任何一项资源的过渡使用都会造成平衡体系破坏,从而造成系统负载极高或者响应迟缓。
比如CPU
过度使用会造成大量进程等待CPU
资源,系统响应变慢,等待会造成进程数增加,进程增加又会造成内存使用增加,内存耗尽又会造成虚拟内存使用,使用虚拟内存又会造成磁盘IO
增加和CPU
开销增加)。
其目的如下:
- 找出系统性能瓶颈,包括硬件和软件瓶颈;
- 提供性能优化方案,一般是升级硬件或者改进系统结构;
- 达到合理的硬件和软件配置,充分利用资源;
- 使系统资源使用达到最大的平衡。
2.性能分析工具及原因
2.1系统监控和性能分析工具
1)对资源的使用状况进行长期的监控和数据采集(nagios、cacti、ganglia、zabbix)
。
2)使用常见的性能分析工具(vmstat、top、htop、iotop、free、iostat等)
。
2.2出现性能问题的可能原因
1)应用程序设计的缺陷和数据库查询的滥用最有可能导致性能问题。
2)性能瓶颈可能是因为程序差/内存不足/磁盘瓶颈,但最终表现出的结果就是CPU
耗尽,系统负载极高,响应迟缓,甚至暂时失去响应。
3)物理内存不够时会使用交换内存,使用swap
会带来磁盘IO
和cpu
的开销。
4)可能造成cpu
瓶颈的问题:频繁执行Perl
,php
,java
程序生成动态web
;数据库查询大量的where子句
、order by/group by
排序等。
5)可能造成内存瓶颈问题:高并发用户访问、系统进程多,java
内存泄露等。
6)可能造成磁盘IO
瓶颈问题:生成cache
文件,数据库频繁更新,或者查询大表等。
3.影响Linux性能的硬件因素
3.1 CPU
CPU
是操作系统稳定运行的根本,CPU
的速度与性能在很大程度上决定了系统整体的性能,因此,CPU
数量越多、主频越高,服务器性能也就相对越好。但事实并非完全如此。
目前大部分CPU
在同一时间内只能运行一个线程,超线程的处理器可以在同一时间运行多个线程,因此,可以利用处理器的超线程特性提高系统性能。另外,Linux
内核会把多核的处理器当作多个单独的CPU
来识别,例如两个4核
的CPU,在Linux
系统下会被当作8个
单核CPU
。但是从性能角度来讲,两个4核
的CPU
和8个
单核的CPU
并不完全等价,根据权威部门得出的测试结论,前者的整体性能要比后者低25%~30%
。
可能出现CPU瓶颈的应用有:
- 邮件服务器
- 动态Web服务器等
对于这类应用,要把CPU
的配置和性能放在主要位置。
3.2 内存
内存的大小也是影响Linux
性能的一个重要的因素,内存太小,系统进程将被阻塞,应用也将变得缓慢,甚至失去响应;内存太大,导致资源浪费。Linux
系统采用了物理内存和虚拟内存两种方式,虚拟内存虽然可以缓解物理内存的不足,但是占用过多的虚拟内存,应用程序的性能将明显下降,要保证应用程序的高性能运行,物理内存一定要足够大。
可能出现内存性能瓶颈的应用有:
redis
内存数据库服务器cache
服务器- 静态
Web
服务器等
对于这类应用要把内存大小放在主要位置。
3.3 磁盘I/O
性能
磁盘的I/O
性能直接影响应用程序的性能,在一个有频繁读写的应用中,如果磁盘I/O
性能得不到满足,就会导致应用停滞。好在现今的磁盘都采用了很多方法来提高I/O
性能,比如常见的磁盘RAID
技术。
根据磁盘组合方式的不同,RAID
可以分为RAID0,RAID1、RAID2、RAID3、RAID4、RAID5、RAID6、RAID7、RAID0+1、RAID10
等级别,常用的RAID
级别有RAID0、RAID1、RAID5、RAID0+1
。
- RAID 0: 这种方式成本低,没有容错和数据修复功能,因而只能用在对数据安全性要求不高的环境中。
- RAID 1: 也就是磁盘镜像,通过把一个磁盘的数据镜像到另一个磁盘上,最大限度地保证磁盘数据的可靠性和可修复性,具有很高的数据冗余能力,但磁盘利用率只有
50%
,因而,成本最高,多用在保存重要数据的场合。 - RAID5: 采用了磁盘分段加奇偶校验技术,从而提高了系统可靠性,
RAID5
读出效率很高,写入效率一般,至少需要3块
盘。允许一块磁盘故障,而不影响数据的可用性。 - RAID0+1 :把
RAID0
和RAID1
技术结合起来就成了RAID0+1
,至少需要4个
硬盘。此种方式的数据除分布在多个盘上外,每个盘都有其镜像盘,提供全冗余能力,同时允许一个磁盘故障,而不影响数据可用性,并具有快速读/写能力。
通过了解各个RAID级别
的性能,可以根据应用的不同特性,选择适合自身的RAID
级别,从而保证应用程序在磁盘方面达到最优性能。
目前常用的磁盘类型有:
SATA、SAS、SSD磁盘,SATA、SAS是普通磁盘,读写效率一般。
如果要保证高性能的写操作,可采用SSD固态磁盘,读写速度可达600MB/s。
3.4 网络带宽
网络带宽也是影响性能的一个重要因素,低速的、不稳定的网络将导致网络应用程序的访问阻塞,而稳定、高速的网络带宽,可以保证应用程序在网络上畅通无阻地运行。幸运的是,现在的网络一般都是千兆带宽或光纤网络,带宽问题对应用程序性能造成的影响也在逐步降低。组建网络时,如果局域网内有大量数据传输需求(hadoop
大数据业务、数据库业务),可采用 千兆、万兆网络接口 ,针对每个服务器,如果单网卡效率不够,可采用双网卡绑定技术,提高网卡数据传输带宽和性能。
4.影响Linux性能的系统软件因素
4.1 系统安装优化
系统优化可以从安装操作系统开始,当安装Linux
系统时,磁盘的划分,SWAP
内存的分配都直接影响以后系统的运行性能。
磁盘分配可以遵循应用的需求:
1)对写操作频繁而对数据安全性要求不高的应用,可以把磁盘做成 RAID 0 。
2)对数据安全性较高,对读写没有特别要求的应用,可以把磁盘做成 RAID 1 。
3)对读操作要求较高,而对写操作无特殊要求,并要保证数据安全性的应用,可以选择 RAID 5 。
4)对读写要求都很高,并且对数据安全性要求也很高的应用,可以选择 RAID 01 。这样通过不同的应用需求设置不同的RAID级别,在磁盘底层对系统进行优化操作。
随着内存价格的降低和内存容量的日益增大,对虚拟内存SWAP
的设定, 现在已经没有了所谓虚拟内存是物理内存两倍的要求 ,但是SWAP
的设定还是不能忽略。
根据经验:
1)如果内存较小(物理内存小于4GB
),一般设置SWAP
交换分区大小为内存的 2倍 。
2)如果物理内存大于8GB小于16GB
,可以设置SWAP
大小等于或略小于物理内存即可。
3)如果内存大小在16GB
以上,原则上可以设置SWAP
为0
,但并不建议这么做,因为设置一定大小的SWAP
还是有一定作用的。
4.2 内核参数优化
系统安装完成后,优化工作并没有结束,接下来还可以对系统内核参数进行优化,不过内核参数的优化要和系统中部署的应用结合起来整体考虑。
例如1:如果系统部署的是Oracle数据库
应用
需要对下面参数进行优化:
- 系统共享内存段
(kernel.shmmax、kernel.shmmni、kernel.shmall)
- 系统信号量
(kernel.sem)
- 文件句柄
(fs.file-max)
等参数进行优化设置
例如2:如果部署的是Web应用
需要根据Web
应用特性进行网络参数的优化,例如修改:
net.ipv4.ip_local_port_range
net.ipv4.tcp_tw_reuse
net.core.somaxconn
等网络内核参数
4.3 文件系统优化
文件系统的优化也是系统资源优化的一个重点,在Linux
下可选的文件系统有ext3、ext4、xfs
,根据不同的应用,选择不同的文件系统。
Linux
标准文件系统是从VFS
开始的,然后是ext
,接着就是ext2
,应该说,ext2
是Linux
上标准的文件系统,ext3
是在ext2
基础上增加日志形成的,从VFS
到ext4
,其设计思想没有太大变化,都是早期UNIX
家族基于超级块和inode
的设计理念。
5.LINUX
系统性能分析常用工具
5.1 vmstat
命令
vmstat
是Virtual Meomory Statistics
(虚拟内存统计)的缩写,很多linux
发行版本都默认安装了此命令工具,利用vmstat
命令可以对操作系统的内存信息、进程状态、CPU活动
等进行监视,不足之处是无法对某个进程进行深入分析。
vmstat
使用语法如下:
vmstat [-V] [-n] [delay [count]]
各个选项及参数含义如下:
-V:表示打印出版本信息,是可选参数。
-n:表示在周期性循环输出时,输出的头部信息仅显示一次。
delay:表示两次输出之间的间隔时间。
count:表示按照“delay”指定的时间间隔统计的次数。默认为1。
例如1:每3秒钟更新一次输出信息,循环输出,按ctrl+c
停止输出。
[root@kzkvm2020 ~]# vmstat 3
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 1 8197576 788644 5220 70329504 0 0 1 9 0 0 4 1 95 0 0
3 0 8197576 789348 5220 70329536 0 0 0 56 12489 22259 5 1 93 0 0
4 0 8197576 788244 5220 70329536 0 0 0 68 12155 22217 5 1 93 1 0
4 0 8197576 787272 5220 70329544 0 0 0 327 19515 33777 10 2 88 1 0
0 0 8197576 786792 5220 70329568 0 0 0 100 16109 27523 7 1 91 1 0
2 0 8197576 785832 5220 70329616 0 0 0 541 13482 23128 8 1 91 0 0
^C
[root@kzkvm2020 ~]#
例如2:每3秒更新一次输出信息,统计5次后停止输出。
[root@kzkvm2020 ~]# vmstat 3 5
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 8197576 793644 5220 70329840 0 0 1 9 0 0 4 1 95 0 0
2 0 8197576 792904 5220 70329848 0 0 0 123 11646 21835 5 1 94 0 0
2 0 8197576 793192 5220 70329832 0 0 0 311 11841 21998 4 1 94 1 0
21 1 8197576 793204 5220 70329840 0 0 0 47 12995 23976 5 1 94 0 0
1 0 8197576 792468 5220 70329840 0 0 0 53 18821 33921 7 2 91 0 0
[root@kzkvm2020 ~]#
5.2 iostat命令
iostat
是I/O statistics
(输入/输出统计)的缩写,主要的功能是对系统的磁盘I/O
操作进行监视。
它的输出主要显示磁盘读写操作的统计信息,同时也会给出CPU使用
情况。同vmstat
一样,iostat
也不能对某个进程进行深入分析,仅对系统的整体情况进行分析。
iostat
使用语法如下:
iostat [ -c | -d ] [ -k ] [ -t ] [ -x [ device ] ] [ interval [ count ] ]
各个选项及参数含义如下:
-c:显示CPU的使用情况。
-d:显示磁盘的使用情况。
-k:每秒以k bytes为单位显示数据。
-t:打印出统计信息开始执行的时间。
-x device:指定要统计的磁盘设备名称,默认为所有的磁盘设备。
interval:指定两次统计间隔的时间;
count:按照“interval”指定的时间间隔统计的次数。
比如:每隔1秒统计
[root@kzkvm2020 ~]# iostat -xz 1
Linux 3.10.0-957.el7.x86_64 (kzkvm2020) 2022年09月17日 _x86_64_ (32 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
4.02 0.00 0.65 0.37 0.00 94.97
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0.03 0.23 0.38 13.11 21.23 294.20 46.77 0.20 15.19 2.85 15.55 9.12 12.30
dm-0 0.00 0.00 0.00 0.07 0.05 0.62 19.12 0.00 40.86 5.43 41.89 12.01 0.08
dm-1 0.00 0.00 0.04 0.14 0.14 0.58 8.00 0.01 45.40 3.76 55.70 0.47 0.01
dm-2 0.00 0.00 0.37 13.13 21.04 293.01 46.52 0.21 15.31 2.83 15.66 9.05 12.21
avg-cpu: %user %nice %system %iowait %steal %idle
7.28 0.00 1.11 0.13 0.00 91.48
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0.00 0.00 0.00 8.00 0.00 76.00 19.00 0.08 10.38 0.00 10.38 7.62 6.10
dm-2 0.00 0.00 0.00 6.00 0.00 68.00 22.67 0.08 13.83 0.00 13.83 10.17 6.10
avg-cpu: %user %nice %system %iowait %steal %idle
5.02 0.00 1.59 0.22 0.00 93.16
5.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、EDEV、SOCK和FULL。DEV显示网络接口信息,EDEV显示网络错误的统计数据,SOCK显示套接字信息,FULL显示三个所有的信息。它们可以单独或者一起使用。
interval:表示采样间隔时间,是必须有的参数。
count:表示采样次数,是可选参数,默认值是1。
6.系统性能分析判断参考标准
性能调优的主要目的是使系统能够有效的利用各种资源,最大的发挥应用程序和系统之间的性能融合,使应用高效、稳定的运行。但是,衡量系统资源利用率好坏的标准没有一个严格的定义,针对不同的系统和应用也没有一个统一的说法,因此,这里提供的标准其实是一个经验值,下面给出了判定系统资源利用状况的一般准则:
6.1 理想情况下
影响性能因素 | 判断标准 |
---|---|
CPU | user% + sys%< 70% |
内存 | Swap In(si)=0,Swap Out(so)=0 |
磁盘 | iowait % < 20% |
6.2 坏的情况下
影响性能因素 | 判断标准 |
---|---|
CPU | user% + sys%= 85% |
内存 | Per CPU with 10 page/s |
磁盘 | iowait % =35% |
6.3 糟糕情况下
影响性能因素 | 判断标准 |
---|---|
CPU | user% + sys% >=90% |
内存 | More Swap In & Swap Out |
磁盘 | iowait % >= 50% |
其中:
%user:表示CPU处在用户模式下的时间百分比。
%sys:表示CPU处在系统模式下的时间百分比。
%iowait:表示CPU等待输入输出完成时间的百分比。
swap in:即si,表示虚拟内存的页导入,即从SWAP DISK交换到RAM。
swap out:即so,表示虚拟内存的页导出,即从RAM交换
文章来源:Python运维实践