指标
工具
cpu
usr<=70%, sys<=35%, usr+sys<=70%
top
memory
si == so == 0 可用空间>=30%
vmstat 1;free; /proc/meminfo
io
iowait% < 20%
iostat -x;
network
udp:缓冲区不挤压, 无丢包 tcp:重传率
netstat -lunp; netstat -su; /proc/net/snmp
1.良好状态指标
CPU利用率:User Time <= 70%,System Time <= 35%,User Time + System Time <= 70%
上下文切换:与CPU利用率相关联,如果CPU利用率状态良好,大量的上下文切换也是可以接受的
可运行队列:每个处理器的可运行队列<=3个线程
2.监控工具
top 最常用 略
vmstat
重要参数:
r,run queue,可运行队列的线程数,这些线程都是可运行状态,只不过CPU暂时不可用; b,被blocked的进程数,正在等待IO请求; in,interrupts,被处理过的中断数 cs,context switch,系统上正在做上下文切换的数目 us,用户占用CPU的百分比 sys,内核和中断占用CPU的百分比 id,CPU完全空闲的百分比
上例可得:
sy高us低,以及高频度的上下文切换(cs),说明应用程序进行了大量的系统调用;
这台4核机器的r应该在12个以内,现在r在14个线程以上,此时CPU负荷很重。
查看某个进程占用的CPU资源<code>$ while :; do ps -eo pid,ni,pri,pcpu,psr,comm | grep</code> <code>'db_server_login'; sleep</code> <code>1; done PID NI PRI %CPU PSR COMMAND 28577</code> <code>0</code> <code>23</code> <code>0.0</code> <code>0 db_server_login 28578</code> <code>0</code> <code>23</code> <code>0.0</code> <code>3 db_server_login 28579</code> <code>0</code> <code>23</code> <code>0.0</code> <code>2 db_server_login 28581</code> <code>0</code> <code>23</code> <code>0.0</code> <code>2 db_server_login 28582</code> <code>0</code> <code>23</code> <code>0.0</code> <code>3 db_server_login 28659</code> <code>0</code> <code>23</code> <code>0.0</code> <code>0 db_server_login ……</code>
swap in (si) == 0,swap out (so) == 0
应用程序可用内存/系统物理内存 <= 70%
swpd,已使用的 SWAP 空间大小,KB 为单位 free,可用的物理内存大小,KB 为单位 buff,物理内存用来缓存读写操作的buffer大小,KB 为单位 cache,物理内存用来缓存进程地址空间的 cache 大小,KB 为单位 si,数据从 SWAP 读取到 RAM(swap in)的大小,KB 为单位 so,数据从 RAM 写到 SWAP(swap out)的大小,KB 为单位
物理可用内存 free 基本没什么显著变化,swapd逐步增加,说明最小可用的内存始终保持在 256MB(物理内存大小) * 10% = 2.56MB 左右,当脏页达到10%的时候就开始大量使用swap。
free
单位KB。可以用 -m 选项要求输出单位为MB。
我们使用total1、used1、free1、used2、free2 等名称来代表上面统计数据的各值,1、2 分别代表第一行和第二行的数据。
total1:表示物理内存总量。 used1:表示总计分配给缓存(包含buffers 与cache )使用的数量,但其中可能部分缓存并未实际使用。 free1:未被分配的内存。 shared1:共享内存,一般系统不会用到,这里也不讨论。 buffers1:系统分配但未被使用的buffers 数量。 cached1:系统分配但未被使用的cache 数量。buffer 与cache 的区别见后面。 used2:实际使用的buffers 与cache 总量,也是实际使用的内存总量。 free2:未被使用的buffers 与cache 和未被分配的内存之和,这就是系统当前实际可用内存。
cache 和 buffer的区别:
Cache:高速缓存,是位于CPU与主内存间的一种容量较小但速度很高的存储器。
由于CPU的速度远高于主内存,CPU直接从内存中存取数据要等待一定时间周期,Cache中保存着CPU刚用过或循环使用的一部分数据,当CPU再次使用该部分数据时可从Cache中直接调用,这样就减少了CPU的等待时间,提高了系统的效率。
Cache又分为一级Cache(L1 Cache)和二级Cache(L2 Cache),L1 Cache集成在CPU内部,L2 Cache早期一般是焊在主板上,现在也都集成在CPU内部,常见的容量有256KB或512KB L2 Cache。
Buffer:缓冲区,一个用于存储速度不同步的设备或优先级不同的设备之间传输数据的区域。
通过缓冲区,可以使进程之间的相互等待变少,从而使从速度慢的设备读入数据时,速度快的设备的操作进程不发生间断。
Free中的buffer和cache:(它们都是占用内存)
buffer : 作为buffer cache的内存,是块设备的读写缓冲区
cache: 作为page cache的内存,文件系统的cache
如果 cache 的值很大,说明cache住的文件数很多。如果频繁访问到的文件都能被cache住,那么磁盘的读IO 必会非常小。
$ cat /proc/meminfo<code>MemTotal: 15728640 kB MemFree: 116196 kB Buffers: 0 kB Cached: 13448268 kB ……</code>
这台服务器总共有 8GB 物理内存(MemTotal),3GB 左右可用内存(MemFree),343MB左右用来做磁盘缓存(Buffers),4GB左右用来做文件缓存区(Cached)。
用free命令也可以查到这几个值,注意单位是kB。
iowait % < 20%
提高命中率的一个简单方式就是增大文件缓存区面积,缓存区越大预存的页面就越多,命中率也越高。
Linux 内核希望能尽可能产生次缺页中断(从文件缓存区读),并且能尽可能避免主缺页中断(从硬盘读),这样随着次缺页中断的增多,文件缓存区也逐步增大,直到系统只有少量可用物理内存的时候 Linux 才开始释放一些不用的页。
sar
await表示平均每次设备I/O操作的等待时间(以毫秒为单位)。 svctm表示平均每次设备I/O操作的服务时间(以毫秒为单位)。 %util表示一秒中有百分之几的时间用于I/O操作。
如果svctm的值与await很接近,表示几乎没有I/O等待,磁盘性能很好,如果await的值远高于svctm的值,则表示I/O队列等待太长,系统上运行的应用程序将变慢。
如果%util接近100%,表示磁盘产生的I/O请求太多,I/O系统已经满负荷的在工作,该磁盘可能存在瓶颈。
$ iostat -x(选项 -x 用于显示和io相关的扩展数据)
查看哪个进程占IO:iotop,效果和top看cpu一样。
查看某个进程打开的文件:/proc/${pid}/fd
对于UDP
接收、发送缓冲区不长时间有等待处理的网络包
netstat
对于UDP服务,查看所有监听的UDP端口的网络情况
RecvQ、SendQ为0,或者不长时间有数值是比较正常的。
对于UDP服务,查看丢包情况(网卡收到了,但是应用层没有处理过来造成的丢包)
packet receive errors 这一项数值增长了,则表明在丢包。
对于TCP(来自davidshan单卫的经验,thx~)
对于TCP而言,不会出现因为缓存不足而存在丢包的事,因为网络等其他原因,导致丢了包,协议层也会通过重传机制来保证丢的包到达对方。
所以,tcp而言更多的专注重传率。
2、监控工具
通过snmp可以查看各层网络协议的收发包的情况
重传率 = RetransSegs / OutSegs
至于这个值在多少范围内,算ok的,得看具体的业务了。
业务侧更关注的是响应时间。