您的位置:首页 > 运维架构 > Linux

Linux性能监控(3)

2014-12-24 11:28 148 查看
目录(?)[+]

(一) linux性能监控,就是要监控系统的各个子系统是否正常。

linux主要的子系统包括:CPU、Memory、IO和Network,它们之间相互依赖,一个出问题可能会影响其他的

比如:网卡流量很大会导致更多的CPU开销,因为频繁的响应中断执行协议栈。

性能监控时,首先要确定应用的类型,然后对症下药,可以将应用分成:

CPU密集型:CPU开销很高,比如大量的CPU运算、科学计算等。通常web server属于这类。

IO密集型: 大量的磁盘读写,高负荷的内存使用。IO密集型不会对CPU发起更多的请求,它占用CPU只是为了产生IO请求然后sleep。

通常数据库属于这一类型。

1. CPU

1.1 上下文切换

上下文切换(Context Switch)是多任务操作系统的基石,每个进程都有自己的执行环境就是进程的上下文,这些上下文就是当前进程使用的寄存器,比如PC、栈指针%esp、帧指针%ebp等。每个处理器核心在任意时刻只能执行一个进程或线程,当线程的时间片用尽或者线程阻塞(比如线程执行磁盘io或网络io时),进程调度器会根据一定的规则(比如选择运行时间加权之后最少的)挑选一个线程占有处理器。因为CPU的寄存器集合只有一份,所有必须要保存上一个进程使用的寄存器,同时恢复被调度的进程的寄存器状态。

上下文切换时有损耗的。一般地,当系统中线程过多或者io负载过高时,上下文切换会比较频繁,此时CPU时间过多的消耗在上下文切换

2. 运行队列

内核中的进程调度器维护着运行队列(run queue),而每个阻塞源维护着自己的阻塞队列(wait queue,比如一个文件描述符,正在读写该文件的进程会被阻塞在其阻塞队列上)。任意一个进程要么处于可执行状态,要么阻塞状态。所有的可执行状态的进程都处于运行队列,如果当前系统CPU负载很高,那么运行队列的长度很大,进程调度器就不会及时响应系统请求。当运行队列越来越大时,进程或线程将花费更多的时间来获取CPU时间。

[plain] view
plaincopy

> cat /proc/loadavg

0.02 0.05 0.05 1/279 23903

上述命令可以显示系统负载,分别是:过去1分钟、5分钟、15分钟的系统负载、当前正在执行的进程数/系统的所有进程数、最后执行的进程的pid。top命令也可以现在系统负载。

3. vmstat

vmstat提供一种低开销的方式统计系统性能数据。

[plain] view
plaincopy

> vmstat 1 1

procs -----------memory------------------- ---swap-- -----io---- -system-- ----cpu----

r b swpd free buff cache si so bi bo in cs us sy id wa

0 0 0 1540304 497972 1631008 0 0 0 45 0 0 2 0 97 1

与CPU相关的各个列的意思:

r:当前运行队列中的进程的数目,就是那些处于可执行状态,但是得不到CPU的进程。

b:当前处于阻塞状态,并等待IO请求完成的进程的数目。

in:当前处理的中断数目。

cs:当前系统发生的上下文切换次数。

us:CPU在用户空间执行的时间的百分比。

sy:CPU在内核空间执行的时间的百分比。

id:CPU空闲时间的百分比。

wa:由于所有可运行进程等待IO请求完成被阻塞导致的CPU空闲时间的百分比。

Memory

swpd: 虚拟内存使用情况,单位:KB

free: 空闲的内存,单位KB

buff: 被用来做为缓存的内存数,单位:KB

Swap

si: 从磁盘交换到内存的交换页数量,单位:KB/秒

so: 从内存交换到磁盘的交换页数量,单位:KB/秒

IO

bi: 发送到块设备的块数,单位:块/秒

bo: 从块设备接收到的块数,单位:块/秒

System

in: 每秒的中断数,包括时钟中断

cs: 每秒的环境(上下文)切换次数

CPU

按 CPU 的总使用百分比来显示

us: CPU 用户使用时间

sy: CPU 系统使用时间

id: 闲置时间

r、b列一般为0,表示没有等待进程,如果不为0表示系统性能有问题

si、so 两 列,表示内存交换的频繁程度,如果数值长期很大,表示内存不够,要和硬盘交换数据,也可以表示要读写的数据每次都不一样

bi、bo 两列,表示I/O输入输出很频繁

4. pidstat

pidstat用于查看进程所属的线程的CPU的使用情况。

[plain] view
plaincopy

> pidstat -p 2036 -t 1 1

Linux 2.6.32-5-xen-amd64 (vzw51173.puppetclient.163.com) 2012年10月12日 _x86_64_ (4 CPU)

16时09分17秒 TGID TID %usr %system %guest %CPU CPU Command

16时09分18秒 2036 - 0.00 2.00 0.00 2.00 3 python

16时09分18秒 - 2036 0.00 0.00 0.00 0.00 3 |__python

16时09分18秒 - 2041 0.00 0.00 0.00 0.00 3 |__python

16时09分18秒 - 5639 0.00 0.00 0.00 0.00 2 |__python

16时09分18秒 - 5650 0.00 1.00 0.00 1.00 1 |__python

平均时间: TGID TID %usr %system %guest %CPU CPU Command

平均时间: 2036 - 0.00 2.00 0.00 2.00 - python

平均时间: - 2036 0.00 0.00 0.00 0.00 - |__python

平均时间: - 2041 0.00 0.00 0.00 0.00 - |__python

平均时间: - 5639 0.00 0.00 0.00 0.00 - |__python

平均时间: - 5650 0.00 1.00 0.00 1.00 - |__python

Linux中是不区分进程和线程的,线程就是可以共享资源的进程。TID就是线程的PID,这里可以查看各个线程的CPU使用情况。

5. 总结

vmstat -> top -> pidstat

通过vmstat查看整体CPU使用情况,top查看CPU占用高的几个进程,pidstat查看这几个进程对应的线程。

监控CPU性能包括以下几个部分:

a. 检查CPU的run queue,每个CPU的run queue最好不要超过3个进程。

b. 确定CPU利用率在usr/sys = 65% / 35% ~ 70% / 30%之间。

c. 当CPU的处理时间更多的是在system空间,说明已经超负荷。

d. 当I/O增多时,CPU密集型的应用将受到影响。

e. 当CPU的IOWait占用比较大的比例时,说明IO出现异常。

2. Memory

1. 虚拟内存 swap space

虚拟内存就是在硬盘上划出一部分区域做为内存使用,当系统可用的内存低于某个值时,内核就会将当前不再活跃的内存块写入磁盘(被当作内存的磁盘,即虚拟内存),然后这块内存(原存数据的内存)可以作为其他用途使用。当cpu需要访问被写入磁盘的数据时,再把它读入到内存中。上述操作对用户来说是透明的,磁盘的读写是很慢的,比内存要慢几千万倍(磁盘10ms,内存100-200ns),所以要尽量把数据放在内存中,程序才会运行的更快。硬盘中用作替代内存的部分就是虚拟内存,成为swap
space,把内存中不经常使用的数据交换到硬盘上,此块硬盘称为虚拟内存,而原内存变为可用。


2. 页高速缓存

Linux内核通过页高速缓存来加快磁盘操作。当系统存在大量的空闲内存时,内核会把空闲内存的一部分做为页高速缓存。当某个磁盘块被缓存之后,对于这个磁盘块的读写就相当于内存操作。读操作时直接读对应的page,写操作时将内容写入对应的page,然后将该page标记为脏页,会有后台线程flush(linux 2.6内核)完成将脏页同步回磁盘。flush在脏页比例大于某个阈值,或者修改超过一定时间之后进行写回。

[plain] view
plaincopy

> ps axu | grep flush

root 927 0.0 0.0 0 0 ? S May23 2:34 [flush-202:2]

root 14413 0.0 0.0 10200 856 pts/2 S+ 16:53 0:00 grep flush



3. vmstat

vmstat可以查看系统的内存相关信息。

[plain] view
plaincopy

> vmstat 1

procs -----------memory------------- ----swap----- -----io---- -system-- ----cpu----

r b swpd free buff cache si so bi bo in cs us sy id wa

0 0 6004 38264 99552 3741240 0 0 0 4 0 0 0 0 100 0

0 0 6004 37364 99552 3741244 0 0 0 0 1565 906 0 0 99 0

内存相关列的意思:

swpd:当前使用的虚拟内存的总额(KB),当空闲内存达到更低的阈值时,更多的页会被交换到磁盘。

free:当前内存中的空闲空间的大小(KB)。

buff:当前内存中用于read和write操作的缓冲区的大小(KB)。

cache:页高速缓存大小(KB)。

si:从swap写回内存的大小(KB)。

so:写入swap的大小(KB)。

bi:从文件系统或交换设备读的磁盘块的大小(KB)。读磁盘。

bo:从内存写入文件系统或交换设备的大小(KB)。写磁盘。

4. pidstat

查看进程的缺页情况。

[plain] view
plaincopy

> pidstat -r -p 31679 1 1

Linux 2.6.32-5-xen-amd64 (debian-org) 2012年10月12日 _x86_64_ (4 CPU)



17时10分02秒 PID minflt/s majflt/s VSZ RSS %MEM Command

17时10分03秒 31679 1292.00 0.00 871348 107852 2.58 node

平均时间: 31679 1292.00 0.00 871348 107852 2.58 node

各个列含义:

minflt/s:进程平均每s造成的minor fault,这些错误不会导致从磁盘加载内存页。

majflt/s:进程平均每s造成的major fault,这些错误会导致从磁盘加载内存页。

VSZ:进程使用的所有虚拟内存的大小(KB)。

RSS:进程使用的物理内存大小(KB)。

%MEM:占用物理内存百分比。

5. sar

a. 查看页统计信息

[plain] view
plaincopy

> sar -B

Linux 2.6.32-5-xen-amd64 (debian-org) 2012年11月17日 _x86_64_ (4 CPU)



00时00分01秒 pgpgin/s pgpgout/s fault/s majflt/s pgfree/s pgscank/s pgscand/s pgsteal/s %vmeff

00时05分01秒 0.00 200.84 364.65 0.00 538.94 0.00 0.00 0.00 0.00

00时15分01秒 0.00 184.84 353.72 0.00 396.33 0.00 0.00 0.00 0.00

……

09时45分01秒 0.00 1822.52 1175.53 0.00 9406.76 0.00 0.00 0.00 0.00

09时55分01秒 0.00 3401.99 1556.25 0.00 10269.71 0.00 0.00 0.00 0.00

平均时间: 0.00 319.68 429.48 0.00 1036.33 0.00 0.00 0.00 0.00

各个列的含义:

pgpgin/s:每s从磁盘换入的页的大小(KB)

pgpgout/s:每s换出到磁盘的页的大小(KB)

fault/s:每s发生的缺页错误的次数,包括minor fault和major fault。

majflt/s:每s发生的major fault的次数,major fault会导致从磁盘载入内存页(即使用了swap分区)。

pgfree/s:每s放入空闲列表中的页的个数。

pgscank/s:每s被kswapd后台进程扫描的页的个数。

pgscand/s:每s直接被扫描的页的个数。

pgsteal/s:为了满足内存要求,每s从cache(pagecache和swapcache)回收的页的个数。

%vmeff:等于pgsteal / pgscan,用于计算页回收(page reclaim)的效率。


b. 查看内存使用信息

[plain] view
plaincopy

> sar -r

Linux 2.6.32-5-xen-amd64 (debian-org) 2012年11月17日 _x86_64_ (4 CPU)



00时00分01秒 kbmemfree kbmemused %memused kbbuffers kbcached kbcommit %commit

00时05分01秒 1636744 2551244 60.92 498112 1626600 180708 4.31

00时15分01秒 1634724 2553264 60.97 498112 1626628 181304 4.33

……

09时55分01秒 1555940 2632048 62.85 498128 1624716 200876 4.80

10时05分01秒 1548416 2639572 63.03 498128 1624760 206364 4.93

10时15分01秒 1545200 2642788 63.10 498128 1624804 212948 5.08



10时15分01秒 kbmemfree kbmemused %memused kbbuffers kbcached kbcommit %commit

10时25分01秒 1542332 2645656 63.17 498128 1624852 211524 5.05

平均时间: 1624618 2563370 61.21 498118 1626298 183528 4.38

各个列的含义:

kbmemfree:可用的空闲内存(KB)。

kbmemused:使用的内存,不包括内核自己使用的内存(KB)。

%memused:使用的内存的比例。

kbbuffers:被内核用做缓冲区的内存(KB)。

kbcached:被内核用来缓存数据的内存(KB)。

kbcommit:对于当前的工作量需要的内存(KB),确定RAM/Swap的大小以防止out of memory。

%commit:当前的工作量需要的内存和所有内存(RAM+Swap)的百分比。
上面两种sar的使用方式可以查看从0点到现在的每分钟的统计信息,可以通过sar -B interval times以固定间隔时间interval秒统计times次数据,比如:

[plain] view
plaincopy

sar -B 1 5

Linux 2.6.32-5-xen-amd64 (debian-org) 2012年11月17日 _x86_64_ (4 CPU)



18时53分20秒 pgpgin/s pgpgout/s fault/s majflt/s pgfree/s pgscank/s pgscand/s pgsteal/s %vmeff

18时53分21秒 0.00 0.00 40.00 0.00 355.00 0.00 0.00 0.00 0.00

18时53分22秒 0.00 0.00 42.00 0.00 362.00 0.00 0.00 0.00 0.00

18时53分23秒 0.00 0.00 32.00 0.00 355.00 0.00 0.00 0.00 0.00

18时53分24秒 0.00 6584.00 104.00 0.00 414.00 0.00 0.00 0.00 0.00

18时53分25秒 0.00 28.00 66.00 0.00 427.00 0.00 0.00 0.00 0.00

平均时间: 0.00 1322.40 56.80 0.00 382.60 0.00 0.00 0.00 0.00

5. 总结

a. 当系统出现较少的page fault,说明页命中率很高,会获得较好的响应时间。

b. 在没有写入swap和disk的情况下,空闲内存越小,表明页高速缓存利用率越高。

c. 如果系统不断报告swap device繁忙,那么说明系统内存不足。

(二) linux经验总结(持续更新)

1. 单个进程打开的文件描述符最大值

默认是1024,可以通过ulimit -a查看所有的限制

ulimit -n 可以查看文件描述符最大值。

并可以通过ulimit -n 65535设置这一次会话的最大值。

2. 查看linux机器的连接数

netstat -est | grep established | grep -v packets

1186 connections established

3. 生成动态链接库

[plain] view
plaincopy

gcc -fpic -shared -o mylib.so mylib.c

-fpic:输出的对象是地址可重定位的。

-shared:指定生成动态链接库。

使用动态链接库:

[plain] view
plaincopy

gcc -o libtst libtst.c /home/tst/mylib.so

或者吧mylib.so拷贝到/usr/lib/下,然后使用:

[plain] view
plaincopy

gcc -o libtst libtst.c -lmylib

4. 生成静态链接库

1)用gcc编绎该文件,可以使用任何合法的编绎参数

[plain] view
plaincopy

gcc -c lib_test.c -o lib_test.o

2) $ar crv libtest.a lib_test.o //生成静态库生成libtest.a

3) 在某些系统中还要为静态库生成一个内容表 $ranlib libtest.a

4) 使用静态链接库

$nm libtest.a //nm工具可以打印出库中的涉及到的所有符号,库既可以是静态的也可以是动态的。nm列出的符号有很多, 常见的有三种,一种是在库中被 调用,但并没有在库中定义(表明需要其他库支持),用U表示;一种是库中定义的函数,用T表示,这是最常见的;另外一种是所谓的"弱态”

符号,它们虽然在库中被定义,但是可能被其他库中的同名符号覆盖,用W表示。

$gcc -c -I/home/lib main.c //假设main.c要使用对应的静态库

$gcc -o main -L/home/lib main.o libtest.a

说明:这里的-I/home/lib和-L/home/lib是通过-I和-L指定对应的头文件和库文件的路径,libtest.a就是要用的静态库。在main.c中要包含静态库的头文件。

5. 彻底删除文件

一般,我们都是用rm来删除文件或文件夹,但是rm并不真的清空该文件所占用的数据块的内容,而只是释放了索引节点,所以可以通过一些恢复这些文件。有时,需要彻底删除文件,以释放空间,可以使用shred命令。

[plain] view
plaincopy

shred -u file_path

运行这个命令就可以彻底删除文件。

经过测试,shred这个命令在运行时很耗cpu。实际上,用rm就可以达到彻底删除文件,并释放空间的目的:

[plain] view
plaincopy

rm -rf file_path

这个命令就相当于windows下shift+delete。

还可以使用

[plain] view
plaincopy

> file_path

这样可以清空文件的内容

6. 查看CPU每个核的信息

使用top,然后按1,显示所有核的状态:

[plain] view
plaincopy

top - 00:18:57 up 1:17, 6 users, load average: 0.48, 0.75, 1.36

Tasks: 200 total, 1 running, 199 sleeping, 0 stopped, 0 zombie

Cpu0 : 27.8%us, 2.7%sy, 0.0%ni, 60.2%id, 9.4%wa, 0.0%hi, 0.0%si, 0.0%st

Cpu1 : 25.3%us, 3.7%sy, 0.0%ni, 71.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st

Cpu2 : 28.7%us, 4.0%sy, 0.0%ni, 67.3%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st

Cpu3 : 26.3%us, 2.7%sy, 0.0%ni, 71.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st

7. 定时执行命令,观察输出

如果要持续执行一个命令,然后观察输出的话,我们一遍一遍的按上回车,然后看着输出。watch命令可以很好的实现这个功能。比如,要监控linux的连接数:

[plain] view
plaincopy

watch -n 2 -d 'netstat -est | grep est'

输出:

[plain] view
plaincopy

Every 2.0s: netstat -est | grep est Mon Mar 19 10:46:03 2012



12784 connections established

556 packets rejects in established connections because of timestamp

2015 congestion windows fully recovered without slow start

9672 congestion windows partially recovered using Hoe heuristic

20983 congestion windows recovered without slow start by DSACK

22010 congestion windows recovered without slow start after partial ack

-n指定命令执行的时间间隔,-d高亮显示连续两侧输出的差别,为了便于观察,最后一个参数是要执行的命令。

8. ubuntu下配置ssh服务

安装openssh-server:

[plain] view
plaincopy

apt-get install openssh-server

启动命令:

[plain] view
plaincopy

1. service ssh start

2. /etc/init.d/ssh start

第一种是推荐的方式。

9. 查看cpu和内核信息

a. 查看os内核信息

[plain] view
plaincopy

uname -a

Linux vyz20242 2.6.32-5-xen-amd64 #1 SMP Tue Jun 14 12:46:30 UTC 2011 x86_64 GNU/Linux

b. 操作系统发行版本信息

[plain] view
plaincopy

cat /etc/issue | grep Linux

Debian GNU/Linux 6.0 \n \l

c. linux内核版本

[plain] view
plaincopy

cat /proc/version

Linux version 2.6.32-5-amd64 (Debian 2.6.32-41squeeze2) (dannf@debian.org) (gcc version 4.3.5 (Debian 4.3.5-4) ) #1 SMP Thu Mar 22 17:26:33 UTC 2012

10. 查看系统页大小

[plain] view
plaincopy

getconf PAGESIZE

参考:http://blog.csdn.net/chosen0ne/article/details/8200737
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: