天天看点

linux系统调优一

计算机的四个子系统:

 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

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

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

Device:            tps    MB_read/s    MB_wrtn/s    MB_read    MB_wrtn

sda8             94.50         0.01        45.02          0         90

sda8            125.50         0.00        62.00          0        124

sda8            133.00         0.00        66.00          0        132

# iostat -x -k -d sda 2

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

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