可以从哪些方面进行调优?
  
  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