计算机的四个子系统:
cpu子系统
内存子系统
IO子系统(存储设备)
网络子系统
调整的方向:
纵向调整:
在单机的基础上进行调整:
调整软件,调整软件配置参数,改变运行参数
调整硬件:更换硬件
横向调整
使用更多的机器完成同一个任务---集群
CPU
# cat /proc/cpuinfo
# dmidecode --type processor
# dmidecode --type cache
中断 --- 设备通知内核,完成一次数据处理过程。
往往是IO设备产生的,网络设备产生。
内核处理过程---控制优先级、任务(进程)调度
用户进程
上下文切换
内核在做任务调度的时候,调整了任务优先级,这意味着cpu会平凡中断去执行其他优先级更高的程序。
运行队列(系统负载)uptime
平均负载:
背景1:单核心的cpu
load average: 1.43, 3.43, 5.43
过去的1分钟、5分钟、15分钟平均负载分别是1.43,3.43,5.43.
以过去的15分钟为例子,表明,在过去的15分钟里,cpu的运行队列平均长度为5.43,也就意味这,平均有5.43个进程在队列中排队等待cpu处理,在5.43个进程中,有一个进程是正在被处理,4.43个进程在等候处理。
背景2:双核心的cpu
load average: 1.43, 3.43, 5.42
以过去的15分钟为例子,表明,在过去的15分钟里,cpu的运行队列平均长度为5.43,但是由于有两个核心,也就意味着,平均每个核心的cpu有2.71个进程在队列中排队等待cpu处理,在5.43个进程中,有2个进程是正在被处理,3.42个进程在等候处理,平均每个核心有(2.71-1)=1.71个进程在等候处理。
经验:
每个核心平均负载如果大于等于3(1+2)就应该注意。如果再大的话,说明cpu很忙,有很多进程在排队。
cpu利用率
用户进程us , 用户执行的程序
内核调度sy , 内核进行调度(处理中断,进行上下文切换)
空闲 id
等待io wa
top - 11:30:05 up 1:19, 5 users, load average: 0.77, 0.88, 0.70
Tasks: 154 total, 1 running, 152 sleeping, 0 stopped, 1 zombie
Cpu(s): 20.6%us, 0.2%sy, 0.0%ni, 78.9%id, 0.0%wa, 0.2%hi, 0.2%si, 0.0%
vmstat,top,uptime,mpstat,dstat,sar -u / -q
# 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
0 0 0 1122176 81516 413056 0 0 47 13 573 288 21 1 76 1 0
0 0 0 1122052 81516 413056 0 0 0 0 1051 399 20 0 81 0 0
0 0 0 1122300 81516 413088 0 0 0 0 1127 504 19 0 80
与cpu相关的参数输出
procs --system-- -----cpu------
r b in cs us sy id wa st
0 0 573 288 21 1 76 1 0
0 0 1051 399 20 0 81 0 0
0 0 1127 504 19 0 80 0 0
r ---> running ,就是相当于uptime的负载(运行队列)
如果是单核心,数字超过3,就应该注意。
b ---> block ,被阻塞的进程。往往由于进程在等待外部资源。
一般不应该>0,有的话,一般都说明某个进程由于某种原因被阻塞。就应该去关心一下原因。
in ---> 中断数,中断数越高,一般说明内核在频繁地进行任务调度,但更着重与IO设备产生的中断。
cs ---> 上下文切换 ,数字越高,说明很多个不同的进程之间在竞争cpu资源。
us:sy的百分比应该是 7:3 <---应该花更多cpu资源在用户进程上。
wa 如果数字比较大,一般说明由进程在读写磁盘数据,或者接受网络数据,进程被阻塞
跟踪活跃进程
# strace -F -p 3265
跟踪某个准备执行的进程
# strace -F ping -c 1 www.upl.com
# mpstat -P ALL 2
# sar -u
# sar -q 2 5
=============================================================
@内存子系统调优
虚拟内存
内存页
内存分页(paging)--内核就必须经常扫描内存空间并且收回其中未被使用的内存页,把数据同步到硬盘
kswapd
pdflush 进程负责将内存中的内容和文件系统进行同步操
# free -m
total used free shared buffers cached
Mem: 2001 926 1074 0 86 411
-/+ buffers/cache: 428 1572
Swap: 2047 0 2047
buffers
主要是缓存磁盘块的数据,文件描述符
cached
主要是文件系统缓存。
vmstat , time , sar -B ,free
# vmstat 2 3
-----------memory---------- ---swap-- -----io----
swpd free buff cache si so bi bo
0 1099740 89324 420868 0 0 13 5
0 1099368 89324 420868 0 0 0 0
0 1099400 89324 420868 0 0 0 0
si <--- 从swap读取数据加载到内存(in到内存)
so <--- 从内存中把数据写到swap(从内存中out出去)
判断内存是否足够,只需要简单地判断是否使用了交换分区,是否频繁使用交换分区。
主页面故障
程序在执行的时候需要的数据在内存中没有直接得到,需要从外设中读取,就算发生主页面故障。
次页面故障
程序在执行的时候需要的数据在内存中直接得到,不需要从外设中读取,就算发生次页面故障。
系统总是使用各种缓存,缓冲的技术来减少主页面故障,增加次页面故障。
Major (requiring I/O) page faults: 0 主页面故障
Minor (reclaiming a frame) page faults: 222 次页面故障
# procinfo -n 2 可以查看页面调进和调出
如果大量的page in 和page out 只能说明当前内存使用比较活跃
如果有大量swap in 和 swap out 说明内存不足
# sar -B 2 3
Linux 2.6.18-274.el5 (www.upl.com) 2012年07月02日
16时03分17秒 pgpgin/s pgpgout/s fault/s majflt/s
16时03分19秒 0.00 52.00 25.00 0.00
16时03分21秒 0.00 0.00 13.50 0.00
16时03分23秒 0.00 21.89 183.58 0.00
Average: 0.00 24.63 74.21 0.00
案例数据分析
=====================================
@IO子系统调优
IOPS计算
每秒完成的IO数量
IO吞吐量计算
单位时间内,平均每个IO完成的数据量
IO分类
随机IO
连续IO
磁盘的转速
scsi 硬盘 320M/s
10K IOPS:120-150
15K IOPS:150-200
ssd 固态硬盘
iostat指令
# iostat -k -d sda 2
Linux 2.6.18-274.el5 (www.upl.com) 2012年07月02日
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 2.40 22.11 9.09 492465 202455
tps 过去的时间内平均每秒完成了多少个IO
kB_read/s 平均每秒读取多少KB的数据
kB_read 过去的时间内读取了多少数据
测试某个设备的写入速度:
# mount -o sync /dev/sda8 /mnt
# dd if=/dev/zero of=/mnt/1G bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 18.8142 seconds, 57.1 MB/s
# iostat -m -d sda8 2
Linux 2.6.18-274.el5 (www.upl.com) 2012年07月02日
Device: tps MB_read/s MB_wrtn/s MB_read MB_wrtn
sda8 94.50 0.01 45.02 0 90
Device: tps MB_read/s MB_wrtn/s MB_read MB_wrtn
sda8 125.50 0.00 62.00 0 124
Device: tps MB_read/s MB_wrtn/s MB_read MB_wrtn
sda8 133.00 0.00 66.00 0 132
# iostat -x -k -d sda 2
Linux 2.6.18-274.el5 (www.upl.com) 2012年07月02日
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
sda 0.66 25.91 1.68 1.06 21.71 107.89 94.70 0.13 46.32 2.73 0.75
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
sda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
rrqm/s 平均每秒合并的读请求
r/s 平均每秒读IO的数量
avgrq-sz 平均每个请求涉及到多少扇区的数据《--IO吞吐量
avgqu-sz 平均IO队列的长度
%util 设备的带宽的使用百分比。数字越高,说明磁盘越尽力去读写数据。
优化手段:分区、块大小,高级文件系统e4fsprogs,文件系统挂载,IO算法
# yum install e4fsprogs.x86_64
# mkfs.ext4 /dev/sda8
# mkfs.ext4 -b 4096 /dev/sda8
# mount -o noatime /dev/sda8 /web