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会带来磁盘IOcpu的开销。

4)可能造成cpu瓶颈的问题:频繁执行Perlphpjava程序生成动态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核CPU8个单核的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 :把RAID0RAID1技术结合起来就成了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以上,原则上可以设置SWAP0,但并不建议这么做,因为设置一定大小的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,应该说,ext2Linux上标准的文件系统,ext3是在ext2基础上增加日志形成的,从VFSext4,其设计思想没有太大变化,都是早期UNIX家族基于超级块和inode的设计理念。

5.LINUX系统性能分析常用工具

5.1 vmstat命令

vmstatVirtual 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命令

iostatI/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 理想情况下
影响性能因素判断标准
CPUuser% + sys%< 70%
内存Swap In(si)=0,Swap Out(so)=0
磁盘iowait % < 20%
6.2 坏的情况下
影响性能因素判断标准
CPUuser% + sys%= 85%
内存Per CPU with 10 page/s
磁盘iowait % =35%
6.3 糟糕情况下
影响性能因素判断标准
CPUuser% + 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运维实践

最后修改:2023 年 05 月 30 日
如果觉得我的文章对你有用,请随意赞赏