常用命令 1.磁盘IOPS,网卡流量,cpu dstat -cdmgnsyr --lock --ipc --top-cpu --top-io --top-mem --proc-count ----total-cpu-usage---- -disk/total- --net/eth0- ---paging-- ---system-- 一、概述 二、什么是性能调优?(what) 三、为什么需要性能调优?(why) 四、什么时候需要性能调优?(when) 五、什么地方需要性能调优?(where) 六、什么人来进行性能调优?(who) 七、怎么样进行性能调优?(How) http://freeloda.blog.51cto.com/2033581/1438052,非常有用 服务器选型都有讲到 有的硬件不能满足业务需求,所我们这时需要更换更好的CPU、更大的内存和更快的磁盘。 至于如何找出硬件是性能瓶颈 操作系统优化包括哪些: 操作系统安装优化 系统初始化 进程调优 内存调优 IO 调优 文件系统调优 网络调化 运维应该特别注意,项目上线后,要紧紧盯住监控 性能指标 –> 确认衡量标准 性能测试 –> 验证性能指标 性能分析 –> 找出性能瓶颈 性能调优 –> 解决性能问题 性能监控 –> 检验调优效果 1.性能指标 上面我们说了,我们优化的目的是为了获得更好的性能,那么性能指标是什么呢?我们怎么样来衡量,一般衡量一个项目(这里指的网站)的指标有三个: 吞吐量 –> 是单位时间内完成的用户或系统的请求数量。 并发数 –> 同时能接受多少用户的访问请求 响应时间 –> 用户发出请求到收到响应的时间间隔。 磁盘性能指标--IOPS、吞吐量及测试 http://wushank.blog.51cto.com/3489095/1708168 2.性能测试 我们做产品或者说项目(更直白的说是网站)目的是为了让用户使用,我们得先站在用户的角度分析一下,用户需要关注哪些性能,对于用户来说,当点击一个按钮、链接或发出一个操作指令,到系统把请求处理好发给用户并用网页的形式展现出来为止,这个过程中所消耗的时间是用户对这个网站性能的直观印象。也就是我们所说的响应时间,当响应时间较小时,用户体验相对来说就会好,当然用户体验的响应时间包括个人主观因素和客观响应时间。在网站开发与搭建时,我们就需要考虑到如何更好地结合这两部分达到用户最佳的体验。用户关注的是用户操作的相应时间。其次,我们站在运维的角度考虑需要关注的性能点。再次,我们得站在开发(设计)人员角度去考虑网站性能。最后,由QA测试与反馈我们网站性能。 经过上述的说明,我们来测试系统的性能,需要我们收集系统的吞吐量、并发数、响应时间这三个重要的指标。具体步骤是: 确认吞吐量、并发数、响应时间这三个值 找到或开发相应的性能测试工具 进行性能测试 反馈结果并提交测试报告 结果,有两个一种是达到我们预期的性能目标,这样我们就不需要性能优化任务完成可以交给运维上线,只需要进行相关的性能监控,方便上线后进行性能优化。另一种是没有达到我们预期的目标,我们要查找性能瓶颈并进行性能优化。 3.性能分析 通过上面的性能测试,我们发现网站没有达到我们预期定义的性能目标,这时我们需要做的就是对现有的系统(服务器)进行监控,包括硬件与软件监控,为性能调优提供有效的性能监控数据。下面我们重点来说一下,用什么工具能找出性能瓶颈: 硬件: 用vmstat、sar、iostat检测是否是CPU瓶颈 用free、vmstat检测是否是内存瓶颈 用iostat检测是否是磁盘I/O瓶颈 用netstat检测是否是网络带宽瓶 …… 操作系统: 进程 文件系统 SWAP 分区 内核参数调整 …… 应用程序(MySQL等): mysqlreport 性能分析报告 mysqlsla 慢查询日志分析 …… 4.性能调优 确定调优目标 具体调优步骤 检测调优结果 (1). 确定调优目标 我们性能优化的目标是网站性能提高10%还是20%,不能老大说今天你给我优化一下网站性能,你就能使用网站性能翻一倍。首先,你要问他我们需要达到一个怎么的目标。然后,我们要了解一下整个环境(架构)包括代码(当然你需要了解一下业务逻辑,大致了解一下,肯定没坏处),有时间多和开发沟通一下,问问代码中有多少坑要填,这很重要。往往他们优一下代码中的SQL查询,比你优化系统多少天都来的有效果,哈哈。 (2). 具体调优步骤 如果你不懂系统的参数,你千万不要对系统的参数进行随意的改动,不然你会后悔。 每次只对一种系统资源进行系统调试,如CPU、或内存、磁盘。 每次改动尽量少的参数设置,推荐每次修改一个设置。 分析一项系统资源时,使用多种工具,往往有意想不到的结果。 不及胜于过之(宁愿少做一点,不要做过头了,性能已达到要求就不要随意乱动,做好你的监控)。 (3). 检测调优结果 每次性能调优后必须对性能进程检测,如Web服务器的ab工具,就是一个很好的检测工具,每次调优后都能看到具体的变化。 5.性能监控 性能监控这个很重要,具体包括服务器性能监控和具体服务的性能监控。下面我们说一说具体有哪些性能监控指标: (1).服务器的性能监控 CPU 使用率 CPU负载 内存使用率 磁盘I/O 网络流量 磁盘空间 系统进程 性能监控的指标,性能监控无非就是从I/O,内存,CPU,TCP连接数,网络,进程或者线程来出发, 使用到的命令有iostat,vmstat,sar,mpstat,netstat,ss,iftop,free,pstree/ps,pidstat,top,uptime 1.vmstat r b swpd free buff cache si so bi bo in cs us sy id wa st 如果r大于3或4,且id小于%50,则CPU是瓶颈。 wa经常不等于0,b中的队列较大,则IO是瓶颈。 如bi bo长期不等于0,则内存较小 vmstat 2 3 如果si和so长期不为0,表示系统内存不足;而如果swpd的值长期不为0,但si和so的值长期为0,则无需担心 in和cs的值越大,内核消耗cpu时间越大 2.iostat iostat [ -c | -d] [ -k ] [ -t ] [ -x [device] ] [ <interval> [ <count> ] ] Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util avgrq-sz:平均每次IO操作的数据大小(扇区),即(rsec/s+wsec/s)/(r/s+w/s) %util:一秒中有百分之多少的时间用于IO操作,即(r/s+w/s)*(svctm/1000) iostat -xk 1每一秒打印磁盘相关情况。 几个比较重要的参数做解释: r/s:每秒读次数 w/s:每秒写操作 rkB/s:每秒读kB大小 wkB/s:每秒写kB大小 wait:平均每次设备I/O操作的时间 %util:一秒中有百分之多少的时间用于 I/O 操作,即被io消耗的cpu百分比 如果util达到100%说明已经达到磁盘的I/O瓶颈,需要优化,或者换成SSD 如果%util较大代表IO请求太多,硬盘可能存在瓶颈。 如果avctm比较接近await,说明IO几乎没等待时间。 如果await远大于avctm,说明IO队列太长,应用响应时间也变长。 avgqu-sz队列长度也可衡量IO负荷的指标,avgqu-sz是单位时间内的平均值。 其它还可参考vmstat结果b参数(等待资源的进程数)和wa参数(IO等待所占用CPU时间百分比) 如果svctm值和await值很接近,则表示I/O几乎没有等待,如果await的值远高于svctm的值, 则表示I/O队列等待太长 如果是多磁盘,即使%util是100%,因为磁盘的并发能力,所以磁盘使用未必就到了瓶颈 iostat -d and iostat -c 查看哪一块磁盘占用的磁盘I/O比较高iostat iostat -xk 1 sar -u 1 3 统计cpu sar -P 0 1 2 第一个cpu sar -d 1 3 io sar -r 1 3 内存 sar -n DEV 1 eth0网卡设备,吞吐率大概在22 Mbytes/s,既176 Mbits/sec,没有达到1Gbit/sec的硬件上限 sar -n TCP,ETCP 1 sar命令在这里用于查看TCP连接状态,其中包括: active/s:每秒本地发起的TCP连接数,既通过connect调用创建的TCP连接; passive/s:每秒远程发起的TCP连接数,即通过accept调用创建的TCP连接; retrans/s:每秒TCP重传数量; TCP连接数可以用来判断性能问题是否由于建立了过多的连接,进一步可以判断是主动发起的连接, 还是被动接受的连接。TCP重传可能是因为网络环境恶劣,或者服务器压力过大导致丢包。 uptime load average的三个输出值如果大于系统逻辑cpu数量时,表示cpu繁忙,会影响系统性能 CPU(dstat,mpstat) dstat 2 10 cpu:hiq、siq分别为硬中断和软中断次数 system:int、csw分别为系统的中断次数(interrupt)和上下文切换次数(context switch)。 -c:表示只显示我们的CPU信息 -m:表示只显示我们的内存信息 -p:表示只显示我们的进程信息 -n:表示只显示我们的网络信息 我们想以什么为什么优先顺序查看,可以在后面加下列参数,非常有用 --top-bio mpstat %user 在internal时间段里,用户态的CPU时间(%),不包含nice值为负进程 (usr/total)*100 %nice 在internal时间段里,nice值为负进程的CPU时间(%) (nice/total)*100 %sys 在internal时间段里,内核时间(%) (system/total)*100 %iowait 在internal时间段里,硬盘IO等待时间(%) (iowait/total)*100 %irq 在internal时间段里,硬中断时间(%) (irq/total)*100 %soft 在internal时间段里,软中断时间(%) (softirq/total)*100 %idle 在internal时间段里,CPU除去等待磁盘IO操作外的因为任何原因而空闲的时间闲置时间(%) (idle/total)*100 TCP连接数(ss,netstat) 网络(iftop) iftop -i eth0 时时流量查看工具-ifsta,nload,iftop nload 快速查看总带宽使用情况,无需每个进程的详细情况 bmon(带宽监控器)是一款类似nload的工具,它可以显示系统上所有网络接口的流量负载 iftop 可测量通过每一个套接字连接传输的数据 虽然iftop报告每个连接所使用的带宽,但它无法报告参与某个套按字连接的进程名称/编号(ID) iftop -n iptraf是一款交互式、色彩鲜艳的IP局域网监控工具。它可以显示每个连接以及主机之间传输的数据量 nethogs是一款小巧的"net top"工具,可以显示每个进程所使用的带宽,并对列表排序,将耗用带宽最多的进程排在最上面 pktstat可以实时显示所有活动连接,并显示哪些数据通过这些活动连接传输的速度。它还可以显示连接类型,比如TCP连接或UDP连接 pidstat pidstat来查看每一个进程的pid的状态信息,以及他所占的CPU信息 http://lizhenliang.blog.51cto.com/7876557/1687612 df -i |awk '/^\/dev/{print int($5)}' #占用CPU高的前10个进程 ps aux |awk '{if($3>0.1){{printf "PID: "$2" CPU: "$3"% --> "}for(i=11;i<=NF;i++)if(i==NF)printf $i"\n";else printf $i}}' |sort -k4 -nr |head -10 #占用内存高的前10个进程 ps aux |awk '{if($4>0.1){{printf "PID: "$2" Memory: "$3"% --> "}for(i=11;i<=NF;i++)if(i==NF)printf $i"\n";else printf $i}}' |sort -k4 -nr |head -10 ps -p 25063 -o %cpu|sed -n 2p ps aux|grep -v PID|sort -rn -k +3|head -n 1,看到的结果与top看到不一样,命令对不 3.free 清空内存缓存 sync #先将缓存写入磁盘 echo 1 > /proc/sys/vm/drop_caches #释放buffer cache echo 2 > /proc/sys/vm/drop_caches #释放page cache echo 3 > /proc/sys/vm/drop_caches #释放buffer cache和page cache 内存=free memory+buffers+cached 4.统计当前占用IO最高的10个进程 sysctl vm.block_dump=1或echo 1 >/proc/sys/vm/block_dump dmesg |awk -F: '{print $1}'|sort|uniq -c|sort -rn|head -n 10 查看哪个进程占用的I/O过高,使用iotop,ps,lsof iotop ps -eo state,pid,cmd for x in `seq 1 1 10`;do ps -eo state,pid,cmd | grep "^D" ;echo "-------";sleep 1;done 通过man ps可以查到 D Uninterruptible sleep (usually IO) R Running or runnable (on run queue) S Interruptible sleep (waiting for an event to complete) T Stopped, either by a job control signal or because it is being traced. W paging (not valid since the 2.6.xx kernel) X dead (should never be seen) Z Defunct ("zombie") process, terminated but not reaped by its parent. D的状态一般是I/O出现了问题,说明进程在等待I/O,可以是磁盘I/O,网络I/O或者其他,详细: https://blog.xupeng.me/2009/07/09/linux-uninterruptible-sleep-state/ lsof -p 进程号 为了查看此进程在读哪个文件,或者在写入哪个文件 ps(top) cheatsheet http://jaseywang.me/2014/12/11/pstop-cheatsheet/ 展开 tid htop -> F2 ps -p PID -L -o pid,tid,psr,pcpu 特定的 pid, tid 跑在哪些 core 上 1. top -H -p {PID} -> f -> j 2. /proc/{PID}/stat -> 第三列: running/stop,倒数第六列: core 通过 -o 指定需要获取的条目: ps -eLf/ps aux -L ps -eLo pid,ppid,lwp,nlwp,osz,rss,ruser,pcpu,stime,etime,args | more ps -eLo pcpu,args | grep java | sort -k1 -r | awk '{print $1}' | head -n 1 ps ax –no-headings -o user,pid,%cpu,%mem,vsz,sgi_rss ps axo "user=%u, pid=%p, command line args=%a, elapsed time=%t" ps axo "Application: %c | CommandlineArgs: %a | PercentageCpu: %C | User: %U | VirtualMemory: %z" –sort vsize | tail 上面的说了这么多,其实是为了解决下面这个问题,找出 java 中最耗 cpu 的 tid,jstack 追踪。 要找出这 tid 方式也有很多种,top,ps 都可以实现。 top -H |head -n 10|grep java|awk '{print $1}'|head -n 1 |sed -r 's/[^0-9].*m//g' 主要注意的是 top -H 直接 grep 出来的有乱码,所以需要通过 sed 处理下, 为了这个问题还花了点时间,最后把结果 pipe 到文件,vim 打开才发现了问题。 ps -eLo pcpu,args | grep java | sort -k1 -r | awk '{print $1}' | head -n 1 ps p {PID} -L -o time,pid,tid,pcpu,tname,stat,psr | sort -n -k1 –r ps 做法会好的多处理起来也更漂亮。 http://stackoverflow.com/questions/1519196/finding-usage-of-resources-cpu-and-memory-by-threads-of-a-process-in-unix-sol http://stackoverflow.com/questions/8032372/how-can-i-see-which-cpu-core-a-thread-is-running-in http://stackoverflow.com/questions/3342889/how-to-measure-separate-cpu-core-usage-for-a-process http://stackoverflow.com/questions/8032372/how-can-i-see-which-cpu-core-a-thread-is-running-in 5.htop wget http://ftp.gnu.org/pub/gnu/ncurses/ncurses-5.9.tar.gz tar xvfz ncurses-5.9.tar.gz cd ncurses-5.9 ./configure make make install wget http://sourceforge.net/projects/htop/files/htop/0.9/htop-0.9.tar.gz tar zxvf htop-0.9.tar.gz cd htop-0.9 ./configure make make install 6.修改最大文件数限制 cat >>/etc/security/limits.conf<<EOF * soft nproc 65535 * hard nproc 65535 * soft nofile 65535 * hard nofile 65535 EOF cat >> /etc/pam.d/login <<EOF session required /lib/security/pam_limits.so EOF 查看特定进程限制 cat /proc/1526/limits 7.Linux禁止atime提高IO性能 cat /etc/fstab /dev/VolGroup00/LogVol00 / ext3 defaults,noatime,nodiratime 1 1 mount -o remount / mount /dev/mapper/VolGroup00-LogVol00 on / type ext3 (rw,noatime,nodiratime) 8.Linux服务器内核网络参数优化 net.ipv4.tcp_syncookies = 1 #启用syncookies net.ipv4.tcp_max_syn_backlog = 8192 #SYN队列长度 net.ipv4.tcp_synack_retries=2 #SYN ACK重试次数 net.ipv4.tcp_fin_timeout = 30 #主动关闭方FIN-WAIT-2超时时间 net.ipv4.tcp_keepalive_time = 1200 #TCP发送keepalive消息的频度 net.ipv4.tcp_tw_reuse = 1 #开启TIME-WAIT重用 net.ipv4.tcp_tw_recycle = 1 #开启TIME-WAIT快速回收 net.ipv4.ip_local_port_range = 1024 65000 #向外连接的端口范围 net.ipv4.tcp_max_tw_buckets = 5000 #最大TIME-WAIT数量,超过立即清除 net.ipv4.tcp_syn_retries = 2 #SYN重试次数 net.ipv4.tcp_rmem = 4096 87380 4194304 #TCP接收缓冲大小,对应最小、默认、最大 net.ipv4.tcp_wmem = 4096 16384 4194304 #TCP发送缓冲大小,对应最小、默认、最大 net.core.rmem_max = 16777216 #最大发送套接字缓冲区大小 net.core.wmem_max = 16777216 #最大接收套接字缓冲区大小 net.core.netdev_max_backlog = 262144 #当网络接口接收速率比内核处理快时允许发到队列的数据包数目 net.core.somaxconn = 262144 #最大连接队列,超过导致连接超时或重传
案例
linux性能异常定位之进程级别
http://h2ofly.blog.51cto.com/6834926/1621481
top:综合,偏cpu,内存
dstat:综合、磁盘
iostat:磁盘io,全局
iotop:磁盘io,精确到进程,(类似工具还有pidstat)
iftop:网络、实时刷新(类似工具还有nload,ifstat)
nethogs:进程级别的流量
ss:网络、快、消耗资源低(替代netstat)
pidstat:综合的
free:额,内存。。。
top各行结果我就不详细介绍了,是用起来也比较简单。对于排查cpu是用率过高,比较关键的指令是P和T。
输入了P(冒号P)之后:按照cpu排序
输入T(冒号T):根据时间、累计时间排序,可查看哪些进程消耗历史消耗多
另外:还可以输入以下便捷指令
1:多核
m:是否显示内存信息
M:根据内存排序
H:shift+h,打开线程模式
x:列的高亮(先要按b)
shift+<或者shift+>改变排序的行
这里用来找到cpu暂用率最高的参数如下
dstat -lcm --top-cpu
下图可以看到,ntpd(时间服务)和zabbix的agent消耗cpu多点(其实也不多,才0.x%)
pidstat
直接输入pidstat(或者pidstat -l,会把命令的绝对路径输出)就可以看到进程使用cpu相关数据
查看哪个进程消耗了最多的内存
输入dstat lcmd -top-mem
看到,就puppet消耗了最多的内存59m(正常)
top
输入top之后,输入b,再输入x,再输入shift+’>’或者shif+’<‘调整排序的列到mem,就看到到内存消耗的排序了
一般我们对磁盘关注几个指标:
(1)读写的量/秒:dstat和iostat(全局),iotop或者pidstat(进程级别)
(2)每次读写磁盘的延迟时间:iostat(全局)
dstat,iostat用于查看全局的io情况,要精确到进程用iotop或者pidstat
dstat:可以看到磁盘每秒的读、写取量(单位还整理过,所以一般我看磁盘的读写量都会用这个工具)
iostat就可以看到:磁盘的磁盘每秒的读、写取量并且还可以看到io的延迟效果(一般我看io的延迟会用这个工具)
1、dstat
dstat可以看到每秒读写多少B、K、M的数据
dstat其他参数和常用使用还有:
dstat -g -l -m -s --top-mem
dstat -c -y -l --proc-count --top-cpu
2、iostat
也可以看到类似的效果,而且更加丰富
svctm < await (同时等待的请求的等待时间被重复计算),
如果 svctm 比较接近 await,说明I/O 几乎没有等待时间;
如果 await 远大于 svctm,说明 I/O 队列太长
await: 平均每次设备I/O操作的等待时间 (毫秒)。即 delta(ruse+wuse)/delta(rio+wio)
svctm: 平均每次设备I/O操作的服务时间 (毫秒):会将await也计算在内
%util: 一秒中有百分之多少的时间用于 I/O 操作,或者说一秒中有多少时间 I/O 队列是非空的。即 delta(use)/s/1000 (因为use的单位为毫秒)
iotop
通过iotop直接看得到io占用最高的进程,直接输入iotop命令
pidstat
通过pidstat -d也可以看到读写磁盘数据多的进程,pidstat -d效果如下
一般网络主要关注性能指标:
(1)出入的流量
(2)连接状态:各个状态如established,timewait等
(3)本地监听,消耗的端口数量等
iftop命令相关参数介绍如下:
-i设定监测的网卡,如:# iftop -i eth1
-B 以bytes为单位显示流量(默认是bits),如:# iftop -B
-n使host信息默认直接都显示IP,如:# iftop -n
-N使端口信息默认直接都显示端口号,如: # iftop -N
-F显示特定网段的进出流量,如# iftop -F 10.10.1.0/24或# iftop -F 10.10.1.0/255.255.255.0
-h(display this message),帮助,显示参数信息
nethogs
nethogs能直接就看到进程级别的流量
直接输入nethogs em2(网卡)就可以看到本地的哪些端口和对端的哪些端口之间的流量,从而就知道哪些进程消耗了很多网络流量了
其他案例
GlusterFS性能调优说明
NVMe设备的性能有多高?
分布式存储系统的优化 Ceph架构及性能优化
高性能linux业务集群架构搭建&优化——index(持续更新)
http://benpaozhe.blog.51cto.com/10239098/1770051
性能调优之网络篇
Ntop性能提升方案
Nicstat 查看所有网卡流量信息
用ss命令替代netstat
性能测试中如何确定并发用户数
对于大型系统、业务量非常高、硬件配置足够多的情况下,5000 用户并发就足够了;对于中小型系统,1000用户并发就足够了
在评定服务器的性能时,应该结合TPS和并发用户数,以TPS为主,并发用户数为辅来衡量系统的性能
案例1: iostat等命令看到的是系统级的统计,比如下例中我们看到/dev/sdb很忙,如果要追查是哪个进程导致的I/O繁忙,应该怎么办? # iostat -xd ... Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util sda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 sdb 0.00 0.00 6781.67 0.00 3390.83 0.00 1.00 0.85 0.13 0.13 0.00 0.13 85.03 dm-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 dm-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 dm-2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 ... 进程的内核数据结构中包含了I/O数量的统计: struct task_struct { ... struct task_io_accounting ioac; ... }; 可以直接在 /proc/<pid>/io 中看到: # cat /proc/3088/io rchar: 125119 //在read(),pread(),readv(),sendfile等系统调用中读取的字节数 wchar: 632 //在write(),pwrite(),writev(),sendfile等系统调用中写入的字节数 syscr: 111 //调用read(),pread(),readv(),sendfile等系统调用的次数 syscw: 79 //调用write(),pwrite(),writev(),sendfile等系统调用的次数 read_bytes: 425984 //进程读取的物理I/O字节数,包括mmap pagein,在submit_bio()中统计的 write_bytes: 0 //进程写出的物理I/O字节数,包括mmap pageout,在submit_bio()中统计的 cancelled_write_bytes: 0 //如果进程截短了cache中的文件,事实上就减少了原本要发生的写I/O 我们关心的是实际发生的物理I/O,从上面的注释可知,应该关注 read_bytes 和 write_bytes。请注意这都是历史累计值,从进程开始执行之初就一直累加。如果要观察动态变化情况,可以使用 pidstat 命令,它就是利用了/proc/<pid>/io 中的原始数据计算单位时间内的增量: # pidstat -d 2 2 Linux 3.10.0-229.14.1.el7.x86_64 (bj71s060) 11/16/2016 _x86_64_ (2 CPU) 12:30:15 PM UID PID kB_rd/s kB_wr/s kB_ccwr/s Command 12:30:17 PM 0 14772 3362.25 0.00 0.00 dd 12:30:17 PM UID PID kB_rd/s kB_wr/s kB_ccwr/s Command 12:30:19 PM 0 14772 3371.25 0.00 0.00 dd 另外还有一个常用的命令 iotop 也可以观察进程的动态I/O: Actual DISK READ: 3.31 M/s | Actual DISK WRITE: 0.00 B/s TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND 14772 be/4 root 3.31 M/s 0.00 B/s 0.00 % 61.99 % dd if=/de~lag=direct 1 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % systemd -~rialize 24 2 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kthreadd] ... pidstat 和 iotop 也有不足之处,它们无法具体到某个硬盘设备,如果系统中有很多硬盘设备,都在忙,而我们只想看某一个特定的硬盘的I/O来自哪些进程,这两个命令就帮不上忙了。怎么办呢?可以用上万能工具SystemTap。比如:我们希望找出访问/dev/sdb的进程,可以用下列脚本,它的原理是对submit_bio下探针: #! /usr/bin/env stap global device_of_interest probe begin { device_of_interest = $1 printf ("device of interest: 0x%x\n", device_of_interest) } probe kernel.function("submit_bio") { dev = $bio->bi_bdev->bd_dev if (dev == device_of_interest) printf ("[%s](%d) dev:0x%x rw:%d size:%d\n", execname(), pid(), dev, $rw, $bio->bi_size) } 这个脚本需要在命令行参数中指定需要监控的硬盘设备号,得到这个设备号的方法如下: # ll /dev/sdb brw-rw----. 1 root disk 8, 16 Oct 24 15:52 /dev/sdb Major number(12-bit): 8 i.e. 0x8 Minor number(20-bit): 16 i.e. 0x00010 合在一起得到设备号: 0x800010 执行脚本,我们看到: # ./dev_task_io.stp 0x800010 device of interest: 0x800010 [dd](31202) dev:0x800010 rw:0 size:512 [dd](31202) dev:0x800010 rw:0 size:512 [dd](31202) dev:0x800010 rw:0 size:512 [dd](31202) dev:0x800010 rw:0 size:512 结果很令人满意,我们看到是进程号为31202的dd命令在对/dev/sdb进行读操作
进程类的信息查看 【涉及工具】 top 综合,偏CPU和memory dstat 综合, 偏磁盘 pidstat iostat 磁盘io 全局 iotop 磁盘io 精确到进程 iftop 网络,事实刷新 ss 取代netstat 并且速度更快 【查看cpu状态-设计涉及指标】 1 cpu使用率: 用户 系统 2 cpu累计使用时长 3 中断 上下文切换等(使用不是很多) CPU查看工具 top dstat top 选项 -bn1 -c 查看全命令 top -bn1c 一次记录就结束并打印command的全命令 指令 1 完整的列出所有的cpu核心数 P 根据CPU高低排序 M 根据内存高低排序 T 根据运行时间排序 B 行的高亮显示 x 列的高亮显示 shift + <或者 > 改变高亮的排序列 h 帮助信息 dstat(python脚本) dstat -lcm --top-cpu 【查看memory状态-设计涉及指标】 关注点: 是否使用交换内存 每个进程消耗了多少内存空间 top free dstat lcmd --top-mem 【查看磁盘状态-设计涉及指标】 提示: 磁盘的性能瓶颈是比较难以排除出来的,不想cpu和内存那样比较明显的看的出来。 关注指标 1 读写量/s dstat iotop pidstat 精确到进程 2 每次读写的延迟时间 iostat(全局) 看读写量 iostat -x 1 看延迟效果 一般使用dstat(单位比较人性 整理过) 查看那个进程使用io最高 iotop Total DISK READ: 7.02 M/s | Total DISK WRITE: 3.12 M/s iostat中的几个参考值: svctm < await(同样等待的请求时间被重复计算)。如果svctm比较接近awati 说明IO几乎没有等待时间。 如果await远远大于svctm,说明IO队列太长。 await: 平均每次设备IO操作等待的时间(毫秒)。即 delta(ruse+wuse) /delta(rio+wio) svcm:平均每次设备IO操作服务的时间(毫秒) 会将await计算在内 %util 一秒中有百分之多少的时间用于IO操作或者说一秒中有多少时间IO队列是非空的。
新增:
查看全部内存都有谁在占用:
dstat -g -l -m -s --top-mem
显示一些关于CPU资源损耗的数据:
dstat -c -y -l --proc-count --top-cpu
如何输出一个csv文件
想输出一个csv格式的文件用于以后,可以通过下面的命令:
# dstat –output /tmp/sampleoutput.csv -cdn
第一步:
$
top
第二步:
按大写的O
第三步:
输入小写字母p
第四步:
回车
针对特定进程统计(-p)
pidstat -r -p 1 1
pidstat -u 1
pidstat -r 1
pidstat -d 1
iostat
具体某个磁盘的所有分区的IO情况