1.1 性能测试
性能测试是通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。其中包括(压力测试、负载测试、并发测试、疲劳强度测试等)并评估系统的承受能力、稳定性等例如(响应时间、事务处理效率、并发量等)。
1.2 性能测试目标
目的是验证软件系统是否能够达到用户提出的性能指标,同时发现软件系统中存在的性能瓶颈,优化软件,最后起到优化系统的目的。
包括以下方面:
1.检验系统满足性能标准,评估系统的处理能力。
2.查找系统瓶颈。
3.系统调优。
4.验证稳定性。
5.比较多个的系统性能。
性能目标主要包括客户端交易处理性能指标、服务器资源监控指标、数据库资源监控指标、Web服务器监控指标、中间件监控指标。性能目标根据系统的技术和用途不同,一般包含如下部分:
1.并发量和吞吐量。
1)交易处理指标:平均事务响应时间、每秒事务数、每条事务总数、事务摘要、事务性能摘要、事务响应时间(负载下百分比下的事务、分布)。
2)web请求指标:每秒点击次数、吞吐量、吞吐量摘要、HTTP状态代码摘要、每秒HTTP响应数、每秒下载页面数、每秒重试次数,重试次数摘要、连接数、每秒连接数、每秒SSL连接数。
2.服务器响应时间等。
3.数据库指标
1)监测数据读和写的情况。
2)监控数据库资源(cpu、内存、io等)使用的情况。
3)监测大数据读写深度测试。
4)监测数据库连接数。
5)监测数据库锁资源情况。
6)监测数据库业务数据表的空间增长。
7)监测数据库并发情况。
2 工具及使用2.1 Multi-Mechanize 介绍
Multi-Mechanize 是一个开源的性能和负载测试框架,它并发运行多个 Python 脚本对网站或者服务生成负载(组合事务)。测试输出报告保存为HTML或JMeter的兼容的XML。Multi-Mechanize最常用于web性能和可扩展性(scalability)测试,也适用于任何python可以访问的API。尤其适合后台性能测试。懂编程这个工具会远强过商业的性能测试工具。
主要特征包括:
1、支持各种HTTP methods
2、高级超链接和HTML表单支持
3、支持SSL
4、自动处理Cookies
5、可设置HTTP头
6、支持代理
7、支持HTTP认证
2.2 安装
以Centos为例,在Centos中已经默认安装Python环境,此方法使用标准的Python安装方式进行。
1、安装matplotlib插件 (主要是支持作图)命令 yum –y installpython-matplotlib。
2、安装multi-mechanize 命令pip install multi-mechanize 或者使用easy_installmulti-mechanize。
2.3 使用
1、multimech-newproject my_project创建一个新项目,包括有以下文件和目录
2、编写测试代码(存放在test_scripts目录下)
将编写的主要测试代码放入def run(self):函数里
3、配置config.cfg
4、运行multimech-run my_project,待运行结束后会自动生成 results目录,里面存放测试结果数据。
主要看:
results.csv(测试返回结果,如果错误等,这个文件里面可以看出是什么错误),
results.html(统计结果)
2.4 测试过程监测
客户端--网络--服务器
测试过程监测:
1、客户端、服务器的连接数是否正常,命令( netstat -anp | wc –l)数量是否随着压力增大而在适量的增,随着压力减小不断的减少。
2、客户端、服务器网络是否正常,命令(dstat、iptraf)流量是否达到客户端或者服务器的最大网络速率,如果基本已经接近最大速率那里网络可能存在堵塞。
3、客户端、服务器cpu、内存和磁盘是否正常 命令(top、vmstat、dstat、iostat、 free、pidstat)等cpu是否长期处于非常繁忙>80%、wa是否过高、si软中断是否过高、队列(r)是否等待进程数不应该超过3个线程(每处理器),内存是否空闲太少等,I/O是否等待时间过长,磁盘下载速率持续是否占转速的50%。并查看是那些程序占用大量资源。
4、吞吐量:服务器处理的事务数。
5、并发数:系统同时每秒处理的事务数。
6、响应时间:(网络+服务器+数据库)。
7、是否有错误信息。
8、是否符合要求的响应时间内和并发数。
2.5 服务系统配置调优
Contos 7中重要参数:
/proc/sys/kernel/shmmax: | 单个共享内存段的最大值。linux的32位系统一般为33554432 / 1024 / 1024 M,这对oracle等相当不够用;在64位为 68719476736 / 1024 /1024 = 65536 M。 |
/proc/sys/net/core/netdev_max_backlog | 在每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目。默认是32768。 |
/proc/sys/net/core/optmem_max | 表示每个套接字所允许的最大缓冲区的大小,默认20480. |
/proc/sys/net/core/rmem_default | 默认的TCP数据接收窗口大小,默认8388608 |
/proc/sys/net/core/rmem_max: | 最大socket读buffer,默认16777216 |
/proc/sys/net/core/somaxconn | 定义了系统中每一个端口最大的监听队列的长度,这是个全局的参数。默认是32768。 |
/proc/sys/net/core/wmem_default | 默认的TCP数据发送窗口大小(字节),默认8388608 |
/proc/sys/net/core/wmem_max | 最大的TCP数据发送窗口(字节)。,默认16777216 |
/proc/sys/net/ipv4/ip_local_port_range | 表示TCP/UDP协议允许使用的本地端口号,默认1024 65535,性能测试客户端通常需要增大此值 |
/proc/sys/net/ipv4/tcp_fack | 启用转发应答,可以进行有选择应答(SACK)从而减少拥塞情况的发生,这个选项也应该启用。默认开启 |
/proc/sys/net/ipv4/tcp_fin_timeout | 对于本端断开的socket连接,TCP保持在FIN-WAIT-2状态的时间(秒)。对方可能会断开连接或一直不结束连接或不可预料的进程死亡。修改系統默认的 TIMEOUT 时间,默认值是 60。建议为30。 |
/proc/sys/net/ipv4/tcp_keepalive_intvl | 探测消息未获得响应时,重发该消息的间隔时间(秒)。默认75,建议30 |
/proc/sys/net/ipv4/tcp_keepalive_probes | 在认定TCP连接失效之前,最多发送多少个keepalive探测消息。默认9,建议3 |
/proc/sys/net/ipv4/tcp_keepalive_time | TCP发送keepalive探测消息的间隔时间(秒),用于确认TCP连接是否有效。默认7200 seconds (2 hours) 建议 1800。 |
/proc/sys/net/ipv4/tcp_low_latency | 允许TCP/IP栈适应在高吞吐量情况下低延时的情况,这个选项应该禁用,默认也是禁用。 |
/proc/sys/net/ipv4/tcp_max_syn_backlog | 对于还未获得对方确认的连接请求,可保存在队列中的最大数目。如果服务器经常出现过载,可以尝试增加这个数字。默认65536 |
/proc/sys/net/ipv4/tcp_mem | 确定TCP栈应该如何反映内存使用,每个值的单位都是内存页(通常是4KB)。第一个值是内存使用的下限;第二个值是内存压力模式开始对缓冲区使用应用压力的上限;第三个值是内存使用的上限。在这个层次上可以将报文丢弃,从而减少对内存的使用。对于较大的BDP可以增大这些值(注意,其单位是内存页而不是字节)。默认94500000 915000000 927000000。 |
/proc/sys/net/ipv4/tcp_retries2 | TCP失败重传次数,默认值15,意味着重传15次才彻底放弃.可减少到5,以尽早释放内核资源. |
/proc/sys/net/ipv4/tcp_rmem: | 为自动调优定义socket使用的内存。第一个值是为socket接收缓冲区分配的最少字节数;第二个值是默认值(该值会被rmem_default覆盖),缓冲区在系统负载不重的情况下可以增长到这个值;第三个值是接收缓冲区空间的最大字节数(该值会被rmem_max覆盖)。默认:4096 87380 6291456 |
/proc/sys/net/ipv4/tcp_sack | 启用有选择的应答(1表示启用),通过有选择地应答乱序接收到的报文来提高性能,让发送者只发送丢失的报文段,(对于广域网通信来说)这个选项应该启用,但是会增加对CPU的占用。默认开启 |
/proc/sys/net/ipv4/tcp_syncookies | 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为1,表示开启; |
/proc/sys/net/ipv4/tcp_timestamps | TCP时间戳(会在TCP包头增加12个字节),以一种比重发超时更精确的方法(参考RFC 1323)来启用对RTT 的计算,为实现更好的性能应该启用这个选项。默认关闭。 |
/proc/sys/net/ipv4/tcp_tw_reuse | 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为开启; |
/proc/sys/net/ipv4/tcp_tw_recycle = 1 | 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认开启。 |
/proc/sys/net/ipv4/tcp_window_scaling | 启用RFC 1323定义的window scaling,要支持超过64KB的TCP窗口,必须启用该值(1表示启用),TCP窗口最大至1GB,TCP连接双方都启用时才生效。默认开启。 |
/proc/sys/net/ipv4/tcp_wmem | 为自动调优定义socket使用的内存。第一个值是为socket发送缓冲区分配的最少字节数;第二个值是默认值(该值会被wmem_default覆盖),缓冲区在系统负载不重的情况下可以增长到这个值;第三个值是发送缓冲区空间的最大字节数(该值会被wmem_max覆盖)。默认4096 16384 4194304 |
1、优化网络设备接收队列
(该文件表示在每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目。)
使用命令查看cat /etc/sysctl.conf ,net.core.netdev_max_backlog=3000(确保网络可以流畅通顺) Centos 7 建议使用32768
2、net.ipv4.conf.lo.accept_redirects
参数值为布尔值,1表示接收这类重定向 icmp 信息,0表示忽略。在充当路由器的linux主机上缺省值为0,在一般的linux主机上缺省值为1。建议将其改为0,或者使用“安全重定向”(见下文)以消除安全性隐患(禁止接收路由重定向报文,防止路由表被恶意更改。)
查看命令 /proc/sys/net/ipv4/conf/eth0/accept_redirects其中eth0是网络接口
net.ipv4.conf.lo.accept_redirects=0
net.ipv4.conf.all.accept_redirects=0
net.ipv4.conf.eth0.accept_redirects=0
net.ipv4.conf.default.accept_redirects=0 建议加上以上4句
3、打开TIME-WAIT套接字重用功能,对于存在大量连接的Web服务器非常有效。
查看命令cat /etc/sysctl.conf
net.ipv4.tcp_tw_recyle=1
net.ipv4.tcp_tw_reuse=1 建议修改以上两句
/proc/sys/net/ipv4/tcp_tw_recyle
打开快速 TIME-WAIT sockets 回收。除非得到技术专家的建议或要求,请不要随意修改这个值。 缺省设置:0
/proc/sys/net/ipv4/tcp_tw_reuse
该文件表示是否允许重新应用处于TIME-WAIT状态的socket用于新的TCP连接。
缺省设置:0
4、减少处于FIN-WAIT-2连接状态的时间,使系统可以处理更多的连接。
net.ipv4.tcp_fin_timeout=30 调整这个时间或者注释
查看命令 cat /etc/sysctl.conf
5、减少TCP KeepAlive连接侦测的时间,使系统可以处理更多的连接。
net.ipv4.tcp_keepalive_time=1800 (默认是7200)
6、增加TCP SYN队列长度,使系统可以处理更多的并发连接。
net.ipv4.tcp_max_syn_backlog=65536 (建议这个数)
7、(1)优化系统套接字缓冲区(最大socket读buffer 单位字节)
net.core.rmem_max=16777216(该文件指定了接收套接字缓冲区大小的最大值)
net.core.wmem_max=16777216(该文件指定了发送套接字缓冲区大小的最大值)
(2)该文件指定了接收套接字缓冲区大小的缺省值
net.core.rmem_default = 8388608
(3)该文件指定了发送套接字缓冲区大小的缺省值
net.core.wmem_ default=8388608
8、打开TCP SYN cookie选项,有助于保护服务器免受SyncFlood攻击。
net.ipv4.tcp_syncookies=1
9、优化TCP接收/发送缓冲区
net.ipv4.tcp_rmem=409687380 16777216
net.ipv4.tcp_wmem=4096 65536 16777216
===========================================================================
方法:统计输出各个函数执行时间、主流程优化以及执行时间较长函数优化。
-----------
系统调优最好
vi /etc/sysctl.conf
#net.ipv4.conf.default.send_redirects = 0
#net.ipv4.conf.default.accept_redirects = 0
net.ipv4.tcp_max_syn_backlog = 262144
net.core.netdev_max_backlog = 32768
# net.core.somaxconn = 32768
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syn_retries = 2
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
#net.ipv4.tcp_tw_len = 1
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_max_orphans = 3276800
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 75
net.ipv4.tcp_keepalive_intvl=60
net.ipv4.tcp_keepalive_probes=2
net.ipv4.ip_local_port_range = 1024 65000
fs.file-max=6553500
#net.nf_conntrack_max = 655360
#net.core.optmem_max=20480
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_abort_on_overflow = 1
net.ipv4.tcp_sack = 1
net.ipv4.tcp_fack = 1
net.ipv4.tcp_orphan_retries = 1
保存后执行sysctl -p生效
/etc/security/limits.conf
* soft nofile 655350
* hard nofile 655350
==================================================================
iostat -d -x -k
rrqm/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 平均请求扇区的大小
==============================
vmstat
r 表示运行队列(就是说多少个进程真的分配到CPU),我测试的服务器目前CPU比较空闲,没什么程序在跑,当这个值超过了CPU数目,就会出现CPU瓶颈了。这个也和top的负载有关系,一般负载超过了3就比较高,超过了5就高,超过了10就不正常了,服务器的状态很危险。top的负载类似每秒的运行队列。如果运行队列过大,表示你的CPU很繁忙,一般会造成CPU使用率很高。
b 表示阻塞的进程,这个不多说,进程阻塞,大家懂的。
swpd 虚拟内存已使用的大小,如果大于0,表示你的机器物理内存不足了,如果不是程序内存泄露的原因,那么你该升级内存了或者把耗内存的任务迁移到其他机器。
free 空闲的物理内存的大小,我的机器内存总共8G,剩余3415M。
buff Linux/Unix系统是用来存储,目录里面有什么内容,权限等的缓存,我本机大概占用300多M
cache cache直接用来记忆我们打开的文件,给文件做缓冲,我本机大概占用300多M(这里是Linux/Unix的聪明之处,把空闲的物理内存的一部分拿来做文件和目录的缓存,是为了提高 程序执行的性能,当程序使用内存时,buffer/cached会很快地被使用。)
si 每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露了,要查找耗内存进程解决掉。我的机器内存充裕,一切正常。
so 每秒虚拟内存写入磁盘的大小,如果这个值大于0,同上。
bi 块设备每秒接收的块数量,这里的块设备是指系统上所有的磁盘和其他块设备,默认块大小是1024byte,我本机上没什么IO操作,所以一直是0,但是我曾在处理拷贝大量数据(2-3T)的机器上看过可以达到140000/s,磁盘写入速度差不多140M每秒
bo 块设备每秒发送的块数量,例如我们读取文件,bo就要大于0。bi和bo一般都要接近0,不然就是IO过于频繁,需要调整。
in 每秒CPU的中断次数,包括时间中断
cs 每秒上下文切换次数,例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的数目,例如在apache和nginx这种web服务器中,我们一般做性能测试时会进行几千并发甚至几万并发的测试,选择web服务器的进程可以由进程或者线程的峰值一直下调,压测,直到cs到一个比较小的值,这个进程和线程数就是比较合适的值了。系统调用也是,每次调用系统函数,我们的代码就会进入内核空间,导致上下文切换,这个是很耗资源,也要尽量避免频繁调用系统函数。上下文切换次数过多表示你的CPU大部分浪费在上下文切换,导致CPU干正经事的时间少了,CPU没有充分利用,是不可取的。
us 用户CPU时间,我曾经在一个做加密解密很频繁的服务器上,可以看到us接近100,r运行队列达到80(机器在做压力测试,性能表现不佳)。
sy 系统CPU时间,如果太高,表示系统调用时间长,例如是IO操作频繁。
id 空闲 CPU时间,一般来说,id + us + sy = 100,一般我认为id是空闲CPU使用率,us是用户CPU使用率,sy是系统CPU使用率。
wt 等待IO CPU时间。
---------------------------------
----------------------------------------------
(1). swpd,已使用的 SWAP 空间大小,KB 为单位;
(2). free,可用的物理内存大小,KB 为单位;
(3). buff,物理内存用来缓存读写操作的 buffer 大小,KB 为单位;
(4). cache,物理内存用来缓存进程地址空间的 cache 大小,KB 为单位;
(5). si,数据从 SWAP 读取到 RAM(swap in)的大小,KB 为单位;
(6). so,数据从 RAM 写到 SWAP(swap out)的大小,KB 为单位;
(7). bi,磁盘块从文件系统或 SWAP 读取到 RAM(blocks in)的大小,block 为单位;
(8). bo,磁盘块从 RAM 写到文件系统或 SWAP(blocks out)的大小,block 为单位;
-----------------------------------------------------------------
上面是一个频繁读写交换区的例子,可以观察到以下几点:
(1). 物理可用内存 free 基本没什么显著变化,swapd 逐步增加,说明最小可用的内存始终保持在 256MB(物理内存大小) * 10% = 2.56MB 左右,当脏页达到10%的时候(vm.dirty_background_ratio = 10)就开始大量使用 swap;
(2). buff 稳步减少说明系统知道内存不够了,kwapd 正在从 buff 那里借用部分内存;
(3). kswapd 持续把脏页面写到 swap 交换区(so),并且从 swapd 逐渐增加看出确实如此。根据上面讲的 kswapd 扫描时检查的三件事,如果页面被修改了,但不是被文件系统修改的,把页面写到 swap,所以这里 swapd 持续增加。
--------------------------------------
dstat
CPU状态:CPU的使用率。这项报告更有趣的部分是显示了用户,系统和空闲部分,这更好地分析了CPU当前的使用状况。如果你看到"wait"一栏中,CPU的状态是一个高使用率值,那说明系统存在一些其它问题。当CPU的状态处在"waits"时,那是因为它正在等待I/O设备(例如内存,磁盘或者网络)的响应而且还没有收到。
磁盘统计:磁盘的读写操作,这一栏显示磁盘的读、写总数。
网络统计:网络设备发送和接受的数据,这一栏显示的网络收、发数据总数。
分页统计:系统的分页活动。分页指的是一种内存管理技术用于查找系统场景,一个较大的分页表明系统正在使用大量的交换空间,或者说内存非常分散,大多数情况下你都希望看到page in(换入)和page out(换出)的值是0 0。
系统统计:这一项显示的是中断(int)和上下文切换(csw)。这项统计仅在有比较基线时才有意义。这一栏中较高的统计值通常表示大量的进程造成拥塞,需要对CPU进行关注。你的服务器一般情况下都会运行运行一些程序,所以这项总是显示一些数值。
---------------
查看全部内存都有谁在占用 dstat -g -l -m -s --top-mem
显示一些关于CPU资源损耗的数据 dstat -c -y -l --proc-count --top-cpu
----------------------------------
3.1 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 st
0 3 252696 2432 268 7148 3604 2368 3608 2372 288 288 0 0 21 78 1
0 2 253484 2216 228 7104 5368 2976 5372 3036 930 519 0 0 0 100 0
0 1 259252 2616 128 6148 19784 18712 19784 18712 3821 1853 0 1 3 95 1
1 2 260008 2188 144 6824 11824 2584 12664 2584 1347 1174 14 0 0 86 0
2 1 262140 2964 128 5852 24912 17304 24952 17304 4737 2341 86 10 0 0 4
部分参数说明:
(1). swpd,已使用的 SWAP 空间大小,KB 为单位;
(2). free,可用的物理内存大小,KB 为单位;
(3). buff,物理内存用来缓存读写操作的 buffer 大小,KB 为单位;
(4). cache,物理内存用来缓存进程地址空间的 cache 大小,KB 为单位;
(5). si,数据从 SWAP 读取到 RAM(swap in)的大小,KB 为单位;
(6). so,数据从 RAM 写到 SWAP(swap out)的大小,KB 为单位;
(7). bi,磁盘块从文件系统或 SWAP 读取到 RAM(blocks in)的大小,block 为单位;
(8). bo,磁盘块从 RAM 写到文件系统或 SWAP(blocks out)的大小,block 为单位;
上面是一个频繁读写交换区的例子,可以观察到以下几点:
(1). 物理可用内存 free 基本没什么显著变化,swapd 逐步增加,说明最小可用的内存始终保持在 256MB(物理内存大小) * 10% = 2.56MB 左右,当脏页达到10%的时候(vm.dirty_background_ratio = 10)就开始大量使用 swap;
(2). buff 稳步减少说明系统知道内存不够了,kwapd 正在从 buff 那里借用部分内存;
(3). kswapd 持续把脏页面写到 swap 交换区(so),并且从 swapd 逐渐增加看出确实如此。根据上面讲的 kswapd 扫描时检查的三件事,如果页面被修改了,但不是被文件系统修改的,把页面写到 swap,所以这里 swapd 持续增加
-----------------------------------
$ vmstat 1
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 1 140 2787980 336304 3531996 0 0 0 128 1166 5033 3 3 70 25 0
0 1 140 2788296 336304 3531996 0 0 0 0 1194 5605 3 3 69 25 0
0 1 140 2788436 336304 3531996 0 0 0 0 1249 8036 5 4 67 25 0
0 1 140 2782688 336304 3531996 0 0 0 0 1333 7792 6 6 64 25 0
3 1 140 2779292 336304 3531992 0 0 0 28 1323 7087 4 5 67 25 0
参数介绍:
(1). r,可运行队列的线程数,这些线程都是可运行状态,只不过 CPU 暂时不可用;
(2). b,被 blocked 的进程数,正在等待 IO 请求;
(3). in,被处理过的中断数
(4). cs,系统上正在做上下文切换的数目
(5). us,用户占用 CPU 的百分比
(6). sys,内核和中断占用 CPU 的百分比
(7). wa,所有可运行的线程被 blocked 以后都在等待 IO,这时候 CPU 空闲的百分比
(8). id,CPU 完全空闲的百分比
举两个现实中的例子来实际分析一下:
$ vmstat 1
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
r b swpd free buff cache si so bi bo in cs us sy id wa st
4 0 140 2915476 341288 3951700 0 0 0 0 1057 523 19 81 0 0 0
4 0 140 2915724 341296 3951700 0 0 0 0 1048 546 19 81 0 0 0
4 0 140 2915848 341296 3951700 0 0 0 0 1044 514 18 82 0 0 0
4 0 140 2915848 341296 3951700 0 0 0 24 1044 564 20 80 0 0 0
4 0 140 2915848 341296 3951700 0 0 0 0 1060 546 18 82 0 0 0
从上面的数据可以看出几点:
(1). interrupts(in)非常高,context switch(cs)比较低,说明这个 CPU 一直在不停的请求资源;
(2). user time(us)一直保持在 80% 以上,而且上下文切换较低(cs),说明某个进程可能一直霸占着 CPU;
(3). run queue(r)刚好在4个。
$ vmstat 1
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
r b swpd free buff cache si so bi bo in cs us sy id wa st
14 0 140 2904316 341912 3952308 0 0 0 460 1106 9593 36 64 1 0 0
17 0 140 2903492 341912 3951780 0 0 0 0 1037 9614 35 65 1 0 0
20 0 140 2902016 341912 3952000 0 0 0 0 1046 9739 35 64 1 0 0
17 0 140 2903904 341912 3951888 0 0 0 76 1044 9879 37 63 0 0 0
16 0 140 2904580 341912 3952108 0 0 0 0 1055 9808 34 65 1 0 0
从上面的数据可以看出几点:
(1). context switch(cs)比 interrupts(in)要高得多,说明内核不得不来回切换进程;
(2). 进一步观察发现 system time(sy)很高而 user time(us)很低,而且加上高频度的上下文切换(cs),说明正在运行的应用程序调用了大量的系统调用(system call);
(3). run queue(r)在14个线程以上,按照这个测试机器的硬件配置(四核),应该保持在12个以内。
----------------------
iostat -d -x -k
rrqm/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%,因为磁盘的并发能力,所以磁盘使用未必就到了瓶颈)。
当系统没有足够物理内存来应付所有请求的时候就会用到 swap 设备,swap 设备可以是一个文件,也可以是一个磁盘分区。不过要小心的是,使用 swap 的代价非常大。如果系统没有物理内存可用,就会频繁 swapping,如果 swap 设备和程序正要访问的数据在同一个文件系统上,那会碰到严重的 IO 问题,最终导致整个系统迟缓,甚至崩溃。swap 设备和内存之间的 swapping 状况是判断 Linux 系统性能的重要参考,我们已经有很多工具可以用来监测 swap 和 swapping 情况,
-------------
./mongostat -h xxip --port 27017
./mongotop -h xxip --port 27017
Mongodb
Mongodb监控指标解释如下
· inserts/s每秒插入次数
· query/s每秒查询次数
· update/s每秒更新次数
· delete/s每秒删除次数
· getmore/s每秒执行getmore次数
· command/s每秒的命令数,比以上插入、查找、更新、删除的综合还多,还统计了别的命令
· flushs/s每秒执行fsync将数据写入硬盘的次数。
· mapped/s所有的被mmap的数据量,单位是MB,
· vsize虚拟内存使用量,单位MB
· res物理内存使用量,单位MB
· faults/s每秒访问失败数(只有Linux有),数据被交换出物理内存,放到swap。不要超过100,否则就是机器内存太小,造成频繁swap写入。此时要升级内存或者扩展
· locked% 被锁的时间百分比,尽量控制在50%以下吧
· idxmiss % 索引不命中所占百分比。如果太高的话就要考虑索引是不是少了
· qt|r|w当Mongodb接收到太多的命令而数据库被锁住无法执行完成,它会将命令加入队列。这一栏显示了总共、读、写3个队列的长度,都为0的话表示mongo毫无压力。高并发时,一般队列值会升高。 (
qr|qw: queue lengths for clients waiting (read|write)
ar|aw: active clients (read|write)
如果这两个数值很大,那么就是DB被堵住了,DB的处理速度不及请求速度。
看看是否有开销很大的慢查询。如果查询一切正常,确实是负载很大,就需要加机器了
)
用户:在用户空间的时间百分比 系统:在内核空间的时间百分比 空闲状态:任何程序使用的CPU百分比 好:百分比的时间被用户级流程积极价值不菲 硬中断请求优先级别:时间百分比维修/处理硬件/软件中断 iowait:等待时间百分比(在磁盘上) 偷:自愿等虚拟cpu时间百分比在hypervisor服务另一个处理器/虚拟机 ctx_sw:数量的上下文切换(自愿+非自愿)每秒 国际米兰:每秒的中断的次数 每秒sw_inter:数量的软件中断。总是在Windows和SunOS设置为0。 syscal:每秒的系统调用的数量。不显示在Linux(总是0)。 CPU (user/system)Status <50%OK >50%CAREFUL >70%WARNING >90%CRITICAL Load avgStatus <0.7*coreOK >0.7*coreCAREFUL >1*coreWARNING >5*coreCRITICAL Note MEN/SwapStatus <50%OK >50%CAREFUL >70%WARNING >90%CRITICAL FILE SYS Disk usageStatus <50%OK >50%CAREFUL >70%WARNING >90%CRITICAL
yum -y install sg3_utils sg_vpd /dev/sda --page=0xb1 hdparm -I /dev/sda 测试io dd if=/dev/sda of=test bs=64k count=4k oflag=dsync 4K = 4000 64KB * 4K(个数) =250M数据 用iotop看 清理内存 echo 1 > /proc/sys/vm/drop_caches 清理swap swapoff -a && swapon -a 清理cache echo 3 > /proc/sys/vm/drop_caches watch ipvsadm -Ln 作用 查看请求数流动方向 在服务器上执行 ss -ant|awk '{print $1}'|sort|uniq -c ESTAB (建立连接) FIN-WAIT-1 (服务器主动关闭连接,等待客户端确认) TIME-WAIT(建立了三次握手后服务器主动关闭连接) SYN-RECV(服务端被动打开后,接收到了客户端的SYN并且发送了ACK时的状态。再进一步接收到客户端的ACK就进入ESTABLISHED状态。)