Linux性能分析与优化

影响Linux服务器的性能的因素

操作系统

  • CPU
    目前多数CPU在同一时间只能运行一个线程,超线程的处理器可以在同一时间处理多个线程,即可利用超线程来提高系统性能。

    SMP内核才支持超线程。
    多核处理器当作多个单独的CPU来识别,但是相对多个单核的CPU的性能,还是低20%-30%。
    出现CPU瓶颈的应用:邮件服务器,Web服务器等。

    说明:SMP的全称是"对称多处理"(Symmetrical Multi-Processing)技术,是指在一个计算机上汇集了一组处理器(多CPU),各CPU之间共享内存子系统以及总线结构。

  • 内存
    内存太小,系统进程将被阻塞,应用变缓慢,失去响应等。
    虚拟内存可以缓解内存不足,过多,导致应用程序性能下降。

说明:虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。
详细说明:https://www.cnblogs.com/004x/p/6651600.html

  • 磁盘I/O性能

磁盘RAID技术,Redundant Array of Independent Disk,即独立磁盘冗余阵列,简称磁盘阵列。
RAID通过将多块独立的磁盘(物理硬盘)按不同的方式组合起来形成一个磁盘组(逻辑硬盘),从而提供比单个磁盘更高的IO性能和数据冗余。

根据磁盘组合方式不同,分为RAID0、RAID1、RAID2、RAID3、RAID4、RAID5、RAID6、RAID7、RAID0+1、RAID10等,常用的有RAID0、RAID1、RAID5、RAID0+1。

RAID0:通过把多块硬盘粘合成一个容量更大的硬盘组,提高磁盘的性能和吞吐量,成本低,至少两块磁盘,但是没有容错和数据修复功能,只能用在对数据安全性要求不高的环境中。

RAID1:也就是磁盘镜像,通过把一个磁盘的数据镜像到另外一个磁盘上,最大限度的保证磁盘数据的可靠性和可修改性,具有很高的数据冗余能力,但是磁盘利用率只有50%,成本较高,多用在保存重要数据的场合。

RAID5:磁盘分段加奇偶校验技术,提高了系统的可靠性。读出效率很高,写效率一般,至少需要3块磁盘,允许一块磁盘故障,不影响数据的可用性。

RAID0+1:把RAID0和RAID1技术结合起来,至少需要4块硬盘,每个盘都有其镜像盘,提高全冗余能力,并具有快速读写能力。

系统性能评估标准

评估指标

参数 糟糕
CPU user%+sys%<70% user%+sys%=85% user%+sys%>=90%
内存 Swap In(si)=0,Swap out(so)=0 Per CPU with 10 page/s More Swap In & Swap Out
磁盘 iowait%<20% iowait%=35% iowait%>=50

注释
%user:表示cpu处在用户模式下的时间百分比。
%sys:表示cpu处在系统模式下的时间百分比。
%iowait:表示cpu等待输入输出完成时间的百分比.
swap in :即si,表示虚拟内存的页导入,即从 SWAP DISK 交换到 RAM
swap out:即so,表示虚拟内存的页导出,即从 RAM 交换到 SWAP DISK .

系统性能分析工具

Vmstat、sar、iostat、netstat、free、ps、top

常用组合方式
  • 用vmstat、sar、iostat检测是否是CPU瓶颈
  • 用free、vmstat检测是否是内存瓶颈
  • 用iostat检测是否是磁盘I/O瓶颈
  • 用netstat检测是否是网络带宽瓶颈
  1. 系统整体性能评估(uptiome)
    [root@instance-0de00bia ~]# uptime
    10:40:03 up 2 days, 23:31, 1 user, load average: 2.28, 2.02, 1.62
    参数解析:load average这个输出值,这三个值的大小一般不能大于系统CUP个数,例如:如果系统有8个CPU,在不能大于8,否则,说明系统负载很高,CPU繁忙。

  2. cpu性能评估
    (1) 利用vmstat命令监控系统CPU
    可以显示关于系统各种资源之间相关性能的简要信息
    [root@instance-0de00bia ~]# vmstat 2 3 #每2秒更新信息,统计三次
    procs -----------memory---------- —swap-- -----io---- -system-- ------cpu-----
    r b swpd free buff cache si so bi bo in cs us sy id wa st
    4 0 0 85940 153632 574660 0 0 3 8 51 136 99 0 1 0 0
    2 0 0 85940 153632 574660 0 0 0 0 1062 128 100 0 0 0 0
    3 0 0 85940 153632 574660 0 0 0 0 1044 124 100 0 0 0 0
    Procs
    r 列 表示运行和等待cpu时间片的进程数,这个值如果长期大于系统cpu的个数,说明cpu不足,需要增加cpu.
    b 列 表示在等待资源的进程数,比如正在等待I/O,或者内存交换等。
    Cpu
    us 列 显示了用户进程消耗的cpu时间百分比。us的值比较高,说明用户进程消耗的cpu时间多,若长期大于50%,需要考虑程序优化和算法优化。
    sy 列显示了内核进程消耗的cpu时间百分比。sy的值较高时,说明内核消耗的cpu资源很多。
    Memory
    spwd列,表示切换到内存交换区的内存数量(以k为单位)。如果swpd的值不为0,或者比较大,只要si,so的值长期为0,不影响性能。
    free 列表示当前空闲的物理内存数量(以k为单位)
    buff列表示buffers cache的内存数量,一般对块设备的读写才需要缓冲。
    cache列,表示page cache的内存数量,一般作为文件系统cached,频繁访问的文件都会被cached,如果cache值较大,说明cached的文件数较多,如果此时IO中的bi比较小,说明文件系统效率比较好。
    Swap
    si列表示磁盘调入内存,也就是内存进入内存交换区的数量
    so列表示内存调入磁盘,也就是内存交换区进入内存的数量。
    一般情况下,si、so的值都为0,如果si、so的值长期不为0,则表示系统内存不足。需要增加系统内存。

(2)利用sar命令监控系统cpu
sar功能很强大,可以对系统的每个方面进行单独的统计,但使用sar命令会增加系统开销(可以忽略)

[root@instance-0de00bia ~]# sar -u 3 5 #u 显示系统所有CPU在采样时间内的负载情况。
Linux 3.10.0-957.21.3.el7.x86_64 (instance-0de00bia) 08/09/2019 x86_64 (1 CPU)
11:11:49 AM CPU %user %nice %system %iowait %steal %idle
11:11:52 AM all 100.00 0.00 0.00 0.00 0.00 0.00
11:11:55 AM all 100.00 0.00 0.00 0.00 0.00 0.00
11:11:58 AM all 100.00 0.00 0.00 0.00 0.00 0.00
11:12:01 AM all 99.67 0.00 0.33 0.00 0.00 0.00
11:12:04 AM all 99.67 0.00 0.33 0.00 0.00 0.00
Average: all 99.87 0.00 0.13 0.00 0.00 0.00
参数剖析

  • %user 列显示了用户进程消耗的cpu时间百分比。
  • %nice 列显示了运行正常进程所消耗的cpu时间百分比。
  • %system 列显示了系统进程消耗的cpu时间百分比
  • %iowait 列显示了IO等待所占用的cpu时间百分比
  • %steal列显示了在内存相对紧张的环境下pagein强制模式下对不同的页面进行的stea操作
  • %idle列显示了cpu处在空闲状态下的时间百分比。
内存性能评估

free 监控linux内存使用状况最常用的指令,示例
[root@instance-0de00bia ~]# free -m #查看以 M 为单位的内存使用情况
total used free shared buff/cache available
Mem: 991 198 79 50 713 569
Swap: 0 0 0
常用指标:应用程序可用内存/系统物理内存>70%,表示系统内存充足,不影响性能,应用程序可用内存/物理内存<20%,表示内存紧缺。20%-70%,恰到好处。

磁盘I/O性能评估

磁盘存储基础

  • 熟悉RAID存储方式,可以根据应用的不通,选择不通的RAID方式。
  • 尽可能用内存的读写代替直接磁盘I/O,使频繁访问的文件或者数据放入内存中进行操作处理,内存读写操作比直接磁盘读写操作高于千倍。
  • 将经常进行读写的文件与长期不变的文件独立出来,分别放置不通磁盘设备上。
  • 对写操作频繁的数据,可以考虑用裸设备代替(减少 I / O 开销,维护开销)(需要专业人士操作)。

裸设备(raw device) :也叫裸分区(原始分区),是一种没有经过格式化,不被Unix通过文件系统来读取的特殊块设备文件。由应用程序负责对它进行读写操作。不经过文件系统的缓冲。它是不被操作系统直接管理的设备。这种设备少了操作系统这一层,I/O效率更高。不少数据库都能通过使用裸设备作为存储介质来提高I/O效率

iostat 评估磁盘性能
[root@instance-0de00bia ~]# iostat -d 2 3 #-d 显示磁盘的使用情况
Linux 3.10.0-957.21.3.el7.x86_64 (instance-0de00bia) 08/09/2019 x86_64 (1 CPU)

Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
vda 1.08 3.09 7.88 827739 2111392

Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
vda 5.97 0.00 25.87 0 52

Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
vda 0.00 0.00 0.00 0 0
解释如下
1. kB_read/s表示每秒读取的数据块数。
2. kB_wrtn/s表示每秒写入的数据块数。
3. kB_read表示读取的所有块数。
4. kB_wrtn表示写入的所有块数。
可以通过kB_wrtn/s,kB_read/s的值对磁盘的读写性能有一个基本的了解,如果kB_wrtn/s值很大,表示磁盘的写操作很频繁,可以考虑优化磁盘或优化城乡,如果kB_read/s值很大,表示磁盘直接读取操作很多,可以将读取的数据放入内存中操作。
对于这两个选项的值没有一个固定的大小,根据系统应用的不通,会有不通的值,但是有一个规则可以遵循:长期的,超大的数据读写,一般是异常的,影响数系统性能。
sar 评估磁盘性能
[root@instance-0de00bia ~]# sar -d 2 3
Linux 3.10.0-957.21.3.el7.x86_64 (instance-0de00bia) 08/09/2019 x86_64 (1 CPU)

01:58:45 PM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
01:58:47 PM dev253-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

01:58:47 PM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
01:58:49 PM dev253-0 12.56 0.00 172.86 13.76 0.01 0.88 0.52 0.65

01:58:49 PM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
01:58:51 PM dev253-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

Average: DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
Average: dev253-0 4.16 0.00 57.24 13.76 0.00 0.88 0.52 0.22
参数定义:
await 表示平均每次设备I/O操作的等待时间(毫秒为单位)
svctm 表示平均每次设备I/O操作的服务时间(以毫秒为单位)。
%util 表示一秒中有百分之几的时间用于I/O操作。

	正常情况下svctm应该小于await值的,而svctm的大小和磁盘性能有关,CPU,内存的负荷也会对svctm值造成影响,过多的请求也会间接的导致svctm值的增加。
	await 值的大小一般取决与svctm的值和I/O列队长度以及I/O请求模式,如果svctm的值与await很接近,表示几乎没有I/O等待,磁盘性能很好,如果await的值远高于svctm的值,则表示I/O队列等待太长,系统上运行的应用程序将变慢,此时可以通过更换更快的硬盘来结局问题。
	%util项的值也是衡量磁盘I/O的一个重要指标,如果%util接近100%,表示磁盘产生的I/O请求太多,I/O系统已经满负荷的工作,磁盘存在瓶颈,势必影响系统性能。(优化程序或更换磁盘)

网络性能解析
- ping 检测网络连通
- netstat -i 组合检测网络接口
- netstat -r 组合检测系统的路由表信息
- sar -n 组合显示系统的网络运行状态 :sar -n DEV 5 3
常用分析脚本
	netstat -an|awk '/^tcp/{++S[$NF]}END{for (a in S)print a,S[a]}'  #查看tcp连接数
	netstat -pant |grep ":80"|awk '{print $5}' | awk -F: '{print $1}'|sort|uniq -c|sort -nr    #查看连接最多的IP

	#提取日志,然后对日志进行排序
	cat access.log | awk '{print $1}'|sort|uniq -c|sort -nr | head -n10
	awk '{print $7}' access.log | sort | uniq -c |sort -nr | head -n10 > test.txt

一段脚本日志:
178.255.215.86 - - [04/Jul/2013:00:00:31 +0800] “GET /tag/316/PostgreSQL HTTP/1.1” 200 4779 “-” “Mozilla/5.0 (compatible; Exabot/3.0 (BiggerBetter); +http://www.exabot.com/go/robot)” “-”- 178.255.215.86 - - [04/Jul/2013:00:00:34 +0800] “GET /tag/317/edit HTTP/1.1” 303 5 “-” “Mozilla/5.0 (compatible; Exabot/3.0 (BiggerBetter); +http://www.exabot.com/go/robot)” “-”- 103.29.134.200 - - [04/Jul/2013:00:00:34 +0800] “GET /code-snippet/2022/edit HTTP/1.0” 303 0 “-” “Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/17.0 Firefox/17.0” “-”- 103.29.134.200 - - [04/Jul/2013:00:00:35 +0800] “GET /user/login?url=http%3A//outofmemory.cn/code-snippet/2022/edit HTTP/1.0” 200 4748 “-” “Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/17.0 Firefox/17.0” “-”-

以下脚本都是基于上面日志格式的,如果你的日志格式不同需要调整awk后面的参数。

分析日志中的UserAgent
cat access_20130704.log | awk -F “”" ‘{print $(NF-3)}’ | sort | uniq -c | sort -nr | head -20
上面的脚本将分析出日志文件中最多的20个UserAgent

分析日志中那些IP访问最多
cat access_20130704.log | awk ‘{print $1}’ | sort | uniq -c | sort -nr | head -20

分析日志中那些Url请求访问次数最多
cat access_20130704.log | awk -F “”" ‘{print $(NF-5)}’ | sort | uniq -c | sort -nr | head -20

awk用法分析:http://docs.mylw.ink/Linux%E5%91%BD%E4%BB%A4/awk-grep%E7%AE%A1%E9%81%93%E5%91%BD%E4%BB%A4/

发布了46 篇原创文章 · 获赞 3 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/tangqing24680/article/details/98941573