可以从哪些方面进行调优?
CPU子系统
内存子系统
IO子系统
网络子系统
调优的步骤:
确定应用类型
IO密集型:数据库
CPU密集型:动态页面的web服务器
建立基准数据
安装监控工具
发现问题,发掘原因,调整-->观察--->调整
调优的准则:
有目的的去调优。
一次只对一个领域进行调整。
每次只改一个设置。
建议采用两种以上性能测试工具。
经验很重要。
CPU子系统
查看cpu信息
# cat /proc/cpuinfo
# dmidecode --type processor
# dmidecode --type cache
中断 设备通知内核,完成了一次数据处理过程。也可以理解为:cpu停止下来去执行别的指令。例如:完成一次IO。或者完成一次网络数据包的发送。
内核处理过程 --- 控制优先级,进行任务调度。
用户进程
上下文切换
运行队列
常见cpu性能数据采集工具:
vmstat,top,uptime
mpstat
sar <--systat
# uptime
11:02:04 up 1:21, 2 users, load average: 2, 0.95, 0.97
1核心的cpu
负载中的数字代表当前有多少个任务等待cpu的处理和正在处理
2,代表当前cpu正在处理1个任务,还有3个任务在等待。
4,代表当前cpu正在处理1个任务,还有3个任务在等待。
4核心的cpu
2,其中两个核心的cpu正在处理两个任务,没有任务在等待。
8,四个任务正在被cpu处理,还有四个任务在等待。
一般来说,一个核心的cpu,存在2-3个等待的任务是属于正常。
# vmstat 2 每2秒钟采集一下数据
# vmstat 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 被硬件虚拟化的虚拟机所消耗掉的时间百分比
us:sy ~= 7:3
# vmstat 3 5
# mpstat -P ALL 2
# sar -u 查看cpu相关的历史数据
# sar -u 2 3
# sar -q 2 3
runq-sz 运行队列
内存子系统
虚拟内存
把内存上暂时用不到的数据,但不能不用的数据,临时保存到磁盘(swap)或者磁盘文件(虚拟内存文件)中。但需要用到这些数据的时候,就重新从磁盘上读取到内存中。 由内核kswapd进程完成
内存页(page) 默认是4K大小。这是操作内存数据的最小基本单位。
内存分页(paging) 内核经常扫描内存,如果发现内存的空闲空间低于某个值,那么就会把内存上的数据同步到硬盘。这些一般都是曾经打开过的文件,这些文件数据加载到内存中,然后已经被修改过,现在文件不再需要读取,那么就可以把他们同步到磁盘。由内核pdfulsh进程完成。
# free -m
total used free shared buffers cached
Mem: 2017 1937 79 0 72 1460
-/+ buffers/cache: 405 1612
Swap: 4094 0 4094
buffers
缓冲区 ,用于缓存刚访问过,或者经常被访问的文件的数据。用于提高系统访问文件的效率,减少频繁读取磁盘文件。
cached
高速缓存,用户缓存经常打开的文件的文件描述符号(指针)
# vmstat 2 3
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 78060 75364 1496028 0 0 79 11 303 1178 31 15 53 0 0
1 0 0 78308 75364 1496036 0 0 0 0 4331 1240 32 18 50 0 0
1 0 0 78340 75364 1496036 0 0 0 0 4359 1252 33 19 49 0 0
si 有多少数据从swap读取到内存中
so 有多少数据从内存写到swap分区
bi 有多少数据从块设备读取到内存中
bo 有多少数据从内存中写到内存中
# /usr/bin/time -v date
...
Major (requiring I/O) page faults: 0 主要页面故障
Minor (reclaiming a frame) page faults: 204 次要页面故障
...
Page size (bytes): 4096 《--内存页为4K
主要页面故障:
当执行某个进程的时候,进程需要读取某些数据,而这些数据在cache,buffer(在内存中)找不到,就会产生一次主要页面故障。
次要页面故障
进程在执行的时候,需要的数据在内存中可以找到,就叫做次要页面故障。
系统为了提高访问效率,总是把数据缓冲起来,以便在内存中直接操作数据,减少磁盘的读写。其实就是一个尽可能减少主要页面故障,增加次要页面故障的过程
# /usr/bin/time -v command ...
对比主,次页面故障的数值,如果发现主页面故障在第二次之后会减少,说明系统缓存了相关数据。
# sar -B 2 3
14时34分52秒 pgpgin/s pgpgout/s fault/s majflt/s
14时34分54秒 0.00 21.89 25.87 0.00
14时34分56秒 0.00 0.00 12.50 0.00
14时34分58秒 0.00 0.00 229.70 0.00
Average: 0.00 7.30 89.72 0.00
模拟实验:
工具: mem.php
原理:大量读取文件,把文件数据保存在内存。
# ab -c 30 -n 2000 http://10.1.1.22:8080/test/mem.php
IO子系统调优
vmstat,iostat,sar
IO,输出输入。
一个IO,指的是从磁盘把数据读出来或者把数据写磁盘上,就称之为一个IO。
IOPS 每秒钟完成多少个IO
10k RPM <--每分钟一万转,120 IOPS
15 RPM <--每分钟15000转, 150-200 IOPS
# iostat 2
# iostat -x -d sda2 2 3
Linux 2.6.18-164.el5 (dev.upl.com) 2011年09月01日
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
sda2 18.33 9.57 12.16 5.83 891.33 123.20 56.38 0.26 14.26 2.81 5.05
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
sda2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
sda2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
r/s 每秒完成多少个读IO
w/s 每秒完成多少个写IO
rsec/s 每秒读取了多少扇区的数据。 一个扇区=512字节数据
wsec/s 每秒写了多少扇区的数据。
avgrq-sz 跟upload中负载一样的概念
await
平均完成IO需要等待多少时间, 包含服务时间,还有在队列中等待的时间。
svctm
服务时间,从IO请求产生到,完成IO的时间。
%util
磁盘带宽使用百分比。如果一直都是100%,说明磁盘很忙。
# iostat
Linux 2.6.18-164.el5 (dev.upl.com) 2011年09月01日
avg-cpu: %user %nice %system %iowait %steal %idle
23.93 0.00 12.12 1.33 0.00 62.62
Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
sda 10.15 445.94 84.03 646864 121890
sda1 0.06 1.01 0.02 1468 26
sda2 9.88 438.18 83.59 635602 121248
sda3 0.02 0.75 0.00 1086 0
tps 每秒传输量(包括读IO和写IO)
Blk_read/s = rsec/s Blk=1扇区
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
sdb1 0.96 75.75 87.42 36.08 1624.72 894.63 20.40 1.50 12.18 3.98 49.15
如何计算每秒钟读写多少KB数据?
1624.72 x 512 / 1024 = 812KB数据
如何计算每个IO能够读写多少KB数据?
每秒读取的数据/每秒的IO数量 = 812 / 87 = 9.33
IO的类型:
随机IO
一般的硬盘处理效率最慢的就是随机IO。每个IO完成的数据量非常低。
顺序IO
这些IO涉及数据都是连续存放在磁盘上。
基本的IO优化:
1、优化分区
把频繁读取的数据应该放在最外层的分区。
2、文件系统的优化
取消访问时间更新的功能
mount -o noatime /dev/sda3 /web
3、选择正确块大小
# mkfs.ext3 -b 4096 /dev/sda1
# dumpe2fs -h /dev/sda1
4、使用更高端的文件系统
ext4,zfs