Linux的四个子系统:
cpu子系统
内存子系统
IO子系统
网络子系统
@cpu子系统调优
# uptime
10:21:35 up 47 min, 4 users, load average: 2.21, 2.13, 3.08
单核心cpu的环境:
3.08 表示在过去的15分钟内, 系统运行队列平均长度为3.08 。 也就是有
3.08个进程处于R(运行状态)在运行队列中等待cpu去执行他们的指令,其实一个进
程正在被cpu执行,另外2.08个进程才是等待。
一般来说,如果单个核心的运行队列(系统负载)超过了3,说明
cpu开始比较繁忙。
双核心cpu的环境
3.09 表示在过去的15分钟内, 系统每个核心的运行队列平均长度为1.54 。
一共有2个进程在运行。每个核心在等待的进程是0.54 .
所以当前3.08的负载对于双核的cpu运行环境并不成问题。
中断:------某个事件发生,cpu停止执行当前指令,转而执行引起该中断程序发生的
指令,执行完毕,恢复执行之前被暂停的指令。
引起中断大多是由于硬件引起的。
中断数也看不出系统是否繁忙
uptime:可显示系统负载 。 看 系统负载 忙不忙看是单核cpu还是双核cpu。
10:24:34 up 48 min, 5 users, load average: 0.00, 0.00, 3.09
top也可以显示系统负载
如果变为僵尸状态,只能重启机器,重启进程和杀掉进程都解决不了。
[root@www Desktop]# vmstat 开机到现在的
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 1231944 31792 383124 0 0 114 23 109 248 2 2 94
3 0
vmstat 2 3 每2秒刷新一次,输出3次。
r 当前处于R状态进程数(运行队列的长度)
b 被block(阻塞)的进程数量,一般不要看到有数字,看到有数字都不是好事。某个进
程要执行的某个操作由于别的原因一致无法顺利的执行完毕,所以该进程一直在等待
。
in 系统中断数。
cs 上下文切换数。 主要体现在不同进程之间的相互竞争资源,要求cpu去执行它的结
果。数字越大,只能说明很多不同的进程在相互竞争资源,并不能直接反映出系统繁
忙
us 用户进程占用cpu的时间百分比
sy 系统进程占用cpu的时间百分比
us:sy ~= 7:3
id 空闲cpu的时间分别比
wa cpu浪费等待的时间百分比,一般由于cpu的相关指令需要从缓慢的外设读取数据的
时候导致的。数字越大,系统越慢,反应越差。
CPU被充分利用
# vmstat 1
procs memory swap io system cpu
r b swpd free buff cache si so bi bo in cs us sy wa id
3 0 206564 15092 80336 176080 0 0 0 0 718 26 81 19 0 0
2 0 206564 14772 80336 176120 0 0 0 0 758 23 96 4 0 0
1 0 206564 14208 80336 176136 0 0 0 0 820 20 96 4 0 0
1 0 206956 13884 79180 175964 0 412 0 2680 1008 80 93 7 0 0
2 0 207348 14448 78800 175576 0 412 0 412 763 70 84 16 0 0
2 0 207348 15756 78800 175424 0 0 0 0 874 25 89 11 0 0
1 0 207348 16368 78800 175596 0 0 0 0 940 24 86 14 0 0
1 0 207348 16600 78800 175604 0 0 0 0 929 27 95 3 0 2
3 0 207348 16976 78548 175876 0 0 0 2508 969 35 93 7 0 0
4 0 207348 16216 78548 175704 0 0 0 0 874 36 93 6 0 1
4 0 207348 16424 78548 175776 0 0 0 0 850 26 77 23 0 0
2 0 207348 17496 78556 175840 0 0 0 0 736 23 83 17 0 0
0 0 207348 17680 78556 175868 0 0 0 0 861 21 91 8 0 1
超负荷调度
# vmstat 1
procs memory swap io system cpu
r b swpd free buff cache si so bi bo in cs us sy wa id
2 1 207740 98476 81344 180972 0 0 2496 0 900 2883 4 12 57 27
0 1 207740 96448 83304 180984 0 0 1968 328 810 2559 8 9 83 0
0 1 207740 94404 85348 180984 0 0 2044 0 829 2879 9 6 78 7
0 1 207740 92576 87176 180984 0 0 1828 0 689 2088 3 9 78 10
2 0 207740 91300 88452 180984 0 0 1276 0 565 2182 7 6 83 4
3 1 207740 90124 89628 180984 0 0 1176 0 551 2219 2 7 91 0
4 2 207740 89240 90512 180984 0 0 880 520 443 907 22 10 67 0
5 3 207740 88056 91680 180984 0 0 1168 0 628 1248 12 11 77 0
4 2 207740 86852 92880 180984 0 0 1200 0 654 1505 6 7 87 0
6 1 207740 85736 93996 180984 0 0 1116 0 526 1512 5 10 85 0
0 1 207740 84844 94888 180984 0 0 892 0 438 1556 6 4 90 0
如果发现某些进程是不正常,大量占用cpu的时间,可以通过以下方法和命令获取大了
的信息:
TOP: 找到最活跃进程
linux 图形界面很浪费cpu资源。
shift+p 按cpu活跃度排序 shift+m 按内存活跃度排序
strace -o text.txt -Fp pid 跟踪
strace -o out.txt -F nslookup www.baidu.com
=====================================================================
@内存子系统调优
虚拟内存:
判断物理内存是否足够,是否当前内存成为性能瓶颈,最直接最简单就是看swap的空
间是否已经被使用
free -m 看虚拟内存是否被用。
[root@www Desktop]# free -m
total used free shared buffers cached
Mem: 1999 1853 146 0 71 1304
-/+ buffers/cache: 477 1521
Swap: 3999 0 3999
buffer 专用用于缓存块设备的读取过的以块为单位的数据(这些数据一般不经过文件
系统驱动处理过的数据)(没有被格式化。)
cached 专门用于缓存经过文件系统读取过的数据,这些数据都是以文件为单位的数据
。(格式化后挂载),linux大多用cached。
内存页 ( 4KB/页)
内存分页(paging)--内核就必须经常扫描内存空间并且收回其中未被使用的内存页,
把数据同步到硬盘
、
page in : 从外设读取数据到程序所申请使用的内存中
page out : 内核把内存中满足条件的数据写到外设,然后把这些数据所占用内存空间
清空。
kswapd 把数据从交换分区写到内存,或者反过来,当内存不足时会调用此进程。
pdflush 进程负责将内存中的内容和文件系统进行同步操
保存在内存上,没有被修改过的数据,或者修改的数据已经被同步到了磁盘上,这样
的数据的状态是“干净”
保存在内存上,被修改过的数据,但是还没来得及同步到硬盘上,这种的数据的状态
是“肮脏”的
保存在内存上,数据正在被进程读取,状态“钉住”
某个进程要申请更多的物理内存空间,而当物理内存的剩余空间不足的时候
,系统会把内存上的当前干净状态的直接释放掉,回收对应的内存空间,如果还不够
,把肮脏的数据同步到外设(page out) ,同步完毕之后再释放对应的空间回收该空
间。如果还不够,就是把某些钉住的数据对应的进程如果是非运行状态,把这些数据
放到swap分区(page out).
# vmstat 2 3
procs -----------memory---------- ---swap-- -----io----
r b swpd free buff cache si so bi bo
0 0 0 203064 76632 3179068 0 0 137 7
0 0 0 208676 76632 3173608 0 0 0 0
0 0 0 209420 76640 3172852 0 0 0 10
swpd 已经存放在swap里的数据有多少字节
free 当前剩余空闲内存有多少字节
buff
cache
si 从swap读取到内存中的数据 (in 到 内存) ,这是 page in
so 从内存中把数据置换到swap分区 (page out)
bi 从swap读取数据到块设备
bo 从块设备读取数据到内存中。
装这个包
sysstat-9.0.4-11.el6.x86_64
sar -B 输出过去24小时,每10分钟采集一次数据
sar -B 2 3
[root@www Desktop]# sar -B
Linux 2.6.32-71.el6.x86_64 (www.douya.com) 10/23/2013 _x86_64_
(1 CPU)
09:36:58 AM LINUX RESTART
09:40:01 AM pgpgin/s pgpgout/s fault/s majflt/s pgfree/s pgscank/s
pgscand/s pgsteal/s %vmeff
09:50:01 AM 123.77 7.60 148.40 0.03 131.19 0.00
0.00 0.00 0.00
10:00:01 AM 119.47 85.88 163.15 0.45 225.79 0.00
0.00 0.00 0.00
10:10:01 AM 1.00 7.33 78.73 0.01 86.18 0.00
0.00 0.00 0.00
10:20:01 AM 7.75 8.85 116.03 0.06 143.90 0.00
0.00 0.00 0.00
fault/s :次页面故障,进程在运行的时候需要读取的数据直接在内存中可以找到,
就发生次页面故障
majflt/s:主页面故障,进程在运行的时候需要读取的数据在内存中无法找到,需要
从外设中读取的,就发生主页面故障
大量的入口I/O
假设是双cpu
# vmstat 3
procs memory swap io system cpu
r b swpd free buff cache si so bi bo in cs us sy id
wa
3 2 809192 261556 79760 886880 416 0 8244 751 426 863 17 3 6
75
0 3 809188 194916 79820 952900 307 0 21745 1005 1189 2590 34 6 12
48
0 3809188 162212 79840 988920 95 0 12107 0 1801 2633 2 2 3
94
1 3 809268 88756 79924 1061424 260 28 18377 113 1142 1694 3 5 3
88
1 2 826284 17608 71240 1144180 100 6140 25839 16380 1528 1179 19 9 12
61
2 1 854780 17688 34140 1208980 1 9535 25557 30967 1764 2238 43 13 16
28
0 8 867528 17588 32332 1226392 31 4384 16524 27808 1490 1634 41 10 7
43
4 2 877372 17596 32372 1227532 213 3281 10912 3337 678 932 33 7 3
57
1 2 885980 17800 32408 1239160 204 2892 12347 12681 1033 982 40 12 2
46
5 2 900472 17980 32440 1253884 24 4851 17521 4856 934 1730 48 12 13
26
1 1 904404 17620 32492 1258928 15 1316 7647 15804 919 978 49 9 17
25
4 1 911192 17944 32540 1266724 37 2263 12907 3547 834 1421 47 14 20
20
1 1 919292 17876 31824 1275832 1 2745 16327 2747 617 1421 52 11 23
14
5 0 925216 17812 25008 1289320 12 1975 12760 3181 772 1254 50 10 21
^^^^^^^ ^
解决方案,1,uptime,2 vmstat 3 5 看出内存是否不足,3 top找到最活跃的进程。
4,strace 追踪。在分析得出结论,是病态还是人为。
mpstat -P ALL 2
===========================================================================
@IO子系统调优
iostat
硬盘类型:
sata 家用,低速,廉价
scsi服务器的标准配置,转速10K ,100-120 IOPS
sas服务器专用,转速15K , 100-150 IOPS
ssd固态硬盘,生产环境也在用。
IOPS计算,IO吞吐量计算(每个IO指令完成的数据量)
IO分类
连续IO : 数据仓库,这种并发连接少,长连接比较多的
场合。
随机IO: 是对传统机械硬盘的性能影响对大,消耗最大
。一般IOPS和IO吞吐量都会减低。在线的电子商务、论坛等等都是产生随机IO比较多
优化手段:分区、文件系统挂载,块大小,高级文件系统e4fsprogs
,IO算法
[root@www Desktop]# iostat -k -d sda1 sda2 2 3
Linux 2.6.32-71.el6.x86_64 (www.douya.com) 10/23/2013 _x86_64_
(1 CPU)
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda1 0.05 1.15 0.00 22588 24
sda2 4.33 70.02 9.70 1375845 190524
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda1 0.00 0.00 0.00 0 0
sda2 0.00 0.00 0.00 0 0
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda1 0.00 0.00 0.00 0 0
sda2 6.60 0.00 26.40 0 52
tps 过去的刷新刷新时间内,每秒钟完成事务数(IO指令数)== IOPS
kB_read/s 每秒钟读取了多少KB的数据
kB_read 过去刷新时间内一共读取了多少数据
[root@www Desktop]# iostat -k -d sda1 sda2 2 3 -x
Linux 2.6.32-71.el6.x86_64 (www.douya.com) 10/23/2013 _x86_64_
(1 CPU)
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz
avgqu-sz await svctm %util
sda1 0.00 0.00 0.05 0.00 1.14 0.00 43.11
0.00 1.99 1.87 0.01
sda2 0.45 0.62 2.51 1.79 69.41 9.65 36.74
0.14 31.39 3.12 1.34
rrqm/s 平均每秒钟被合并的读指令数
wrqm/s ...合并的写指定数
r/s每秒钟完成了多少个读指令数
%util硬盘带宽的使用百分比,越接近100就说明硬盘的带宽接近耗尽。
如何测试当前硬盘的满载速度的性能指标?
1、必须让你的硬盘尽可能达到满载的速度
2、如果是测试需要经过文件系统的话,那么必须要实时写入,不能选择异步
写入
测试1:经过文件系统写入数据
/dev/sda6 158G 19G 131G 13% /rhci
# mount -o remount,sync /rhci
# dd if=/dev/zero of=/rhci/1G bs=1M count=1024
记录了1024+0 的读入
记录了1024+0 的写出
1073741824字节(1.1 GB)已复制,55.0591 秒,19.5 MB/秒
# iostat -m -d sda6 2
Device: tps MB_read/s MB_wrtn/s MB_read MB_wrtn
sda6 359.50 0.00 20.39 0 40
Device: tps MB_read/s MB_wrtn/s MB_read MB_wrtn
sda6 330.00 0.00 18.67 0 37
Device: tps MB_read/s MB_wrtn/s MB_read MB_wrtn
sda6 354.50 0.00 20.08 0 40
测试2:/dev/sda9是一个没有被使用的分区,不经过文件系统去测试写速度
# dd if=/dev/zero of=/dev/sda9 bs=1M count=1024
记录了1024+0 的读入
记录了1024+0 的写出
1073741824字节(1.1 GB)已复制,12.187 秒,88.1 MB/秒
# iostat -m -d sda9 2
Device: tps MB_read/s MB_wrtn/s MB_read MB_wrtn
sda9 845.00 0.00 52.09 0 104
Device: tps MB_read/s MB_wrtn/s MB_read MB_wrtn
sda9 1662.50 0.00 98.96 0 197
Device: tps MB_read/s MB_wrtn/s MB_read MB_wrtn
sda9 1596.50 0.00 96.20 0 192
Device: tps MB_read/s MB_wrtn/s MB_read MB_wrtn
sda9 1159.00 0.00 70.85 0 141
Device: tps MB_read/s MB_wrtn/s MB_read MB_wrtn
sda9 1610.50 0.00 99.46 0 198
IO算法
查看当前某个硬盘应用的IO算法
# cat /sys/block/sda/queue/scheduler
noop anticipatory deadline [cfq]
临时调整
# echo "deadline" > /sys/block/sda/queue/scheduler
永久调整(开机就生效)
kernel /vmlinuz-2.6.32-220.el6.x86_64 ... elevator=deadline
==================================================
@网络子系统调优
工具:
mii-tool
ethtool -s eth0 speed 100 duplex full autoneg off
iptraf
netperf
用来测试本机的网卡实时流量
# iptraf -d eth0
基于c/s的模式,测试两台机器之间的数据传输速度
netperf
找一台机器运行该命令
netserver <---服务端
另外一台机器运行该命令
netperf -H 10.1.1.241 -l 30
结果:算出本机和10.1.1.241之间30秒内传输数据的平均速度是多
少
MIGRATED TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to
10.1.1.241 (10.1.1.241) port 0 AF_INET
Recv Send Send
Socket Socket Message Elapsed
Size Size Size Time Throughput
bytes bytes bytes secs. 10^6bits/sec
87380 16384 16384 30.27 92.82 <--测试环境是100Mb,局域网内90以上
测试结果是很正常的数值。
网络优化,可采用多网卡绑定。