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以上


测试结果是很正常的数值。



网络优化,可采用多网卡绑定。