Linux服务器常见参数监测及调优(一)

服务器常见参数监测及调优(一)

调优的步骤:

确定应用类型

IO密集型:数据库

CPU密集型:动态页面的web服务器

建立基准数据

安装监控工具

发现问题,发掘原因,调整-->观察--->调整

调优的准则:

有目的的去调优。

一次只对一个领域进行调整。

每次只改一个设置。

建议采用两种以上性能测试工具。

经验很重要。

CPU子系统

CPU 的占用主要取决于什么样的资源正在 CPU 上面运行,

比如拷贝一个文件通常占用较少 CPU,因为大部分工作是由 DMA(Direct Memory Access)完成,

只是在完成拷贝以后给一个中断让CPU知道拷贝已经完成

科学计算通常占用较多的 CPU,大部分计算工作都需要在 CPU 上完成,内存、硬盘等子系统只做暂时的数据存储工作

要想监测和理解 CPU 的性能需要知道一些的操作系统的基本知识,比如:中断、进程调度、进程上下文切换、可运行队列等

CPU 很无辜,是个任劳任怨的打工仔,每时每刻都有工作在做(进程、线程)并且自己有一张工作清单(可运行队列)

由老板(进程调度)来决定他该干什么,他需要和老板沟通以便得到老板的想法并及时调整自己的工作(上下文切换)

部分工作做完以后还需要及时向老板汇报(中断)

所以打工仔(CPU)除了做自己该做的工作以外,还有大量时间和精力花在沟通和汇报上。

CPU 也是一种硬件资源,和任何其他硬件设备一样也需要驱动和管理程序才能使用,我们可以把内核的进程调度看作是 CPU 的管理程序,

用来管理和分配 CPU 资源,合理安排进程抢占 CPU,并决定哪个进程该使用 CPU、哪个进程该等待

操作系统内核里的进程调度主要用来调度两类资源:进程(或线程)和中断,进程调度给不同的资源分配了不同的优先级,优先级最高的是硬件中断,其次是内核(系统)进程,最后是用户进程。

每个 CPU 都维护着一个可运行队列,用来存放那些可运行的线程。

线程要么在睡眠状态(blocked 正在等待 IO)要么在可运行状态,如果 CPU 当前负载太高而新的请求不断,

就会出现进程调度暂时应付不过来的情况,这个时候就不得不把线程暂时放到可运行队列里。

打工仔接受和完成多少任务并向老板汇报了(中断);

打工仔和老板沟通、协商每项工作的工作进度(上下文切换);

打工仔的工作列表是不是都有排满(可运行队列);

打工仔工作效率如何,是不是在偷懒(CPU 利用率)

  现在把打工仔换成 CPU,我们可以通过查看这些重要参数:中断、上下文切换、可运行队列、CPU 利用率来监测 CPU 的性能。

那么监测 CPU 性能的底线是什么呢?通常我们期望我们的系统能到达以下目标:

CPU 利用率,如果 CPU 100% 利用率,那么应该到达这样一个平衡:65%-70% User Time30%-35% System Time0%-5% Idle Time;

  上下文切换,上下文切换应该和 CPU 利用率联系起来看,如果能保持上面的 CPU 利用率平衡,大量的上下文切换是可以接受的;

  可运行队列,每个可运行队列不应该有超过1-3个线程(每处理器),比如:双处理器系统的可运行队列里不应该超过6个线程。

查看cpu信息

# cat /proc/cpuinfo

# dmidecode --type processor

# dmidecode --type cache

中断 设备通知内核,完成了一次数据处理过程。也可以理解为:cpu停止下来去执行别的指令。例如:完成一次IO。或者完成一次网络数据包的发送。

内核处理过程 --- 控制优先级,进行任务调度。

用户进程

上下文切换 --- 把正在占用cpu的进程放回队列中(每次内核的上下文切换,资源被用于关闭在CPU寄存器中的线程和放置在队列中)

运行队列

常见cpu性能数据采集工具:

vmstat,top,uptime

mpstat --需要yum install sysstat

sar  --需要yum install sysstat

# vmstat 2  2秒钟采集一下数据

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      0  78112  63432 1519100    0    0   233    18 1906 1190 26 13 59  1  0

 1  0      0  78112  63432 1519100    0    0     0     0 4180 1378 33 17 50  0  0

 1  0      0  78112  63440 1519092    0    0     0    30 4284 1706 33 17 50  0  0

r 运行队列。单核cpu,不应该超过3

b 当前被阻塞的进程,一般这些进程都是在等待某些外部资源而被阻塞。>3需要注意,而且一直出现或者经常出现,就更值得注意

in 中断数。一般代表大量设备操作成功通知内核。

cs 上下文切换。一般代表任务需要紧急被cpu处理。数字高,只能说明内核在充分发挥它的任务调度作用。不能简单通过该数字判断cpu就出现瓶颈。

us 用户进程所占用的cpu时间的百分比

sy 内核在进行任务调度所占用的cpu时间的百分比

id cpu空闲所占用的时间百分比.仅仅0不能简单判断cpu出现瓶颈,只能说它被充分被留用。

wa 等待IO所消耗时间百分比

st 被硬件虚拟化的虚拟机所消耗掉的时间百分比

# vmstat -p /dev/sda1

# vmstat -d

mpstat vmstat 类似,不同的是 mpstat 可以输出多个处理器的数据

# mpstat  -P ALL 1 ---P ALL表示查看所有CPU核, 1表示每一秒显示一次

10:46:35 AM  CPU   %user   %nice    %sys %iowait    %irq   %soft  %steal   %idle    intr/s

10:46:36 AM  all   26.13    0.00    6.53    0.00    3.52    9.05    0.00   54.77  19478.22

10:46:36 AM    0   25.74    0.00    6.93    0.00    2.97    7.92    0.00   56.44   9740.59

10:46:36 AM    1   26.73    0.00    6.93    0.00    3.96   10.89    0.00   51.49   9739.60

# while :; do ps -eo pid,ni,pri,pcpu,psr,comm | grep 'firefox'; sleep 1; done

-----------------------------------------------------------

nice  优先级    能调的范围是 -2019 -20表示优先级最高,19最低

用户运行一个程序默认给的优先级为0

renice    对一个已经运行的进程进行nice值的调整

renice 19  pid

# vim /tmp/test.sh

a=1

while [ $a -lt 1000000 ]

do

        let a++

done

nice 优先级高的能够优先分配资源,跑得快,花费的时间少,负载越高,效果越明显

实验

在一个负载高的情况下做效果更好,比如一个大文件的cp

第一个终端:

# time sh /tmp/test.sh

real    0m39.363s

user    0m26.338s

sys     0m0.900s

第二个终端:

# time nice --19 sh /tmp/test.sh --19 第一个是参数的横杠,第二个是负号

real    0m26.881s

user    0m26.008s

sys     0m0.871s

--对比上面的时间,可以看到 高优先级的花费的时间少

可以把上面的实验再做一次,马上用top查出-19pid值,并使用renice修改

renice 19  9683

# time sh /tmp/test.sh

real    0m34.665s

user    0m26.277s

sys     0m0.896s

# time nice --19 sh /tmp/test.sh

real    0m37.231s

user    0m26.094s

sys     0m0.905s

--从上面的时间可以看出,-19优先级的半路被改为19后,所花费的时间反而多了

注意:只有管理员才能把优先级往高调,普通用户只能调自己的,并且只能往低调,调低后还不能再调高

-----------------------------------------------------------

# sar -u  查看cpu相关的历史数据 --这是历史数据,是每十分钟会去采集一次系统相关的数据

# sar -u 2 3 --两秒一次,显示三次(不是历史数据,是当前动态数据)

sysstat  --> 提供 sar 命令 (system activity reporter)

sar的特点:可以对过去时间的系统状态进行分析,但不能对某个进程进行深入分析,只能对系统的整体情况进行分析。

yum install sysstat   -y

# service sysstat start

# chkconfig sysstat on

安装systat包后,就会自动在 /var/log/sa/saxx 产生数据   xx代表日期

可以使用sar -f /var/log/sa/saxx  去访问  加参数就可以访问不同类型的性能数据

指定查询之前的日期与固定时间点的方法

 sar -u -f /var/log/sa/sa28 --查看这个月已经过的28号的cpu历史数据

 sar -u -f /var/log/sa/sa28  -s 09:00:00 -e 10:00:00 --指定只看289点到10点的cpu历史数据

Linux 3.10.0-693.el7.x86_64 (localhost.localdomain) 04/28/2018 _x86_64_ (1 CPU)

09:27:58 AM       LINUX RESTART

09:31:48 AM       LINUX RESTART

09:40:01 AM     CPU     %user     %nice   %system   %iowait    %steal     %idle

09:50:01 AM     all      0.91      0.00      4.09      0.26      0.00     94.74

Average:        all      0.91      0.00      4.09      0.26      0.00     94.74

保存性能数据

sar支持保存成两种格式的文件,一种是文本文件,一种是二进制文件 (只有通过sar自己的命令 -f 参数 才能看)

保存为文本文件,可以直接cat命令查看

sar -p 1 5 > /tmp/test/sar1.txt

保存为二进制文件

sar -p  1 5  -o /tmp/test/sar2.txt 1>/dev/null     --会显示到屏幕,可以用1>/dev/null

file /tmp/test/sar2.txt      --data类型文件

sar -f /tmp/test/sar2.txt     --使用-f参数读取  

 sar  --->  每分钟 收集信息 --> /var/log/sa/sa日期

sar -p  (cpu default)   ( sar -P 0 | 1 )

sar -r  (内存信息)

sar -b  ( 硬盘 I/O )

DEV 磁盘设备

tps 每秒传输数(或者每秒IO数)

rd_sec/s 每秒512字节读取数

wr_sec/s 每秒512字节写入数

sar   -n  DEV   显示网络接口信息

sar   -n  EDEV  显示关于网络错误的统计数据

sar   -n  SOCK  显示套接字信息

sar   -n  ALL    显示以上所有信息

===========================================================

内存子系统

CPU---内存---磁盘  (异步)

内存” 包括物理内存和虚拟内存,

虚拟内存(Virtual Memory)把计算机的内存空间扩展到硬盘,

物理内存(RAM)和硬盘的一部分空间(SWAP)组合在一起作为虚拟内存为计算机提供了一个连贯的虚拟内存空间,

好处是我们拥有的内存 “变多了”,可以运行更多、更大的程序,

坏处是把部分硬盘当内存用整体性能受到影响,硬盘读写速度要比内存慢几个数量级,

并且 RAM SWAP 之间的交换增加了系统的负担。

虚拟内存

把内存上暂时用不到的数据,但不能不用的数据,临时保存到磁盘(swap)或者磁盘文件(虚拟内存文件)中。

但需要用到这些数据的时候,就重新从磁盘上读取到内存中。

由内核kswapd进程完成

ps -ef |grep kswapd

内存页(page) 默认是4K大小。这是操作内存数据的最小基本单位(类似于文件系统里的block)

内存分页(paging) 内核经常扫描内存,如果发现内存的空闲空间低于某个值,那么就会把内存上的数据同步到硬盘。

这些一般都是曾经打开过的文件,这些文件数据加载到内存中,然后已经被修改过,

# /usr/bin/time -v mysql  --此命令显示的倒数第二行有内存页的大小

......

Page size (bytes): 4096

Exit status: 1

[root@srv253 ~]# free

              total        used        free      shared  buff/cache   available

Mem:         500472      303324        8872        6640      188276      154796

Swap:       1048572        5344     1043228

# /usr/bin/time -v date

...

        Major (requiring I/O) page faults: 0 主要页面故障

        Minor (reclaiming a frame) page faults: 204 次要页面故障

...

        Page size (bytes): 4096 <--内存页为4K

主要页面故障:(类似于缓存未命中miss)

当执行某个进程的时候,进程需要读取某些数据,而这些数据在cache,buffer(在内存中)找不到,就会产生一次主要页面故障。

次要页面故障: (类似于缓存命中hit)

进程在执行的时候,需要的数据在内存中可以找到,就叫做次要页面故障。

系统为了提高访问效率,总是把数据缓存起来,以便在内存中直接操作数据,减少磁盘的读写。

其实就是一个尽可能减少主要页面故障,增加次要页面故障的过程

小实例测试:

/usr/bin/time -v firefox    运行两次可以看到,第二次运行已经主要页面故障为0了,因为进程所需的数据已经在内存中,并且感觉到firefox打开速度变快

echo 3 > /proc/sys/vm/drop_caches  --此命令是扔掉内存中的缓存

然后再用/usr/bin/time -v firefox 执行,会发现主要页面故障又不为0,而且明显感觉到firefox打开速度变慢.说明缓存没有命中

记住几点:

物理内存与虚拟内存交换的单位就是内存页

内存页大小为4096

内核会在物理内存不够时,使用虚拟内存或者是物理内存有空闲时,也会使用虚拟内存(会使用最近最少使用算法,把最近不常用的也会给虚拟内存)

内存里的数据会在满足特定条件时才会写到磁盘(这些条件可以通过修改内核参数来实现优化)

linux系统会把你访问过的程序或文件都缓存起来,甚至你的程序关闭也不释放相关的缓存.

查看内存状态相关的命令

free,top,vmstat,sar

# free

             total       used       free     shared    buffers     cached

Mem:       3893984    1635316    2258668          0       7692    1052848

-/+ buffers/cache:     574776    3319208

Swap:      4095992          0    4095992

# vmstat

procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----

 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st

 0  0      0 2258668   7692 1052824    0    0   134    21  298  423  4  1 95  1  0

--从上面的比较可以看到,vmstat里的freebuff,cache的值对应free 命令里的free,buffers,cached

si 有多少数据从swap读取到内存中

so 有多少数据从内存写到swap分区

bi 有多少数据从块设备读取到内存中

bo 有多少数据从内存中写到内存中

--如果你看到swapd使用比较多,free+buff+cache的值很小,并且siso比较频繁,说明可用内存很小,并且swap使用很多,swap交互也频繁,表明内存遇到瓶颈了

# sar -B 2 3

Linux 3.10.0-693.el7.x86_64 (srv253) 06/11/2018 _x86_64_ (1 CPU)

10:19:17 AM  pgpgin/s pgpgout/s   fault/s  majflt/s  pgfree/s pgscank/s pgscand/s pgsteal/s    %vmeff

10:19:19 AM      0.00      0.51     31.98      0.00     22.84      0.00      0.00      0.00      0.00

10:19:21 AM      0.00      0.00     13.71      0.00     11.68      0.00      0.00      0.00      0.00

10:19:23 AM      0.00      0.00     11.68      0.00     14.21      0.00      0.00      0.00      0.00

Average:         0.00      0.17     19.12      0.00     16.24      0.00      0.00      0.00      0.00

pgpgin/s   每秒从磁盘page in内存的 kilobytes

pgpgout/s  每秒从内存page out磁盘的 kilobytes

fault/s    每秒的(major+minor) page faults之和

majflt/s   每秒的major page faults

--如果pgpginpgpgout很多,majflt/fault这个内存miss率很高.而且系统运行的程序也是固定的,这就有可能说明内存不够用了.造成缓存不了所有数据,以致内存命中率低

===========================================================

与内存和swap有关的参数

# cat /proc/sys/vm/swappiness

60

swappiness表示使用swap分区的使用程度,可以适当调整swappiness=0的时候表示尽可能使用物理内存swap空间.swappiness=100积极使用swap.

# cat /proc/sys/vm/dirty_background_ratio

10

--这里表示内存里的脏数据到达10%,会触发写到磁盘

# cat /proc/sys/vm/dirty_ratio

20

--这里表示内存里的脏数据到达20%时,就不能再写入脏数据了,也就表示要让应用程序等待了,等这个值下降,才能继续写

程序经cpu处理的数据-->内存 --> 磁盘

--这两个参数合起来理解就是:内存脏数据到dirty_background_ratio定义的10%时,就会触发数据写到磁盘(但是这个过程是异步的,也就是说还是会有别的应用程序的脏数据能继续写到内存),如果应用程序往内存里写的比内存往磁盘里写得快,还是有可能达到dirty_ratio定义的20%时,那么就要让写脏数据的应用程序等待,直到它降低到20%以下,再继续写

理解了上面两个参数的意思,现在如何来调整

把它调大,会提高写入磁盘速度(因为一次写的数据量大);但这样也有缺点,有可能一次写的数据量过大,造成磁盘IO峰值

把它调小,虽然速度会较慢,但可以削平IO峰值

猜你喜欢

转载自blog.csdn.net/qq_26496673/article/details/80677032