(一) 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时间。
- > cat /proc/loadavg
- 0.02 0.05 0.05 1/279 23903
上述命令可以显示系统负载,分别是:过去1分钟、5分钟、15分钟的系统负载、当前正在执行的进程数/系统的所有进程数、最后执行的进程的pid。top命令也可以现在系统负载。
3. vmstat
vmstat提供一种低开销的方式统计系统性能数据。
- > 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的使用情况。
- > 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在脏页比例大于某个阈值,或者修改超过一定时间之后进行写回。
- > 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可以查看系统的内存相关信息。
- > 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
查看进程的缺页情况。
- > 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. 查看页统计信息
- > 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. 查看内存使用信息
- > 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次数据,比如:
- 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. 生成动态链接库
- gcc -fpic -shared -o mylib.so mylib.c
-fpic:输出的对象是地址可重定位的。
-shared:指定生成动态链接库。
使用动态链接库:
- gcc -o libtst libtst.c /home/tst/mylib.so
或者吧mylib.so拷贝到/usr/lib/下,然后使用:
- gcc -o libtst libtst.c -lmylib
4. 生成静态链接库
1)用gcc编绎该文件,可以使用任何合法的编绎参数
- 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命令。
运行这个命令就可以彻底删除文件。
经过测试,shred这个命令在运行时很耗cpu。实际上,用rm就可以达到彻底删除文件,并释放空间的目的:
这个命令就相当于windows下shift+delete。
还可以使用
这样可以清空文件的内容
6. 查看CPU每个核的信息
使用top,然后按1,显示所有核的状态:
- 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的连接数:
- watch -n 2 -d 'netstat -est | grep est'
输出:
- 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:
- apt-get install openssh-server
启动命令:
- 1. service ssh start
- 2. /etc/init.d/ssh start
第一种是推荐的方式。
9. 查看cpu和内核信息
a. 查看os内核信息
Linux vyz20242 2.6.32-5-xen-amd64 #1 SMP Tue Jun 14 12:46:30 UTC 2011 x86_64 GNU/Linux
b. 操作系统发行版本信息
- cat /etc/issue | grep Linux
Debian GNU/Linux 6.0 \n \l
c. linux内核版本
Linux version 2.6.32-5-amd64 (Debian 2.6.32-41squeeze2) (
[email protected]) (gcc version 4.3.5 (Debian 4.3.5-4) ) #1 SMP Thu Mar 22 17:26:33 UTC 2012
10. 查看系统页大小
参考:http://blog.csdn.net/chosen0ne/article/details/8200737