python查看物理内存和交换区的统计信息_[转载]sar命令使用详解(cpu 内存 磁盘I/O 网卡流量)...

一)关于CPU资源的监控

sar 1(将所有CPU合并到一起进行监控)

sar -P ALL 1 100(可以显示每个CPU现在的负载)

如下:

sar -p 1

Linux 2.6.32-16-generic (ubuntu) 03/23/2011 _x86_64_ (1

CPU)

10:34:49 AM CPU %user %nice %system %iowait %steal %idle

10:34:50 AM all 0.00 0.00 0.00 0.00 0.00 100.00

10:34:51 AM all 0.67 0.00 1.33 0.00 0.33 97.67

10:34:52 AM all 0.00 0.00 0.66 5.96 0.00 93.38

10:34:53 AM all 2.00 0.00 1.33 0.00 0.33 96.33

10:34:54 AM all 0.00 0.00 0.00 0.00 0.00 100.00

10:34:55 AM all 0.67 0.00 0.67 0.00 0.00 98.67

10:34:56 AM all 0.33 0.00 0.00 0.00 0.00 99.67

10:34:57 AM all 0.00 0.00 0.00 0.00 0.00 100.00

10:34:58 AM all 0.00 0.00 0.33 0.00 0.33 99.34

10:34:59 AM all 0.00 0.00 0.00 0.00 0.00 100.00

10:35:00 AM all 3.67 0.00 9.67 0.00 0.00 86.67

10:35:01 AM all 11.67 0.00 28.67 0.00 0.33 59.33

10:35:02 AM all 11.96 0.00 28.24 0.00 0.66 59.14

10:35:03 AM all 16.67 0.00 30.00 0.00 4.67 48.67

10:35:04 AM all 23.84 0.00 34.44 11.26 11.92 18.54

10:35:05 AM all 16.56 0.00 34.11 1.99 2.98 44.37

10:35:06 AM all 8.33 0.00 18.67 0.67 0.67 71.67

10:35:07 AM all 0.00 0.00 0.33 0.00 0.00 99.67

sar -P ALL 1 100

Linux 2.6.18-6-amd64 (192.168.6.184) 03/23/2011 _x86_64_

12:52:20 PM CPU %user %nice %system %iowait %steal %idle

12:52:21 PM all 0.00 0.00 0.25 0.00 0.00 99.75

12:52:21 PM 0 0.00 0.00 0.99 0.00 0.00 99.01

12:52:21 PM 1 0.00 0.00 0.00 0.00 0.00 100.00

12:52:21 PM 2 0.00 0.00 0.00 0.00 0.00 100.00

12:52:21 PM 3 0.00 0.00 0.00 0.00 0.00 100.00

12:52:21 PM CPU %user %nice %system %iowait %steal %idle

12:52:22 PM all 0.00 0.00 0.00 0.00 0.00 100.00

12:52:22 PM 0 0.00 0.00 0.00 0.00 0.00 100.00

12:52:22 PM 1 0.00 0.00 0.00 0.00 0.00 100.00

12:52:22 PM 2 0.00 0.00 0.00 0.00 0.00 100.00

12:52:22 PM 3 0.00 0.00 0.00 0.00 0.00 100.00

注:

%user,%system,%iowait,%idle分别表示用户态进程占用CPU百分比,系统态进程占用CPU百分比,CPU等待IO百分比,CPU空闲百分比

重点说%nice和%steal,这是vmstat所没有了.

%nice:如果一个程序在运行时用nice调整它的优先级,且优先级在1-19之间,并且是用户态的进程,这时%nice才会体现出来,如下:

例如用下面的程序:

# include

# include

int main (void)

{

double pi=M_PI;

double pisqrt;

long i;

for (i=0;i<10000000000;++i){

pisqrt=sqrt(pi);

}

return 0;

}

gcc sqrt.c -o sqrt -lm

nice 10 ./sqrt

在另一个终端观察,此时我们看到%user没有变化,而%nice的CPU利用率达到了100%左右,如下:

12:52:20 PM CPU %user %nice %system %iowait %steal %idle

01:14:54 PM all 1.00 4.00 0.00 0.00 0.00 95.00

01:14:55 PM all 0.00 100.00 0.00 0.00 0.00 0.00

01:14:56 PM all 0.00 99.00 1.00 0.00 0.00 0.00

01:14:57 PM all 0.00 97.03 2.97 0.00 0.00 0.00

01:14:58 PM all 0.00 100.00 0.00 0.00 0.00 0.00

01:14:59 PM all 0.00 100.00 0.00 0.00 0.00 0.00

01:15:00 PM all 0.00 98.99 1.01 0.00 0.00 0.00

01:15:01 PM all 1.96 93.14 4.90 0.00 0.00 0.00

01:15:02 PM all 0.00 82.00 0.00 0.00 0.00 18.00

01:15:03 PM all 0.00 0.00 0.99 0.00 0.00 99.01

01:15:04 PM all 0.00 0.00 1.00 0.00 0.00 99.00

%steal:一般在运行虚拟机的宿主机还用到,比如xen,QEMU,Bochs等等.

如下:

12:52:20 PM CPU %user %nice %system %iowait %steal %idle

01:42:03 PM all 4.67 0.00 10.00 0.00 0.67 84.67

01:42:04 PM all 5.32 0.00 14.95 0.00 6.64 73.09

01:42:05 PM all 9.93 0.00 25.17 0.66 11.26 52.98

01:42:06 PM all 1.00 0.00 2.34 0.00 0.33 96.32

01:42:07 PM all 0.66 0.00 1.32 0.00 0.33 97.68

01:42:08 PM all 0.00 0.00 0.67 0.00 0.00 99.33

01:42:09 PM all 0.33 0.00 0.00 1.33 0.00 98.34

二)关于内存资源的监控

sar -r 1

Linux 2.6.32-16-generic (ubuntu) 03/23/2011 _x86_64_ (1

CPU)

01:46:21 PM kbmemfree kbmemused %memused kbbuffers kbcached

kbcommit %commit

01:46:22 PM 76084 429612 84.95 7160 32024 554500 38.96

01:46:23 PM 76068 429628 84.96 7160 32024 554500 38.96

01:46:24 PM 76068 429628 84.96 7160 32024 554500 38.96

01:46:25 PM 76068 429628 84.96 7160 32024 554500 38.96

01:46:26 PM 76068 429628 84.96 7160 32024 554500 38.96

01:46:27 PM 76068 429628 84.96 7160 32024 554500 38.96

01:46:28 PM 76068 429628 84.96 7160 32024 554500 38.96

注:

kbmemfree:这个值和free命令中的free值基本一致,所以它不包括buffer和cache的空间.

kbmemused:这个值和free命令中的used值基本一致,所以它包括buffer和cache的空间.

%memused:这个值是kbmemused和内存总量(不包括swap)的一个百分比.

kbbuffers和kbcached:这两个值就是free命令中的buffer和cache.

kbcommit:保证当前系统所需要的内存,即为了确保不溢出而需要的内存(RAM+swap).

%commit:这个值是kbcommit与内存总量(包括swap)的一个百分比.

下面我们重点来研究一下kbcommit.

首先编译运行下面的程序:

#include

#include

#include

#include

int

main (int argc, char *argv[])

{

if (argc != 2)

exit (0);

size_t mb = strtoul(argv[1],NULL,0);

size_t nbytes = mb * 0x100000;

char *ptr = (char *) malloc(nbytes);

if (ptr == NULL){

perror("malloc");

exit (EXIT_FAILURE);

}

size_t i;

const size_t stride = sysconf(_SC_PAGE_SIZE);

for (i = 0;i < nbytes; i+= stride) {

ptr[i] = 0;

}

printf("allocated %d mbn", mb);

pause();

return 0;

}

gcc hog.c -o hog

./hog 100

allocated 100 mb

同样在另一个终端查看当前内存的变化,如下:

sar -r 1

Linux 2.6.32-16-generic (ubuntu) 03/23/2011 _x86_64_ (1

CPU)

10:48:28 AM kbmemfree kbmemused %memused kbbuffers kbcached

kbcommit %commit

10:48:29 AM 109928 395768 78.26 64592 198608 247156

17.37

10:48:30 AM 109928 395768 78.26 64592 198608 247156

17.37

10:48:31 AM 109920 395776 78.26 64592 198608 247156

17.37

10:48:32 AM 88212 417484 82.56 64592 198608 349664 24.57

10:48:33 AM 7192 498504 98.58 64592 198608 349664 24.57

10:48:34 AM 7192 498504 98.58 64592 198608 349664 24.57

10:48:35 AM 109404 396292 78.37 64592 198608 247172

17.37

10:48:36 AM 109424 396272 78.36 64592 198608 247172

17.37

10:48:37 AM 109424 396272 78.36 64592 198608 247172

17.37

10:48:38 AM 109424 396272 78.36 64592 198608 247172

17.37

注:我们看到kbcommit由247156kb变成了349664kb,在程序中停止后,kbcommit又恢复到了247156kb.

说明在分配了100MB的内存后,系统对当前需要的内存也随之提高.

三)关于内存分页的监控

sar -B 1

03:12:27 PM pgpgin/s pgpgout/s fault/s majflt/s pgfree/s

pgscank/s pgscand/s pgsteal/s %vmeff

03:12:28 PM 0.00 0.00 63.64 0.00 64.65 0.00 0.00 0.00

0.00

03:12:29 PM 0.00 0.00 35.64 0.00 62.38 0.00 0.00 0.00

0.00

03:12:30 PM 0.00 0.00 30.00 0.00 62.00 0.00 0.00 0.00

0.00

03:12:31 PM 0.00 0.00 30.00 0.00 65.00 0.00 0.00 0.00

0.00

03:12:32 PM 0.00 0.00 30.00 0.00 62.00 0.00 0.00 0.00

0.00

03:12:33 PM 0.00 0.00 30.00 0.00 64.00 0.00 0.00 0.00

0.00

注:

pgpgin/s:表示每秒从磁盘或SWAP置换到内存的字节数(KB)

pgpgout/s:表示每秒从内存置换到磁盘或SWAP的字节数(KB)

fault/s:每秒钟系统产生的缺页数,即主缺页与次缺页之和(major + minor)

majflt/s:每秒钟产生的主缺页数.

pgfree/s:每秒被放入空闲队列中的页个数

pgscank/s:每秒被kswapd扫描的页个数

pgscand/s:每秒直接被扫描的页个数

pgsteal/s:每秒钟从cache中被清除来满足内存需要的页个数

%vmeff:每秒清除的页(pgsteal)占总扫描页(pgscank+pgscand)的百分比

我们查看一下当前内存:

free

total used free shared buffers cached

Mem: 505696 117228 388468 0 488 11232

-/+ buffers/cache: 105508 400188

Swap: 917496 0 917496

运行hog程序:

./hog 100

这里故意以小于空闲内存进行分配,这里我们分配了100MB.

同时运行sar -B 1,如下:

sar -B 1

Linux 2.6.32-16-generic (ubuntu) 03/23/2011 _x86_64_ (1

CPU)

03:29:52 PM pgpgin/s pgpgout/s fault/s majflt/s pgfree/s

pgscank/s pgscand/s pgsteal/s %vmeff

03:29:53 PM 0.00 0.00 32.67 0.00 62.38 0.00 0.00 0.00

0.00

03:29:54 PM 8.00 0.00 11044.00 1.00 114.00 0.00 0.00 0.00

0.00

03:29:55 PM 0.00 0.00 14835.00 0.00 63.00 0.00 0.00 0.00

0.00

03:29:56 PM 0.00 0.00 30.00 0.00 64.00 0.00 0.00 0.00

0.00

03:29:57 PM 0.00 0.00 30.00 0.00 63.00 0.00 0.00 0.00

0.00

03:29:58 PM 0.00 0.00 29.70 0.00 63.37 0.00 0.00 0.00

0.00

03:29:59 PM 0.00 0.00 64.00 0.00 25749.00 0.00 0.00 0.00

0.00

注:这里我们看到fault/s由32.67/s涨到14835.00/s,说明产生了大量的缺页,而主缺页(majflt/s)为0,说明没有从磁盘(swap)读数据到内存,

pgpgin/s和pgpgout/s都是0,说明没有产生到swap空间的输入/输出,说明我们在这里并没有用到swap分区.

最后pgfree/s pgscank/s pgscand/s pgsteal/s

%vmeff的输出都是0,说明物理内存够用,而系统没有必要对cache进行清理,以释放空间和对swap扫描以置换空间.

我们下面再看一个例子,根据上面的情况我们知道还剩下400M左右的物理内存,我们这里一次性占用掉400M内存,然后再申请50MB的内存,如下:

./hog 400&

[1] 5234

allocated 400 mb

./hog 50&

allocated 50 mb

同时运行sar -B 1(我们忽略掉每一次申请400MB内存时的监控输出),如下:

sar -B 1

03:42:40 PM pgpgin/s pgpgout/s fault/s majflt/s pgfree/s

pgscank/s pgscand/s pgsteal/s %vmeff

03:43:09 PM 0.00 27.72 2615.84 0.00 2273.27 475.25 1964.36

2161.39 88.60

03:43:10 PM 0.00 232.00 4836.00 0.00 4999.00 1312.00 4864.00

4875.00 78.93

03:43:11 PM 0.00 12316.83 3586.14 0.00 6685.15 3516.83 3485.15

3555.45 50.78

03:43:12 PM 0.00 7352.00 2040.00 0.00 4303.00 2336.00 1728.00

2222.00 54.68

03:43:13 PM 128.00 0.00 54.00 4.00 62.00 0.00 0.00 0.00

0.00

03:43:14 PM 0.00 0.00 29.70 0.00 64.36 0.00 0.00 0.00

0.00

03:43:15 PM 0.00 0.00 30.00 0.00 63.00 0.00 0.00 0.00

0.00

03:43:16 PM 456.00 0.00 37.00 6.00 65.00 0.00 0.00 0.00

0.00

03:43:17 PM 432.00 0.00 94.00 7.00 12926.00 0.00 0.00 0.00

0.00

注:我们以第三条输出为例,在这个例子中pgpgout/s迅速涨到12316/s,说明产生了大量的swap写入操作.

而为了分配更多的物理内存给当前的请求,pgsteal/s也涨到了3555/s,说明系统的空闲内存已经无法满足程序hog对50MB内存的请求,

所以这里开始回收cache所占用的内存空间给当前程序,而同时系统为了给hog提供内存空间,它对swap和物理内存进行扫描,以获得更多的内存,

所以这里pgscank/s涨到3516/s,pgscand/s涨到3485/s,回收cache和系统需求的比率为50%,说明物理内存已经不能满足需要,这里就要动用swap,来分配内存了.

pgfree/s代表已经释放到空闲队列的内存总量.

如果我们在这里申请200MB呢,如下:

./hog 200&

同时运行sar -B 1,如下:

sar -B 1

Linux 2.6.32-16-generic (ubuntu) 03/23/2011 _x86_64_ (1

CPU)

10:54:34 AM pgpgin/s pgpgout/s fault/s majflt/s pgfree/s

pgscank/s pgscand/s pgsteal/s %vmeff

10:54:35 AM 0.00 444.00 5948.00 0.00 6179.00 1152.00 4224.00

5153.00 95.85

10:54:36 AM 0.00 552.00 7020.00 0.00 7164.00 992.00 4576.00

5411.00 97.18

10:54:37 AM 0.00 12640.82 6293.88 0.00 9745.92 4146.94 5518.37

5390.82 55.77

10:54:38 AM 0.00 18019.80 5787.13 0.00 10540.59 4499.01

5924.75 5198.02 49.87

10:54:39 AM 54.90 17003.92 1207.63 0.44 2696.95 1394.99

43894.77 1295.86 2.86

注:这里出现了非常极端的情况,在第5条输出的时候,pgfree/s已经明显小于pgscank/s和pgscand/s,而%vmeff的比例也从49.87%到了2.86%,

说明系统无法迅速释放内存来满足要求,从而进入无尽的SWAP置换.

四)关于I节点,文件和其它内核表的监控

sar -v 1

Linux 2.6.32-16-generic (ubuntu) 03/24/2011 _x86_64_ (1

CPU)

01:16:52 AM dentunusd file-nr inode-nr pty-nr

01:16:53 AM 4357 2464 5975 10

01:16:54 AM 4357 2464 5975 10

01:16:55 AM 4357 2464 5975 10

01:16:56 AM 4357 2464 5975 10

01:16:57 AM 4357 2464 5975 10

dentunusd:在缓冲目录条目中没有使用的条目数量.

file-nr:被系统使用的文件句柄数量.

inode-nr:使用的索引节点数量.

pty-nr:使用的pty数量.

1)dentunusd

dentunusd数据的数据来源是/proc/sys/fs/dentry-state的第二项数据.

要弄明白它的意义,我们首先要弄明白dcache(目录高速缓存),因为系统中所有的inode都是通过文件名来访问的,而为了解决文件名到inode转换的时间,就引入了dcache.

它是VFS层为当前活动和最近使用的名字维护的一个cache.

dcache中所有处于unused状态和negative(消极)状态的dentry对象都通链入到dentry_unused链表中,这种dentry对象在回收内存时可能会被释放.

如果我们在系统中运行ls -ltR /etc/会看到dentunusd的数量会多起来.

而通过mount -o remount /dev/sda1会看到dentunusd会迅速会回收.

2)file-nr

file-nr的的数据来源是/proc/sys/fs/file-nr文件的第一项数据.

实际上file-nr不是一个准确的值,file-nr每次增加的步长是64(64位系统),例如现在file-nr为2528,实际上可能只打开了2527个文件,而此时你打开两个文件后,它就会变成2592,而不是2530.

3)inode-nr

inode-nr的数据来源是/proc/sys/fs/inode-nr文件的第一项数据减去第二项数据的值.

inode-nr文件的第一项数据是已经分配过的INODE节点.第二项数据是空闲的INODE节点.

例如,inode-nr文件里的值为:13720 7987

我们新建一个文件file1,此时inode-nr第一项数据会加1,就是13721,表示系统里建立了这么多的inode.

我们再删除掉file1,此时就会变成13720.

空闲的INODE节点表示我们已经里这么多的INODE节点曾经有过被利用,但没有被释放.

所以INODE节点总数减去空闲的INODE,就是正在被用的INODE.

最后通过使用mount -o remount

/dev/sda1命令,空闲节点会被刷新,所以inode-nr的值会有所变化.

4)pty-nr

pty-nr的数据来源是/proc/sys/kernel/pty/nr

表示登陆过的终端总数,如果我们登录过10回,退出了3回,最后的结果还是10回.

五)关于中断的监控

sar -I ALL 1

Linux 2.6.32-16-generic (ubuntu) 03/24/2011 _x86_64_ (1

CPU)

01:14:27 AM INTR intr/s

01:14:28 AM 0 82.18

01:14:28 AM 1 0.00

01:14:28 AM 2 0.00

01:14:28 AM 3 0.00

01:14:28 AM 4 0.00

01:14:28 AM 5 0.00

01:14:28 AM 6 0.00

01:14:28 AM 7 0.00

01:14:28 AM 8 0.00

01:14:28 AM 9 0.00

01:14:28 AM 10 2.97

01:14:28 AM 11 0.00

01:14:28 AM 12 0.00

01:14:28 AM 13 0.00

01:14:28 AM 14 0.00

01:14:28 AM 15 22.77

01:14:28 AM INTR intr/s

01:14:29 AM 0 81.00

01:14:29 AM 1 0.00

01:14:29 AM 2 0.00

01:14:29 AM 3 0.00

01:14:29 AM 4 0.00

01:14:29 AM 5 0.00

01:14:29 AM 6 0.00

01:14:29 AM 7 0.00

01:14:29 AM 8 0.00

01:14:29 AM 9 0.00

01:14:29 AM 10 4.00

01:14:29 AM 11 0.00

01:14:29 AM 12 0.00

01:14:29 AM 13 0.00

01:14:29 AM 14 0.00

01:14:29 AM 15 0.00

注:INTR表示中断号,中断号代表的意义可以到/proc/interrupts查询.

intr/s表示每秒的中断次数.

六)关于平均负载和队列的监控

sar -q 1

Linux 2.6.32-16-generic (ubuntu) 03/24/2011 _x86_64_ (1

CPU)

01:25:39 AM runq-sz plist-sz ldavg-1 ldavg-5 ldavg-15

01:25:40 AM 0 203 0.00 0.00 0.00

01:25:41 AM 0 203 0.00 0.00 0.00

01:25:42 AM 0 203 0.00 0.00 0.00

01:25:43 AM 0 203 0.00 0.00 0.00

注:

runq-sz:处于运行或就绪的进程数量

plist-sz:现在进程的总数(包括线程).

ldavg-1:最近一分钟的负载.

ldavg-5:最近五分钟的负载.

ldavg-15:最近十分钟的负载.

平均负载和队列的数据来源于/proc/loadavg

七)关于网络设备的监控

sar -n DEV 1 1000

Linux 2.6.32-16-generic (ubuntu) 03/24/2011 _x86_64_ (1

CPU)

12:25:55 PM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s

txcmp/s rxmcst/s

12:25:56 PM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00

12:25:56 PM eth0 5.05 1.01 0.73 0.18 0.00 0.00 0.00

12:25:56 PM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s

txcmp/s rxmcst/s

12:25:57 PM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00

12:25:57 PM eth0 1.00 1.00 0.06 0.38 0.00 0.00 0.00

rxpck/s:每秒钟收到数据包的数量.

txpck/s:每秒钟发送数据包的数量.

rxkB/s:每秒钟接收的字节(KB).

txkB/s:每秒钟发送的字节(KB).

rxcmp/s:每秒收到的压缩包的数量

txcmp/s:每秒发出的压缩包的数量

rxmcst/s:每秒收到的广播包的数量

网络设备的数据来源于/proc/net/dev.

我这里尝试用ssh的压缩功能进行传输,结果也没看到压缩包的数量有变化.

尝试发送或接收广播包/组播包时rxmcst/s也不会有变化.

八)关于NFS的监控

1)关于NFS客户端的监控

在NFS客户端用下面的命令监控:

sar -n NFS 1

02:57:45 AM call/s retrans/s read/s write/s access/s

getatt/s

02:57:46 AM 0.00 0.00 0.00 0.00 0.00 0.00

02:57:47 AM 0.00 0.00 0.00 0.00 0.00 0.00

02:57:48 AM 0.00 0.00 0.00 0.00 0.00 0.00

02:57:49 AM 0.00 0.00 0.00 0.00 0.00 0.00

call/s:每秒成功的RPC调用都会使call/s的值增长,比如对NFS的一次读/写.

retrans/s:每秒重传的RPC次数,比如因为服务器的问题,产生timeout,这时客户端需要重新传输.

read/s:每秒从NFS服务端读取的次数.

write/s:每秒写入到NFS服务端的次数.

access/s:每秒访问NFS的次数,比如从NFS服务端COPY文件.

getatt/s:每秒获取NFS服务端文件属性的次数,比如ls -l

/NFSSERVER/,如果NFSSERVER有300个文件,将产生300次这样的请求.

我们对以上几次监控数据进行演示:

用dd命令写300M的数据到NFS服务端:

dd if=/dev/zero of=/mnt/test bs=1M count=300

300+0 records in

300+0 records out

314572800 bytes (315 MB) copied, 29.3891 s, 10.7 MB/s

在另一个终端查看NFS的监控输出:

sar -n NFS 1

03:10:06 AM call/s retrans/s read/s write/s access/s

getatt/s

03:10:21 AM 196.00 0.00 0.00 192.00 1.00 1.00

03:10:22 AM 773.00 0.00 0.00 768.00 0.00 0.00

03:10:23 AM 0.00 0.00 0.00 0.00 0.00 0.00

03:10:24 AM 0.00 0.00 0.00 0.00 0.00 0.00

03:10:25 AM 0.00 0.00 0.00 0.00 0.00 0.00

03:10:26 AM 705.00 0.00 0.00 704.00 0.00 0.00

03:10:27 AM 0.00 0.00 0.00 0.00 0.00 0.00

03:10:28 AM 195.00 0.00 0.00 192.00 0.00 0.00

03:10:29 AM 0.00 0.00 0.00 0.00 0.00 0.00

03:10:30 AM 516.00 0.00 0.00 512.00 0.00 0.00

03:10:31 AM 129.00 0.00 0.00 128.00 0.00 0.00

03:10:32 AM 65.00 0.00 0.00 64.00 0.00 0.00

03:10:33 AM 259.00 0.00 0.00 256.00 0.00 0.00

03:10:34 AM 0.00 0.00 0.00 0.00 0.00 0.00

03:10:35 AM 0.00 0.00 0.00 0.00 0.00 0.00

03:10:36 AM 1142.00 0.00 0.00 1140.00 0.00 0.00

03:10:37 AM 0.00 0.00 0.00 0.00 0.00 0.00

03:10:38 AM 0.00 0.00 0.00 0.00 0.00 0.00

03:10:39 AM 873.00 0.00 0.00 845.00 0.00 0.00

我们看到call/s基本上是其它数据之和,因为我们是向NFS服务端写数据,所以write/s会有变化,而access/s只是第一次打开文件时用到,getatt/s同样是这样.

用dd命令从NFS服务端读300M的数据到本地:

dd if=/mnt/test of=/tmp/test bs=1M count=300

在另一个终端查看NFS的监控输出:

sar -n NFS 1

03:33:43 AM 212.00 0.00 210.00 0.00 1.00 1.00

03:33:44 AM 300.00 0.00 300.00 0.00 0.00 0.00

03:33:45 AM 285.00 0.00 285.00 0.00 0.00 0.00

03:33:46 AM 285.00 0.00 285.00 0.00 0.00 0.00

03:33:47 AM 281.00 0.00 281.00 0.00 0.00 0.00

03:33:48 AM 270.00 0.00 270.00 0.00 0.00 0.00

03:33:49 AM 285.00 0.00 285.00 0.00 0.00 0.00

03:33:50 AM 315.00 0.00 315.00 0.00 0.00 0.00

03:33:51 AM 249.00 0.00 249.00 0.00 0.00 0.00

03:33:52 AM 0.00 0.00 0.00 0.00 0.00 0.00

03:33:53 AM 0.00 0.00 0.00 0.00 0.00 0.00

注:我们看到写NFS的实验中,数据是不连续的,而读NFS的实验中数据是连接的,原因是写的时候我们直接从/dev/zero读取再写入,而由于网络的瓶颈,所以是不连续的,

而读NFS的实验我们是从物理文件中读取,由于它不像/dev/zero读取那样快,所以输出是连续的.

下面我们看一下access/s和getatt/s

mount -t 10.1.6.81:/etc /mnt/

ls -ltR /mnt/

在另一个终端查看NFS的监控输出:

sar -n NFS 1

03:10:06 AM call/s retrans/s read/s write/s access/s

getatt/s

03:26:55 AM 13.00 0.00 0.00 0.00 1.00 1.00

03:26:56 AM 221.00 0.00 0.00 0.00 9.00 9.00

03:26:57 AM 14.00 0.00 0.00 0.00 2.00 2.00

03:26:58 AM 4.00 0.00 0.00 0.00 1.00 1.00

03:26:59 AM 214.00 0.00 0.00 0.00 20.00 20.00

03:27:00 AM 180.00 0.00 0.00 0.00 34.00 34.00

03:27:01 AM 159.00 0.00 0.00 0.00 49.00 48.00

03:27:02 AM 176.00 0.00 0.00 0.00 48.00 56.00

03:27:03 AM 128.00 0.00 0.00 0.00 41.00 41.00

03:27:04 AM 469.00 0.00 0.00 0.00 48.00 48.00

03:27:05 AM 9.00 0.00 0.00 0.00 3.00 3.00

03:27:06 AM 78.00 0.00 0.00 0.00 26.00 26.00

注意我们第一次读取的时,access/s和getatt/s基本一致,而它们的和与call/s大相径庭,我们再做一次ls

-ltR /mnt的操作,再次查看NFS监控输出:

03:44:51 AM 0.00 0.00 0.00 0.00 0.00 0.00

03:44:52 AM 129.00 0.00 0.00 0.00 0.00 129.00

03:44:53 AM 442.00 0.00 0.00 0.00 0.00 442.00

03:44:54 AM 278.00 0.00 0.00 0.00 0.00 278.00

03:44:55 AM 473.00 0.00 0.00 0.00 0.00 473.00

03:44:56 AM 295.00 0.00 0.00 0.00 0.00 295.00

03:44:57 AM 827.00 0.00 0.00 0.00 0.00 827.00

03:44:58 AM 0.00 0.00 0.00 0.00 0.00 0.00

03:44:59 AM 0.00 0.00 0.00 0.00 0.00 0.00

03:45:00 AM 47.00 0.00 0.00 0.00 0.00 47.00

03:45:01 AM 0.00 0.00 0.00 0.00 0.00 0.00

03:45:02 AM 0.00 0.00 0.00 0.00 0.00 0.00

03:45:03 AM 0.00 0.00 0.00 0.00 0.00 0.00

这里access/s与getatt/s不一致,而它们的和与call/s基本相同了,原因是第一次访问时系统对access/s做了文件系统缓存(cache),所以第二次访问直接读取了内存,而getatt(获取属性)却不能这样做.

我们清理cache,再看一下:

echo 3 > /proc/sys/vm/drop_caches

ls -ltR /mnt/

输出如下:

03:48:22 AM 13.00 0.00 0.00 0.00 1.00 1.00

03:48:23 AM 171.29 0.00 0.00 0.00 8.91 7.92

03:48:24 AM 48.00 0.00 0.00 0.00 0.00 1.00

03:48:25 AM 91.00 0.00 0.00 0.00 23.00 23.00

03:48:26 AM 141.00 0.00 0.00 0.00 0.00 0.00

03:48:27 AM 69.00 0.00 0.00 0.00 3.00 3.00

03:48:28 AM 51.00 0.00 0.00 0.00 14.00 14.00

03:48:29 AM 142.00 0.00 0.00 0.00 43.00 43.00

03:48:30 AM 410.00 0.00 0.00 0.00 121.00 129.00

03:48:31 AM 440.00 0.00 0.00 0.00 39.00 38.00

03:48:32 AM 15.00 0.00 0.00 0.00 5.00 5.00

03:48:33 AM 72.00 0.00 0.00 0.00 24.00 24.00

03:48:34 AM 0.00 0.00 0.00 0.00 0.00 0.00

我们看到又恢复到第一次查询时的状态.

本项输出的数据来源于/proc/net/rpc/nfs

2)关于NFS服务端的监控

这里要在NFS服务端进行监控.

以下是模拟对NFS服务器进行大量写入操作的例子.

sar -n NFSD 1 1000

02:05:41 PM scall/s badcall/s packet/s udp/s tcp/s hit/s

miss/s sread/s swrite/s saccess/s sgetatt/s

02:05:42 PM 332.65 0.00 332.65 332.65 0.00 1.02 327.55 0.00

327.55 2.04 0.00

02:05:43 PM 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

0.00

02:05:44 PM 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

0.00

以下是用UDP模试挂载NFS,再次模拟对NFS服务器进行大量写入操作的例子.

05:10:51 PM scall/s badcall/s packet/s udp/s tcp/s hit/s

miss/s sread/s swrite/s saccess/s sgetatt/s

02:04:30 PM 1.01 0.00 1.01 1.01 0.00 0.00 0.00 0.00 0.00 1.01

0.00

02:04:31 PM 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

0.00

02:04:32 PM 333.00 0.00 333.00 333.00 0.00 1.00 323.00 0.00

321.00 1.00 3.00

02:04:33 PM 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

0.00

注:以上的两个例子我们分别用TCP(默认)/UDP两种模试进行模拟测试.

用指定TCP的方式挂载NFS:

mount -t nfs -o tcp,remount ip:/tmp /mnt/

用指定UDP的方式挂载NFS

mount -t nfs -o udp,remount ip:/tmp /mnt/

hit/s和miss/s代表每秒缓存命中和缓存未命中的次数,这个在写NFS服务端会有变化.

其余各列数据与NFS客户端一致,在则不进行重复.

本项输出的数据来源于/proc/net/rpc/nfsd

八)关于套接字的监控

sar -n SOCK 1 1000

02:21:28 PM totsck tcpsck udpsck rawsck ip-frag

02:21:29 PM 112 11 12 0 0

02:21:30 PM 112 11 12 0 0

02:21:31 PM 112 11 12 0 0

02:21:32 PM 112 11 12 0 0

02:21:33 PM 112 11 12 0 0

02:21:34 PM 112 11 12 0 0

02:21:35 PM 112 11 12 0 0

02:21:36 PM 112 11 12 0 0

注:

totsck:代表现在有多少个SOCKET连接,比如进行一次ssh连接,totsck将加1,同样断开连接相应的也会减少.

tcpsck:代表现在有多少个处在监听状态的TCP套接字.如下:

netstat -tlnp|grep LISTEN

tcp 0 0 127.0.0.1:2208 0.0.0.0:* LISTEN 2228/hpiod

tcp 0 0 0.0.0.0:2049 0.0.0.0:* LISTEN -

tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1937/portmap

tcp 0 0 192.168.27.130:22 0.0.0.0:* LISTEN 3001/sshd

tcp 0 0 0.0.0.0:886 0.0.0.0:* LISTEN 1976/rpc.statd

tcp 0 0 0.0.0.0:791 0.0.0.0:* LISTEN 2732/rpc.mountd

tcp 0 0 0.0.0.0:23 0.0.0.0:* LISTEN 2286/xinetd

tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 2250/cupsd

tcp 0 0 0.0.0.0:763 0.0.0.0:* LISTEN 2703/rpc.rquotad

tcp 0 0 0.0.0.0:57500 0.0.0.0:* LISTEN -

tcp 0 0 127.0.0.1:2207 0.0.0.0:* LISTEN 2233/python

tcp 0 0 ::1:631 :::* LISTEN 2250/cupsd

在这里最后一个SOCK套接字将不会统计在tcpsck里,因为它的listen调用没有绑定具体的IP地址.

udpsck:代表现在有多少个处在监听状态的UDP套接字.

rawsck:代表原始套接字,原始套接字可以接收本机网卡上的数据帧或者数据包,对与监听网络的流量和分析是很有作用的.

if-frag:代表IP分片次数.

九)关于I/O及速率的监控

sar -b 1 100

07:17:58 AM tps rtps wtps bread/s bwrtn/s

07:17:59 AM 7.00 0.00 7.00 0.00 368.00

07:18:00 AM 0.00 0.00 0.00 0.00 0.00

07:18:01 AM 0.00 0.00 0.00 0.00 0.00

07:18:02 AM 0.00 0.00 0.00 0.00 0.00

07:18:03 AM 0.00 0.00 0.00 0.00 0.00

07:18:04 AM 0.00 0.00 0.00 0.00 0.00

注:

tps:每秒从物理磁盘I/O的次数.多个逻辑请求会被合并为一个I/O磁盘请求,一次传输的大小是不确定的.

rtps:每秒的读请求数

wtps:每秒的写请求数

bread/s:每秒读磁盘的数据块数(in blocks 1 block = 512B, 2.4以后内核)

bwrtn/s:每秒写磁盘的数据块数(in blocks 1 block = 512B, 2.4以后内核)

一般情况下tps=(rtps+wtps)

先收回cache.

echo 3 > /proc/sys/vm/drop_caches

dd if=/tmp/tmp of=/tmp/tmp1 bs=1M

再观察sar的输出:

07:25:22 AM tps rtps wtps bread/s bwrtn/s

07:25:23 AM 250.50 162.38 88.12 45100.99 24475.25

07:25:24 AM 305.00 203.00 102.00 90976.00 24640.00

07:25:25 AM 116.00 15.00 101.00 5488.00 24864.00

07:25:26 AM 0.00 0.00 0.00 0.00 0.00

07:25:27 AM 0.00 0.00 0.00 0.00 0.00

07:25:28 AM 117.17 0.00 117.17 0.00 33785.86

十)关于块设备活动状况的监控

先清理cache.

echo 3 > /proc/sys/vm/drop_caches

dd if=/tmp/tmp of=/tmp/tmp1 bs=1M

观察sar的输出:

sar -d 1 10000 -p

07:32:59 AM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await

svctm %util

07:33:00 AM sda 120.37 23014.81 5837.04 239.69 1.66 13.75 3.22

38.70

07:33:00 AM hdc 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

07:33:00 AM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await

svctm %util

07:33:01 AM sda 320.00 106624.00 18720.00 391.70 2.29 7.19

2.45 78.30

07:33:01 AM hdc 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

07:33:01 AM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await

svctm %util

07:33:02 AM sda 209.00 26960.00 33152.00 287.62 3.21 15.34

1.53 31.90

07:33:02 AM hdc 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

注:

用参数-p可以打印出sda,hdc等磁盘设备名称,如果不用参数-p,设备节点则有可能是dev8-0,dev22-0

tps:每秒从物理磁盘I/O的次数.多个逻辑请求会被合并为一个I/O磁盘请求,一次传输的大小是不确定的.

rd_sec/s:每秒读扇区的次数.

wr_sec/s:每秒写扇区的次数.

avgrq-sz:平均每次设备I/O操作的数据大小(扇区).

avgqu-sz:磁盘请求队列的平均长度.

await:从请求磁盘操作到系统完成处理,每次请求的平均消耗时间,包括请求队列等待时间,单位是毫秒(1秒=1000毫秒).

svctm:系统处理每次请求的平均时间,不包括在请求队列中消耗的时间.

%util:I/O请求占CPU的百分比,比率越大,说明越饱和.

该数据的来源是/proc/diskstats.

十一)关于sar的一些结束语

1)sar与它的时间段

sar也可以查看非实时的数据,它是通过cron周期的运行sysstat脚本,将数据产生到指定的目录下,例如:/var/log/sa/sa27

sa27就是本月27日,指定具体的时间可以通过-s(start)和-e(end)来指定.

例如:我们想查看本月27日,从0点到23点的内存资源.

sar -f /var/log/sa/sa27 -s 00:00:00 -e 23:00:00 -r

03:52:14 AM LINUX RESTART

04:00:01 AM kbmemfree kbmemused %memused kbbuffers kbcached

kbswpfree kbswpused %swpused kbswpcad

04:10:01 AM 237268 278332 53.98 44328 183584 1052248 0 0.00

0

04:20:01 AM 237144 278456 54.01 44476 183592 1052248 0 0.00

0

04:30:01 AM 191988 323612 62.76 45324 227616 1052248 0 0.00

0

04:40:01 AM 191864 323736 62.79 45452 227624 1052248 0 0.00

0

04:50:02 AM 191740 323860 62.81 45576 227628 1052248 0 0.00

0

05:00:01 AM 190252 325348 63.10 45932 227640 1052248 0 0.00

0

Average: 206709 308891 59.91 45181 212947 1052248 0 0.00

0

07:02:35 AM LINUX RESTART

07:10:01 AM kbmemfree kbmemused %memused kbbuffers kbcached

kbswpfree kbswpused %swpused kbswpcad

07:20:01 AM 277340 238260 46.21 54056 145252 1052248 0 0.00

0

07:30:01 AM 304944 210656 40.86 1684 171196 1052248 0 0.00

0

07:40:01 AM 310168 205432 39.84 752 167940 1052248 0 0.00

0

07:50:01 AM 307568 208032 40.35 1164 169884 1052248 0 0.00

0

08:00:01 AM 302420 213180 41.35 1916 173580 1052248 0 0.00

0

Average: 300488 215112 41.72 11914 165570 1052248 0 0.00

0

注:上面的输出分成两个时段,这是因为在我们只在这两个时间开了机器,并运行/etc/cron.d/sysstat脚本.

sysstat脚本每十分钟执行一次/usr/lib/sa/sa1脚本,生成监控数据,所以我们看到上面的数据是以十分钟为间隔的.

2)sar的版本

在RHEL5下默认的版本是sysstat 7.0,在7.0版本中,sar的命令有-x/-X对某个进程的监控.

而在新的版本中sysstat 9.x中,sar去掉了-x/-X,并对-n

下的监控项做了调整,增加了ICMP等监控项.并对-v下面的系统资源做了调整.

本篇文章,我们用的是sysstat 9.x.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才上传平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价值,对于初学者来说,也是入门进阶的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础上二次开发,进行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值