一. Linux服务器的性能指标
1. CPU
1.1 CPU状态
在任意时间内,CPU有7个状态:
1.idle,表示CPU闲置并等待工作分配.
2.user,表示CPU在运行用户的进程
3.system,表示CPU在执行kernel工作
4.nice,表示CPU花费在被nice改变过优先级的process上的时间(注意:被nice命令改变优先级的process仅指那些nice值为负的process.花费在被nice命令改变优先级的任务上的时间也将被计算在系统和用户时间内,因此整个时间加起来可能会超过百分之百)
5.iowait,表示CPU等待IO操作完成的时间
6.irq,表示CPU开销在响应硬中断上的时间
7.softirq,表示CPU开销在响应软中断上的时间.
我们一般用vmstat看到的都是四个状态:sy,us,id,wa,通过他和load avg结合,基本可以知道cpu的状态
大部分的性能工具用百分比表示CPU时间.当system时间占用很高的时候,你可以用oprofile工具发现时间都花费在哪里.当iowait很高的时候,你需要分析你的IO设备,比如磁盘,网卡.
1.2 Average load
Load Average表示cpu正在处理以及等待cpu处理的进程数之和的统计信息,也就是cpu使用队列长度的统计信息。
满负载:即CPU Load = CPU个数*核数。一般要保证性能良好,负载最好小于0.7*CPU个数*核数。
例如:2个4核的cpu, Load Average须< 0.7 * 2 * 4 = 5.6
常用命令:
1. 查看cpu信息:grep ‘model name’ /proc/cpuinfo
2. top命令应该是把每个核的CPU占用率加起来,算一个和,于是多核情况下会top命令会计算出超过100%。load average显示的三个数字的时间分别为1分钟,五分钟和十五分钟。
3. vmstat也可以查看
- [admin@v015210 ~]$ 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 155752 61976 179580 309232 0 1 2 11 0 0 1 0 99 0 0
- 1 0 155752 61968 179580 309240 0 0 0 0 436 3597 0 0 100 0 0
- 0 0 155752 61612 179580 309240 0 0 0 0 508 3535 1 2 97 0 0
其中,r,b是指处于runnable,blocked的process。所有的runnable process形成了一个Run Queue,等待Linux调度线程的调度。系统的load是指running和runnable process的总和。
1.3 Interrupts & Context Switches
Interrupts对应vmstat中的in,即被处理过的中断数。在系统中,中断处理器的优先级非常高,而且执行速度非常快.很多时候,有些中断处理并不需要很高的处理优先级,所以也有soft- interrupt handler.如果有很多的中断,kernel需要花费大量的时间去处理中断.可以检查/proc/interrupts能够知道中断发生在哪个CPU 上.
Context Switches对于vmstat中的cs,即系统上正在做上下文切换的数目。 linux内核不断的在不同process间切换,造成一个错觉,让人感觉一个单CPU同时处理多个任务.不同process之间的切换称作 Context Switch.当系统做Context Switch时,CPU保存所有old process的context信息并获得new process的所有context信息.Context信息包括大量的linux追踪每个process信息,尤其是一些资源:那些process正在 执行,被分配了哪些内存,它打开了那些文件,等等.切换Context会触发大量的信息移动,这是比较高的开销.如果可能的话尽量保持很小的 context switches.
2. 内存
1. 1 内存基础
通常包含物理内存和虚拟内存(virtual Memory),好处是通过物理内存(RAM)和部分硬盘空间(SWAP)组合增大了总体的内存空间,坏处是由于硬盘部分的虚拟内存的性能有限,并且RAM和SWAP之间交换增加了系统的负担。
- [phoenix.lif@aliadmin036158 ~]$ free
- total used free shared buffers cached
- Mem: 7680000 7504764 175236 0 490772 3193856
- -/+ buffers/cache: 3820136 3859864
- Swap: 2096472 88 2096384
其中,Mem:
(1) Total为总的物理内存;(2) Used表示总计分配给缓存使用的数量(即buffers和cache,但可能部分还未实际使用);(3)Free表示未被分配的内存;(4)share表示共享内存,一般不会使用;(5)buffers:表示系统分配但未被使用的buffers数量;(6)Cached:表示系统分配但未被使用的cache数量。后面详细说明buffer和cache的区别。
-/+ buffers/cache:
(1)Used表示实际使用的buffers和cache总量,即实际使用内存总量;(2)Free未被使用的buffer,cache及未被分配的内存之和,即系统可用内存。
Swap: 虚拟内存。如果系统物理内存用完了,但是仍有虚拟内存系统仍然可以运行虽然运行很慢;但是如果Swap也用完了,系统就会发生错误,通常会出现"application is out of memory"的错误,严重时造成系统死锁。通常Swap空间分配为物理内存的2-2.5倍,但也不用完全按照这个标准,如确定内存完全够用也没必要分配太多,我们线上的服务器就没有分配太多的Swap空间。
实际可用内存:Free(-/+ buffers/cache) = Free(Mem)+buffers(Mem)+Cached(Mem);
已分配内存:Used(Mem) = Used(-/+ buffers/cache)+ buffers(Mem) + Cached(Mem)
物理内存总大小:total(Mem) = used(-/+ buffers/cache) + free(-/+ buffers/cache)
1.2 Buffers & Cache
在 Linux 的实现中,文件 Cache 分为两个层面,一是 Page Cache,另一个 Buffer Cache,每一个 Page Cache 包含若干 Buffer Cache。内存管理系统和 VFS 只与 Page Cache 交互,内存管理系统负责维护每项 Page Cache 的分配和回收。buffer cache是块设备的读写缓冲区,更靠近存储设备,或者直接就是disk的缓冲区。
磁盘操作有逻辑级(文件系统)和物理级(磁盘块),这两种缓存分别是缓存逻辑和物理级数据的。如我们进行的是文件系统操作,那么文件被缓存到Page Cache,如需要刷新文件的时候,Page Cache将交给Buffer Cache去完成,因为Buffer Cache是缓存磁盘块的。即直接去操作文件就是使用Page Cache,用dd等命令直接操作磁盘块,就是buffer cache缓存。
3. 磁盘I/O
1.3.1缺页中断
磁盘I/O是Linux中最慢的部分。这个主要归咎于CPU到物理磁盘之间的距离(盘片旋转以及寻道)。Linux 内核将硬盘I/O 进行分页,多数Linux 系统的默认页大小为4K.
Linux 利用虚拟内存极大的扩展了程序地址空间,使得原来物理内存不能容下的程序也可以通过内存和硬盘之间的不断交换(把暂时不用的内存页交换到硬盘,把需要的内存页从硬盘读到内存)来赢得更多的内存,看起来就像物理内存被扩大了一样。
当程序启动的时候,Linux 内核首先检查 CPU 的缓存和物理内存,如果数据已经在内存里就忽略,如果数据不在内存里就引起一个缺页中断(Page Fault),然后从硬盘读取缺页,并把缺页缓存到物理内存里。缺页中断可分为主缺页中断(Major Page Fault)和次缺页中断(Minor Page Fault),要从磁盘读取数据而产生的中断是主缺页中断;数据已经被读入内存并被缓存起来,从内存缓存区中而不是直接从硬盘中读取数据而产生的中断是次缺页中断。
上面的内存缓存区起到了预读硬盘的作用,内核先在物理内存里寻找缺页,没有的话产生次缺页中断从内存缓存里找,如果还没有发现的话就从硬盘读取。很显然,把多余的内存拿出来做成内存缓存区提高了访问速度,这里还有一个命中率的问题,运气好的话如果每次缺页都能从内存缓存区读取的话将会极大提高性能。要提高命中率的一个简单方法就是增大内存缓存区面积,缓存区越大预存的页面就越多,命中率也会越高。
1.3.2 File Buffer Cache
从上面的内存缓存区(也叫文件缓存区 File Buffer Cache)读取页比从硬盘读取页要快得多,所以 Linux 内核希望能尽可能产生次缺页中断(从文件缓存区读),并且能尽可能避免主缺页中断(从硬盘读), 这样随着次缺页中断的增多,文件缓存区也逐步增大,直到系统只有少量可用物理内存的时候 Linux 才开始释放一些不用的页。我们运行 Linux 一段时间后会发现虽然系统上运行的程序不多,但是可用内存总是很少,这样给大家造成了 Linux 对内存管理很低效的假象,事实上 Linux 把那些暂时不用的物理内存高效的利用起来做预存(内存缓存区)。
1.3.3 页面类型
Read pages,只读页(或代码页),那些通过主缺页中断从硬盘读取的页面,包括不能修改的静态文件、可执行文件、库文件等。当内核需要它们的时候把它们读到内存中,当内存不足的时候,内核就释放它们到空闲列表,当程序再次需要它们的时候需要通过缺页中断再次读到内存。
Dirty pages,脏页,指那些在内存中被修改过的数据页,比如文本文件等。这些文件由 pdflush 负责同步到硬盘,内存不足的时候由 kswapd 和 pdflush 把数据写回硬盘并释放内存。
Anonymous pages,匿名页,那些属于某个进程但是又和任何文件无关联,不能被同步到硬盘上,内存不足的时候由 kswapd 负责将它们写到交换分区并释放内存。
二. 性能评估方法
1. 评估方法
监控项 | 命令 |
CPU | top, uptime, vmstat, sar |
Memory | free, vmstat, sar |
I/O | iostat, sar |
网络 | netstat, sar |
线程 | ps, pstree, sar |
/proc中的重要信息 :
cat /proc/cpuinfo - CPU (i.e. vendor, Mhz, flags like mmx)
cat /proc/interrupts - 中断
cat /proc/ioports - 设备IO端口
cat /proc/meminfo - 内存信息(i.e. mem used, free, swap size)
cat /proc/partitions - 所有设备的所有分区
cat /proc/pci - PCI设备的信息
cat /proc/swaps - 所有Swap分区的信息
cat /proc/version - Linux的版本号
2. CPU性能评估
2.1 评价标准
nice | ok | bad | |
cpu | user% + sys%<=50% | 50%<user%+sys%<85% | user% + sys% >= 85% |
load | Load Average<= 0.3* CPU个数*核数 | 0.3<Load<=0.7 Average | Load Average > 0.7 * CPU个数*核数 |
2.2 监控方法
2.2.1 uptime
- [admin@v015208 ~]$ uptime
- 19:05:21 up 534 days, 5:41, 1 user, load average: 0.16, 0.03, 0.01
可以明显的看到当前服务器的load average
2.2.2 vmstat
vmstat监控cpu主要关注proces和cpu:
proces:r表示运行和等待cpu时间片的进程数,如果r长时间大于cpu的个数,说明cpu不足;
b表示等待资源(如I/O,内存交换等)的进程数;
cpu: us比较高,表明用户进程消耗cpu时间多,如果长期大于50%就需要考虑优化相关代码和算法;
us+sy大于85%,说明存在可能存在cpu资源不足;
st列来自于一个虚拟机偷取的CPU时间的百分比;
2.2.3 sar
- [[email protected] ~]$ sar -u -P ALL 1 2
- Linux 2.6.18-164.el5xen (<span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 1.5;">xxx.cm3</span><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 1.5;">) 03/12/2012</span>
- 07:36:53 PM CPU %user %nice %system %iowait %steal %idle
- 07:36:54 PM all 0.00 0.00 0.00 0.00 0.00 100.00
- 07:36:54 PM 0 0.00 0.00 0.00 0.00 0.00 100.00
- 07:36:54 PM 1 0.00 0.00 0.00 0.00 0.00 100.00
- 07:36:54 PM 2 0.00 0.00 0.00 0.00 0.00 100.00
- 07:36:54 PM 3 0.00 0.00 0.00 0.00 0.00 100.00
- 07:36:54 PM 4 0.00 0.00 0.00 0.00 0.00 100.00
- 07:36:54 PM CPU %user %nice %system %iowait %steal %idle
- 07:36:55 PM all 0.00 0.98 0.00 0.00 0.00 99.02
- 07:36:55 PM 0 0.00 3.70 0.00 0.00 0.00 96.30
- 07:36:55 PM 1 0.00 0.00 0.00 0.00 0.99 99.01
- 07:36:55 PM 2 0.00 0.00 0.00 0.00 0.00 100.00
- 07:36:55 PM 3 0.00 0.00 0.00 0.00 0.00 100.00
- 07:36:55 PM 4 0.00 0.00 0.00 0.00 0.00 100.00
- Average: CPU %user %nice %system %iowait %steal %idle
- Average: all 0.00 0.50 0.00 0.00 0.00 99.50
- Average: 0 0.00 2.00 0.00 0.00 0.00 98.00
- Average: 1 0.00 0.00 0.00 0.00 0.50 99.50
- Average: 2 0.00 0.00 0.00 0.00 0.00 100.00
- Average: 3 0.00 0.00 0.00 0.00 0.00 100.00
- Average: 4 0.00 0.00 0.00 0.00 0.00 100.00
参数说明:nice列显示了运行正常进程所消耗的CPU 时间百分比
steal列显示了在内存相对紧张的环境下pagein强制对不同的页面进行的steal操作 。
sar是个非常强大的工具,还可以使用来查看网络,I/O等等使用情况
3. 内存性能评估
3.1 评价标准
nice | ok | bad | |
Memory | 可用内存=>70% | 70%> m => 20% | 可用内存<20% |
Swap | si = 0; so =0 | si, so大体上都为0 | si, so长期不为0 |
3.2 监控方法
3.2.1 free
使用free -m查看内存使用情况,具体计算前文及上面的评价标准。如果可用内存小于20%考虑增加内存。
3.2.2 vmstat
关注memory和swap
memory:
swpd列表示切换到内存交换区的内存数量(以k为单位)。如果swpd的值不为0,或者比较大,只要si、so的值长期为0,这种情况下一般不用担心,不会影响系统性能。
free列表示当前空闲的物理内存数量(以k为单位)
buff列表示buffers cache的内存数量,一般对块设备的读写才需要缓冲。
cache列表示page cached的内存数量,一般作为文件系统cached,频繁访问的文件都会被cached,如果cache值较大,说明cached的文件数较多,如果此时IO中bi比较小,说明文件系统效率比较好。
swap:
si列表示由磁盘调入内存,也就是内存进入内存交换区的数量。
so列表示由内存调入磁盘,也就是内存交换区进入内存的数量。
一般情况下,si、so的值都为0,如果si、so的值长期不为0,则表示系统内存不足。需要增加系统内存。
3.2.3 sar分析内存
- [phoenix.lif@<span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 1.5;">xxx.cm3</span><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 1.5;"> ~]$ sar -r 2 3</span>
- Linux 2.6.18-164.el5xen (<span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 1.5;">xxx.cm3</span><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 1.5;">) 03/12/2012</span>
- 08:23:05 PM kbmemfree kbmemused %memused kbbuffers kbcached kbswpfree kbswpused %swpused kbswpcad
- 08:23:07 PM 951728 6728272 87.61 511660 2428304 2096376 96 0.00 0
- 08:23:09 PM 951728 6728272 87.61 511660 2428308 2096376 96 0.00 0
- 08:23:11 PM 951052 6728948 87.62 511660 2428320 2096376 96 0.00 0
- Average: 951503 6728497 87.61 511660 2428311 2096376 96 0.00 0
具体参数看下就明白,需要说明的是:sar -R 2 3中R显示结果的单位是pagesize,pagesize的大小看具体机器。
4. I/O性能评估
4.1 评价标准
nice | ok | bad | |
iowait | iowait<=10% | 10%<iowait<=40% | iowait>40% |
Blk_read/s和Blk_wrtn/s | 都比较小 | 适中且有一定规律 | 某一个值过大 |
await和svctm | svctm=await | svctm约等于await | 差值很大 |
4.2 iostat
- [admin@v015208 ~]$ iostat 2 3
- Linux 2.6.18-164.el5xen (<span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 1.5;">xxx.cm3</span><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 1.5;">) 2012年03月19日</span>
- avg-cpu: %user %nice %system %iowait %steal %idle
- 0.11 0.02 0.05 0.49 0.01 99.31
- Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
- xvda 2.62 4.92 40.27 229962298 1881769193
- xvda1 0.00 0.00 0.00 2880 637
- xvda2 0.88 1.02 11.97 47786282 559558536
- xvda3 0.11 0.58 2.44 27145671 114223592
- xvda4 0.00 0.00 0.00 30 0
- xvda5 1.63 3.32 25.85 155027008 1207986428
参数说明: Blk_read/s表示每秒读取的数据块数。
Blk_wrtn/s表示每秒写入的数据块数。
Blk_read表示读取的所有块数。
Blk_wrtn表示写入的所有块数。
tips: 可以通过Blk_read/s和Blk_wrtn/s的值对磁盘的读写性能有一个基本的了解,如果Blk_wrtn/s值很大,表示磁盘的写操作很频繁,可以考虑优化磁盘或者优化程序,如果Blk_read/s值很大,表示磁盘直接读取操作很多,可以将读取的数据放入内存中进行操作。
对于这两个选项的值没有一个固定的大小,根据系统应用的不同,会有不同的值,但是有一个规则还是可以遵循的:长期的、超大的数据读写,肯定是不正常的,这种情况一定会影响系统性能。
4.3 sar
- [admin@v015208 ~]$ sar -d 1 2
- Linux 2.6.18-164.el5xen (<span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 1.5;">xxx.cm3</span><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 1.5;">) 2012年03月19日</span>
- 10时32分01秒 DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
- 10时32分02秒 dev202-0 5.94 0.00 285.15 48.00 0.07 11.33 6.00 3.56
- 10时32分02秒 dev202-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
- 10时32分02秒 dev202-2 5.94 0.00 285.15 48.00 0.07 11.33 6.00 3.56
- 10时32分02秒 dev202-3 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
- 10时32分02秒 dev202-4 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
- 10时32分02秒 dev202-5 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
- 10时32分02秒 DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
- 10时32分04秒 dev202-0 1.98 0.00 23.76 12.00 0.02 10.00 10.00 1.98
- 10时32分04秒 dev202-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
- 10时32分04秒 dev202-2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
- 10时32分04秒 dev202-3 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
- 10时32分04秒 dev202-4 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
- 10时32分04秒 dev202-5 1.98 0.00 23.76 12.00 0.02 10.00 10.00 1.98
- Average: DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
- Average: dev202-0 3.96 0.00 154.46 39.00 0.04 11.00 7.00 2.77
- Average: dev202-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
- Average: dev202-2 2.97 0.00 142.57 48.00 0.03 11.33 6.00 1.78
- Average: dev202-3 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
- Average: dev202-4 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
- Average: dev202-5 0.99 0.00 11.88 12.00 0.01 10.00 10.00 0.99
参数说明: await表示平均每次设备I/O操作的等待时间(以毫秒为单位)。
svctm表示平均每次设备I/O操作的服务时间(以毫秒为单位)。
%util表示一秒中有百分之几的时间用于I/O操作。
tips:
正常情况下svctm应该是小于await值的,而svctm的大小和磁盘性能有关,CPU、内存的负荷也会对svctm值造成影响,过多的请求也会间接的导致svctm值的增加。
await值的大小一般取决与svctm的值和I/O队列长度以及I/O请求模式,如果svctm的值与await很接近,表示几乎没有I/O等待,磁盘性能很好,如果await的值远高于svctm的值,则表示I/O队列等待太长,系统上运行的应用程序将变慢,此时可以通过更换更快的硬盘来解决问题。
%util项的值也是衡量磁盘I/O的一个重要指标,如果%util接近100%,表示磁盘产生的I/O请求太多,I/O系统已经满负荷的在工作,该磁盘可能存在瓶颈。长期下去,势必影响系统的性能,可以通过优化程序或者通过更换更高、更快的磁盘来解决此问题。
5. 网络性能评估
5.1 评估标准
5.2 ping
- [admin@v015208 ~]$ ping oo.taobao.com
- PING xxxx.com (xxxxx.xxxx.xx.xx) 56(84) bytes of data.
- 64 bytes from 110.75.27.36: icmp_seq=1 ttl=60 time=0.360 ms
- 64 bytes from 110.75.27.36: icmp_seq=2 ttl=60 time=0.386 ms
- 64 bytes from 110.75.27.36: icmp_seq=3 ttl=60 time=0.410 ms
- 64 bytes from 110.75.27.36: icmp_seq=4 ttl=59 time=0.562 ms
- --- list.split.wmlp.com ping statistics ---
- 4 packets transmitted, 4 received, 0% packet loss, time 2998ms
- rtt min/avg/max/mdev = 0.360/0.429/0.562/0.081 ms
time显示了两台主机之间的网络延时情况,如果此值很大,表示网络延迟很大。
packet loss表示网络丢包率,该值越小,表示网络的质量越高。
5.3 netstat -i检查网络接口状况
- [admin@v015208 ~]$ netstat -i
- Kernel Interface table
- Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg
- eth0 1500 0 121392042 0 0 0 109458078 0 0 0 BMRU
- lo 16436 0 2709895 0 0 0 2709895 0 0 0 LRU
参数说明:
l Iface:表示网络设备的接口名称
l MTU:表示最大传输单元,单位字节
l RX-OK/TX-OK:表示已经准确无误地接收/发送了多少数据包
l RX-ERR/TX-ERR:表示接收/发送数据包时产生了多少错误
l RX-DRP/TX-DRP:表示接收/发送数据包时丢弃了多少数据包
l RX-OVR/TX-OVR:表示由于误差而遗失了多少数据包
l Flg:表示接口标记,其中:
L:表示该接口是个回环设备
B:表示设置了广播地址
M:表示接收所有数据包
R:表示接口正在运行
U:表示接口处于活动状态
0:表示在该接口上禁用ARP
P:表示一个点到点的连接
tips:
正常情况下,RX-ERR/TX-ERR、RX-DRP/TX-DRP、RX-OVR/TX-OVR的值都应该为0,如果这几个选项的值不为0,并且很大,那么网络质量肯定有问题,网络传输性能也一定会下降。
当网络传输存在问题时,可以检测网卡设备是否存在故障,如果可能,可以升级为千兆网卡或者光纤网络,还可以检查网络部署环境是否合理。
5.4 netstat -r检查系统的路由表信息
- [admin@v015208 ~]$ netstat -r
- Kernel IP routing table
- Destination Gateway Genmask Flags MSS Window irtt Iface
- 10.232.15.0 * 255.255.255.0 U 0 0 0 eth0
- 169.254.0.0 * 255.255.0.0 U 0 0 0 eth0
- default UNKNOWN-10-232- 0.0.0.0 UG 0 0 0 eth0
5.5 sar -n显示网络运行状态
- [admin@v015208 ~]$ sar -n DEV 1 2
- Linux 2.6.18-164.el5xen (v015208.sqa.cm4) 2012年03月19日
- 11时12分12秒 IFACE rxpck/s txpck/s rxbyt/s txbyt/s rxcmp/s txcmp/s rxmcst/s
- 11时12分13秒 lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00
- 11时12分13秒 eth0 7.92 6.93 671.29 709.90 0.00 0.00 0.00
- 11时12分13秒 sit0 0.00 0.00 0.00 0.00 0.00 0.00 0.00
- 11时12分13秒 IFACE rxpck/s txpck/s rxbyt/s txbyt/s rxcmp/s txcmp/s rxmcst/s
- 11时12分14秒 lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00
- 11时12分14秒 eth0 10.00 11.00 1342.00 1941.00 0.00 0.00 0.00
- 11时12分14秒 sit0 0.00 0.00 0.00 0.00 0.00 0.00 0.00
- Average: IFACE rxpck/s txpck/s rxbyt/s txbyt/s rxcmp/s txcmp/s rxmcst/s
- Average: lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00
- Average: eth0 8.96 8.96 1004.98 1322.39 0.00 0.00 0.00
- Average: sit0 0.00 0.00 0.00 0.00 0.00 0.00 0.00
参数说明:
l Iface:表示网络设备的接口名称
l rxpck/s:表示每秒钟接收的数据包大小
l txpck/s:表示每秒钟发送的数据包大小
l rxbyt/s:表示每秒钟接收的字节数
l txbyt/s:表示每秒钟发送的字节数
l rxcmp/s:表示每秒钟接收的压缩数据包
l txcmp/s:表示每秒钟发送的压缩数据包
l rxmcst/s:表示每秒钟接收的多播数据包
tips:
利用sar –n EDEV 1 2统计网络错误信息;利用sar -n SOCK 1 2可以统计套接字信息;
6. 任务进程分析
6.1 ps -afx 和 pstree -pu查看进程列表
详见:http://phoenix-mvp.iteye.com/admin/blogs/1442402
6.2 top查看进程
(按M键)和执行时间(按T键)来排序.
6.3 ps -aux查看所有进程
ps -aux|grep java查找java进程
6.4 使用jps命令查看java进程情况
6.5 traceroute
三. JVM监控方法
1. 相关说明
尽量少的Full GC
Full GC耗时小于40ms,Young GC小于20ms
2. 相关工具
2.1 线上使用相关命令
我们的应用线上没有配置JAVA_HOME,要是jps,jstat等命令,需要进入opt/taobao/java/bin目录
2.1 获取java应用进程
线上使用jps时,会发现每次jps命令获取到的进程一直在变,无法使用jstat等命令进行分析。(在测试环境是可以通过jps获取的)
线上可以使用pstree -pu命令获取系统的进程树如下图所示,7764就是本应用的java进程。
- |-run.sh(7753,admin)---java(7764)-+-{java}(7765)
- | |-{java}(7766)
- | |-{java}(7767)
- | |-{java}(7768)
- | |-{java}(7769)
- | |-{java}(7770)
- | |-{java}(7771)
- | |-{java}(7772)
- | |-{java}(7773)
- | |-{java}(7774)
- | |-{java}(7775)
- | |-{java}(7776)
- | |-{java}(7777)
- | |-{java}(7778)
- | |-{java}(7779)
- | |-{java}(7797)
- | |-{java}(7800)
- | |-{java}(7801)
- | |-{java}(7804)
2.1 jstat
命令说明:一个极强的监视VM内存工具。可以用来监视VM内存内的各种堆和非堆的大小及其内存使用量。
线上如无法使用该命令,可尝试加上sudo
- [admin@v015213 ~]$ jstat -gcutil 4678 2s
- S0 S1 E O P YGC YGCT FGC FGCT GCT
- 99.93 0.00 99.04 32.54 68.77 6 0.877 1 0.056 0.933
- 0.00 75.19 27.85 32.54 71.80 7 1.007 1 0.056 1.063
- 0.00 75.19 90.17 32.54 73.36 7 1.007 1 0.056 1.063
- 65.15 0.00 33.38 35.12 73.83 8 1.150 1 0.056 1.207
参数说明: S0 — Heap上的 Survivor space 0 区已使用空间的百分比
S1 — Heap上的 Survivor space 1 区已使用空间的百分比
E — Heap上的 Eden space 区已使用空间的百分比
O — Heap上的 Old space 区已使用空间的百分比
P — Perm space 区已使用空间的百分比
YGC — 从应用程序启动到采样时发生 Young GC 的次数
YGCT– 从应用程序启动到采样时 Young GC 所用的时间(单位秒)
FGC — 从应用程序启动到采样时发生 Full GC 的次数
FGCT– 从应用程序启动到采样时 Full GC 所用的时间(单位秒)
GCT — 从应用程序启动到采样时用于垃圾回收的总时间(单位秒)
tips:
(1)一次Young GC时间 = 1.007 - 0.877 = 0.130 秒 这个时间就太长了,JVM性能不佳
(2)S0和S1的变化可以看出对象创建和Young GC相关情况
2.2 jmap
命令说明:打印出某个java进程(使用pid)内存内的,所有‘对象’的情况(如:产生那些对象,及其数量)。
jmap 是一个可以输出所有内存中对象的工具,甚至可以将VM 中的heap,以二进制输出成文本。使用方法 jmap -histo pid。如果连用 SHELL jmap -histo pid>a.log可以将其保存到文本中去(windows下也可以使用),在一段时间后,使用文本对比工具,可以对比出GC回收了哪些对象。jmap -dump:format=b,file=f1 3024可以将3024进程的内存heap输出出来到f1文件里。
2.3 jstack
命令说明:输出当前线程执行的堆栈情况
注意:使用-l参数可以查看锁信息,但是会导致应用停顿。线上慎用!
其他相关命令这里见这里:http://blog.csdn.net/fenglibing/article/details/6411940
3. 远程监控JVM
3.1 jconsole jvisualVM
jconsole jvisualVM都自带远程监控。
需配置配置以下几个关键项,具体参考:http://ihuangweiwei.iteye.com/blog/1219302
(1). -Dcom.sun.management.jmxremote.port :这个是配置远程 connection 的端口号的,要确定这个端口没有被占用
(2). -Dcom.sun.management.jmxremote.ssl=false 指定了 JMX 是否启用 ssl
(3). -Dcom.sun.management.jmxremote.authenticate=false 指定了JMX 是否启用鉴权(需要用户名,密码鉴权)
(4). -Djava.rmi.server.hostname :这个是配置 server 的 IP 的
其中 (2) , (3) 两个是固定配置,是 JMX 的远程服务权限的
3.2 Xmanager远程监控
下面是使用说明:
Window client - 10.19.18.14 | Linux server - 10.232.15.213
1. 在Window client上安装Xmanager Enterprise 3,启动Xmanager - Passive
2. ssh工具登录服务器;
3. [admin@v015213 ~]$ export DISPLAY=10.19.18.14:0.0
4. [admin@v015213 ~]$ jvisualvm
5. client端弹出提示框,点击是,即在window client端启动visualVM工具,监控服务端jvm情况
4. 常用技巧
4.1 相关情况统计 http://phoenix-mvp.iteye.com/admin/blogs/1447647
4.2 手动重启应用 进入bin目录,sudo -u admin -H ./jbossctl restart
4.3 及时记录现场日志
4.4 分析cor
lf