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

Linux常用命令(6)-性能瓶颈分析(java)

2014-11-26 18:11 846 查看
主要分析的对象:CPU内存磁盘IO网络性能IO 相关,IO 相关的应用通常用来处理大量数据,需要大量内存和存储,频繁 IO 操作读写数据,而对 CPU 的要求则较少,大部分时候 CPU 都在等待硬盘,比如,数据库服务器、文件服务器等。CPU 相关,CPU 相关的应用需要使用大量 CPU,比如高并发的 web/mail 服务器、图像/视频处理、科学计算等都可被视作 CPU 相关的应用。监测工具:我们只需要简单的工具就可以对 Linux 的性能进行监测,常用的工具:工具 简单介绍top 查看进程活动状态以及一些系统状况vmstat 查看系统状态、硬件和系统信息等iostat 查看CPU 负载,硬盘状况sar 综合工具,查看系统状况mpstat 查看多处理器状况netstat 查看网络状况iptraf 实时网络状况监测tcpdump 抓取网络数据包,详细分析tcptrace 数据包分析工具netperf 网络带宽工具dstat 综合工具,综合了 vmstat, iostat, ifstat, netstat 等多个信息top:top命令监控CPU利用率,进程状态和内存利用率并且可以详细列出每一个进程占用了多少CPU和多少内存。[map@ctb-test sectionLocus]$ toptop - 10:52:24 up 99 days, 21:31, 6 users, load average: 1.67, 2.01, 1.83Tasks: 665 total, 2 running, 663 sleeping, 0 stopped, 0 zombieCpu(s): 7.3%us, 2.4%sy, 0.0%ni, 84.8%id, 4.6%wa, 0.0%hi, 1.0%si, 0.0%st PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 20042 map 20 0 8681m 4.8g 10m S 165.4 30.7 59:46.66 java 3023 root 20 0 150m 5464 700 R 74.2 0.0 84883:39 redis-sentinel 8066 root 20 0 0 0 0 D 2.5 0.0 11:10.48 flush-8:16第一行:10:52:24 up 99 days, 21:31 当前系统时间;6 users :当前有6个用户登录系统;load average: 1.67, 2.01, 1.83 后面的三个数分别是1分钟、5分钟、15分钟的负载情况。第二行:Tasks: 665 任务(进程) 总共665个,其中2个运行,663个睡眠,stoped状态的有0个,zombie状态(僵尸)的有0个第三行:cpu状态6.7% us 用户空间占用CPU的百分比。0.4% sy 内核空间占用CPU的百分比。0.0% ni 改变过优先级的进程占用CPU的百分比92.9% id 空闲CPU百分比0.0% wa IO等待占用CPU的百分比0.0% hi 硬中断(Hardware IRQ)占用CPU的百分比0.0% si 软中断(Software Interrupts)占用CPU的百分比load average值的含义单核处理器假设我们的系统是单CPU单内核的,把它比喻成是一条单向马路,把CPU任务比作汽车。当车不多的时候,load <1;当车占满整个马路的时候 load=1;当马路都站满了,而且马路外还堆满了汽车的时候,load>1 多核处理器我们经常会发现服务器Load > 1但是运行仍然不错,那是因为服务器是多核处理器(Multi-core)。假设我们服务器CPU是2核,那么将意味我们拥有2条马路,我们的Load = 2时,所有马路都跑满车辆。 #查看CPU core grep 'model name' /proc/cpuinfo | wc -l在top基本视图中,按键盘数字1,可监控每个逻辑CPU的状况:top - 13:44:20 up 100 days, 23 min, 7 users, load average: 3.32, 2.72, 2.25Tasks: 664 total, 2 running, 662 sleeping, 0 stopped, 0 zombieCpu0 : 14.8%us, 38.5%sy, 0.0%ni, 21.9%id, 0.0%wa, 0.0%hi, 24.8%si, 0.0%stCpu1 : 1.0%us, 40.8%sy, 0.0%ni, 0.3%id, 57.8%wa, 0.0%hi, 0.0%si, 0.0%stCpu2 : 1.3%us, 4.0%sy, 0.0%ni, 94.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%stCpu3 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%stCpu4 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%stCpu5 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%stCpu6 : 0.3%us, 0.0%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%stCpu7 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%stCpu8 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%stCpu9 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%stCpu10 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%stCpu11 : 0.0%us, 5.3%sy, 0.0%ni, 94.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%stCpu12 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%stCpu13 : 0.0%us, 5.6%sy, 0.0%ni, 93.0%id, 1.3%wa, 0.0%hi, 0.0%si, 0.0%stCpu14 : 0.7%us, 0.3%sy, 0.0%ni, 99.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%stCpu15 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%stCpu16 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%stCpu17 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%stCpu18 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%stCpu19 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%stCpu20 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%stCpu21 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%stCpu22 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%stCpu23 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%stMem: 16280412k total, 16117744k used, 162668k free, 324536k buffersSwap: 32767992k total, 11516272k used, 21251720k free, 13336076k cached[map@ctb-test sectionLocus]$ vmstatprocs -----------memory---------- ---swap-- -----io---- --system-- -----cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 1 1 12131504 163788 275616 8459504 0 0 29 23 0 0 8 2 90 0 0r表示运行队列的大小,b表示由于IO等待而block的线程数量,in表示中断的数量,cs表示上下文切换的数量,us表示用户CPU时间,sys表示系统CPU时间,wa表示由于IO等待而是CPU处于idle状态的时间,id表示CPU处于idle状态的总时间。dstat可以给出每一个设备产生的中断数:1.对于每一个CPU来说运行队列不要超过3,例如,如果是双核CPU就不要超过6;2.如果CPU在满负荷运行,应该符合下列分布,a) User Time:65%~70%b) System Time:30%~35%c) Idle:0%~5%mapstat:默认情况下,只会输出全部平均值[map@ctb-test sectionLocus]$ mpstat Linux 2.6.32-431.1.2.0.1.el6.x86_64 (ctb-test) 09/16/2014 _x86_64_ (24 CPU)10:53:53 AM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle10:53:53 AM all 7.87 0.00 1.33 0.20 0.00 0.64 0.00 0.00 89.95mpstat -P ALL查看每一个CPU的情况[map@ctb-test sectionLocus]$ mpstat -P ALLLinux 2.6.32-431.1.2.0.1.el6.x86_64 (ctb-test) 09/16/2014 _x86_64_ (24 CPU)10:53:26 AM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle10:53:26 AM all 7.87 0.00 1.33 0.20 0.00 0.64 0.00 0.00 89.9510:53:26 AM 0 16.66 0.00 31.15 0.96 0.06 17.06 0.00 0.00 34.1110:53:26 AM 1 8.80 0.00 0.46 2.30 0.00 0.01 0.00 0.00 88.4210:53:26 AM 2 7.59 0.00 0.30 0.13 0.00 0.00 0.00 0.00 91.9810:53:26 AM 3 7.92 0.00 0.10 0.05 0.00 0.00 0.00 0.00 91.9410:53:26 AM 4 7.29 0.00 0.25 0.08 0.00 0.00 0.00 0.00 92.3810:53:26 AM 5 7.48 0.00 0.09 0.03 0.00 0.00 0.00 0.00 92.4010:53:26 AM 6 7.00 0.00 0.12 0.05 0.00 0.00 0.00 0.00 92.8310:53:26 AM 7 7.30 0.00 0.07 0.03 0.00 0.00 0.00 0.00 92.6010:53:26 AM 8 6.82 0.00 0.09 0.04 0.00 0.00 0.00 0.00 93.0510:53:26 AM 9 7.19 0.00 0.07 0.02 0.00 0.00 0.00 0.00 92.7210:53:26 AM 10 6.68 0.00 0.09 0.04 0.00 0.00 0.00 0.00 93.1910:53:26 AM 11 7.08 0.00 0.06 0.02 0.00 0.00 0.00 0.00 92.8310:53:26 AM 12 7.09 0.00 1.20 0.67 0.00 0.00 0.00 0.00 91.0310:53:26 AM 13 8.16 0.00 0.13 0.25 0.00 0.00 0.00 0.00 91.4610:53:26 AM 14 7.78 0.00 0.10 0.06 0.00 0.00 0.00 0.00 92.0610:53:26 AM 15 7.60 0.00 0.13 0.03 0.00 0.00 0.00 0.00 92.2410:53:26 AM 16 7.56 0.00 0.09 0.04 0.00 0.00 0.00 0.00 92.3110:53:26 AM 17 7.79 0.00 0.05 0.02 0.00 0.00 0.00 0.00 92.1410:53:26 AM 18 7.56 0.00 0.06 0.03 0.00 0.00 0.00 0.00 92.3510:53:26 AM 19 7.80 0.00 0.05 0.01 0.00 0.00 0.00 0.00 92.1410:53:26 AM 20 7.50 0.00 0.05 0.03 0.00 0.00 0.00 0.00 92.4110:53:26 AM 21 7.81 0.00 0.05 0.01 0.00 0.00 0.00 0.00 92.1310:53:26 AM 22 7.50 0.00 0.05 0.02 0.00 0.00 0.00 0.00 92.4210:53:26 AM 23 7.80 0.00 0.05 0.01 0.00 0.00 0.00 0.00 92.13通过使用ps命令,可以很清楚的看出到底是哪一条进程在吃CPU[map@ctb-test sectionLocus]$ ps -eo pcpu,pid,user,args | sort -k 1 -r | head -16%CPU PID USER COMMAND 6.2 17319 map sshd: map@notty 59.0 3023 root ./src/redis-sentinel *:26379 1.6 17320 map /usr/libexec/openssh/sftp-server内存free -b,k,m,g[map@ctb-test section]$ free total used free shared buffers cachedMem: 16280412 16114224 166188 0 305212 8181816-/+ buffers/cache: 7627196 8653216Swap: 32767992 12064588 20703404total:物理内存的总大小used:已经使用的物理内存大小free:空闲的物理内存大小shared:多个进程共享的内存大小buffers/cached:磁盘缓存的大小第二行Mem:代表物理内存使用情况第三行(-/+ buffers/cached):代表磁盘缓存使用状态第四行:Swap表示交换空间内存使用状态free命令输出的内存状态,可以通过两个角度来查看:一个是从内核的角度来看,一个是从应用层的角度来看的。IO 监控top 的%wa指CPU等待磁盘写入完成的时间。莫非是磁盘忙,怎样证明是磁盘在忙?df -h 查看硬盘的分区信息[map@ctb-test sectionLocus]$ df -hFilesystem Size Used Avail Use% Mounted on/dev/mapper/VolGroup-Lv_root 244G 164G 68G 71% /tmpfs 7.8G 0 7.8G 0% /dev/shm/dev/sda1 485M 54M 406M 12% /boot/dev/sdb1 1.8T 1.1T 687G 61% /mapiostatiostat主要用于监控系统设备的IO负载情况,iostat首次运行时显示自系统启动开始的各项统计信息,之后运行iostat将显示自上次运行该命令以后的统计信息。参数 -d 表示,显示设备(磁盘)使用状态;-k某些使用block为单位的列强制使用Kilobytes为单位;2表示,数据显示每隔2秒刷新一次。[map@ctb-test sectionLocus]$ iostat -d -k 2Linux 2.6.32-431.1.2.0.1.el6.x86_64 (ctb-test) 09/16/2014 _x86_64_ (24 CPU)09/16/2014 11:35:05 AMDevice: tps kB_read/s kB_wrtn/s kB_read kB_wrtnsdb 26.34 679.38 486.98 5865509664 4204394924sda 8.41 12.06 51.23 104118766 442327556dm-0 11.68 6.29 45.14 54302885 389705884dm-1 2.97 5.77 6.09 49812588 52621612tps:该设备每秒的传输次数(Indicate the number of transfers per second that were issued to the device.)。"一次传输"意思是"一次I/O请求"。多个逻辑请求可能会被合并为"一次I/O请求"。"一次传输"请求的大小是未知的。kB_read/s:每秒从设备(drive expressed)读取的数据量;kB_wrtn/s:每秒向设备(drive expressed)写入的数据量;kB_read:读取的总数据量;kB_wrtn:写入的总数量数据量;这些单位都为Kilobytes。[map@ctb-test sectionLocus]$ iostat -d -k -x 203/03/2015 02:03:26 PMDevice: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %utilsdd 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00sdc 0.00 1.50 0.00 14.00 0.00 62.00 8.86 0.69 48.93 3.89 5.45sda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00sdb 146.00 316.00 100.00 291.00 812.00 2030.00 14.54 284.88 359.65 2.56 100.00dm-0 0.00 0.00 0.00 15.50 0.00 62.00 8.00 0.75 48.32 3.52 5.45dm-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00rrqm/s:每秒这个设备相关的读取请求有多少被Merge了(当系统调用需要读取数据的时候,VFS将请求发到各个FS,如果FS发现不同的读取请求读取的是相同Block的数据,FS会将这个请求合并Merge);wrqm/s:每秒这个设备相关的写入请求有多少被Merge了。rsec/s:每秒读取的扇区数;wsec/:每秒写入的扇区数。rKB/s:The number of read requests that were issued to the device per second;wKB/s:The number of write requests that were issued to the device per second;avgrq-sz 平均请求扇区的大小avgqu-sz 是平均请求队列的长度。毫无疑问,队列长度越短越好。 await: 每一个IO请求的处理的平均时间(单位是微秒毫秒)。这里可以理解为IO的响应时间,一般地系统IO响应时间应该低于5ms,如果大于10ms就比较大了。 这个时间包括了队列时间和服务时间,也就是说,一般情况下,await大于svctm,它们的差值越小,则说明队列时间越短,反之差值越大,队列时间越长,说明系统出了问题。svctm 表示平均每次设备I/O操作的服务时间(以毫秒为单位)。如果svctm的值与await很接近,表示几乎没有I/O等待,磁盘性能很好,如果await的值远高于svctm的值,则表示I/O队列等待太长, 系统上运行的应用程序将变慢。%util: 在统计时间内所有处理IO时间,除以总共统计时间。例如,如果统计间隔1秒,该设备有0.8秒在处理IO,而0.2秒闲置,那么该设备的%util = 0.8/1 = 80%,所以该参数暗示了设备的繁忙程度。一般地,如果该参数是100%表示设备已经接近满负荷运行了(当然如果是多磁盘,即使%util是100%,因为磁盘的并发能力,所以磁盘使用未必就到了瓶颈)。

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: