注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Code@Pig Home

喜欢背着一袋Code傻笑的Pig .. 忧美.欢笑.记忆.忘却 .之. 角落

 
 
 

日志

 
 

[FreeBSD] usr.bin/systat  

2009-09-29 21:21:03|  分类: os_FreeBSD |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
main.c
整个程序就是察看 systat -cmd 使用了那个 cmd,然后对应显示 cmd 相关的信息。
每个 cmd 的逻辑放在独立的文件中,比如:/usr.bin/systat/pigs.c

sysctl -d kern.cp_time
察看 kern.cp_time 的含义

执行 systat 的任何时候,都可以通过 :cmd 来输入指令,切换不同的显示参数、状态。


============= -pigs =============
systat -pigs
察看最消耗cpu的进程的情况。pigs,这个名字真是好玩。:-)
通过 kvm_getprocs 获取当前所有进程的情况,然后排序、显示出来。

long stime[CPUSTATES];
size_t len = sizeof(stime);
sysctlbyname("kern.cp_time", &stime, &len, NULL, 0);
获取 CPU time statistics, 其中包括如下几个时间 (sys/resource.h)
#define    CP_USER        0
#define    CP_NICE        1
#define    CP_SYS        2
#define    CP_INTR        3
#define    CP_IDLE        4
#define    CPUSTATES    5

运行一个死循环的 a.out,如下:
                    /0   /1   /2   /3   /4   /5   /6   /7   /8   /9   /10
     Load Average   |||

                    /0   /10  /20  /30  /40  /50  /60  /70  /80  /90  /100
kasicass      a.out XXXXXXXXX
ylhu      python2.5 XXXXXXXX   
root     idle: cpu0 XXXXXXX    
root     idle: cpu1 XXXXXX    
root     idle: cpu2 XXXXXX    
root     idle: cpu3 XXXXXX
             <idle> XXXX
其中 a.out 后面的 XXX 是其综合消耗 multi-cpu 的总的比率。
idle: cpu0 等显示的是当前时刻,每个 cpu 的 idle 情况。
<idle> 是一个“虚拟”的 user process,显示了总的 idle 情况。


============= -swap =============
swap 信息


============= -mbufs =============
          /0   /5   /10  /15  /20  /25  /30  /35  /40  /45  /50  /55  /60
Mbufs     XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 10401

10401 空闲的 mbuf 数量,其中前 60 个会以 "X" 的形式显示出来。如果 mbuf 不足 60 个,
"X" 就不会占满屏幕的一行了。

sysctlbyname("kern.ipc.mbstat", mbstat, &len, NULL, 0)
/* sys/mbuf.h */
struct mbstat {
    u_long    m_mbufs;    /* XXX */
    u_long    m_mclusts;    /* XXX */

    u_long    m_drain;    /* times drained protocols for space */
    u_long    m_mcfail;    /* XXX: times m_copym failed */
    u_long    m_mpfail;    /* XXX: times m_pullup failed */
    u_long    m_msize;    /* length of an mbuf */
    u_long    m_mclbytes;    /* length of an mbuf cluster */
    u_long    m_minclsize;    /* min length of data to allocate a cluster */
    u_long    m_mlen;        /* length of data in an mbuf */
    u_long    m_mhlen;    /* length of data in a header mbuf */

    /* Number of mbtypes (gives # elems in mbtypes[] array: */
    short    m_numtypes;

    /* XXX: Sendfile stats should eventually move to their own struct */
    u_long    sf_iocnt;    /* times sendfile had to do disk I/O */
    u_long    sf_allocfail;    /* times sfbuf allocation failed */
    u_long    sf_allocwait;    /* times sfbuf allocation had to wait */
};


============= -iostat =============
显示当前 i/o设备(磁盘) 的消耗情况。

          /0   /10  /20  /30  /40  /50  /60  /70  /80  /90  /100
cpu  user|
     nice|
   system|
interrupt|
     idle|XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

              ad0              ad2
            KB/t tps  MB/s   KB/t tps  MB/s
            0.00   0  0.00   0.00   0  0.00
            2.40   2  0.00   0.00   0  0.00

上半段显示了 cpu 的使用情况。
下半段显示了 io 的情况。
  KB/t - kb per transfer
  tps  - transfer per second
  MB/s - MB per second
transfer 应该比较底层的参数,我们注意 MB/s 就好。

-iostat 分为 numbers / bars 两种显示模式。上面那种就是 numbers。
bars 显示如下:
          /0   /10  /20  /30  /40  /50  /60  /70  /80  /90  /100
ad0   MB/sXXXXXXXXXXXXXXXXXXXXXXXXX
      tps|XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX406.32
     KB/t|XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX127.28
ad2   MB/s
      tps|
     KB/t|

bars 模式下,默认没有 KB/t 的显示,可以用指令 :kbpt 来开启、关闭。

============= -netstat =============
netstat.c / netcmds.c
在 main.c 中有一个 use_kvm 的开关。use_kvm = 1 会使用 kvm_xxx 等 api 来获取内核信息;而 = 0 则使用 sysctl
来获。kvm 是允许访问任何内核结构体,而 sysctl 只能访问到部分,所以只有 root 时,才 use_kvm = 1。
不过 systat -netstat 无论通过 kvm 还是 sysctl,获取到的信息都差不多,为何要区分这两种情况呢?不解!

systat -netstat 默认启动时,显示如下内容,监听 tcp,udp 的情况。
Local Address          Foreign Address        Proto Recv-Q Send-Q (state)
foobar..30000          192.168.36.75.1202   tcp4             0             0 ESTABLISHED
foobar..svn                 *.*                                 tcp4             0             0 LISTEN

其中 Recv-Q, Send-Q 是此 socket 在系统的 rcv/sndbuf 中的 bytes 数量。
进程A 给 进程B 发送数据,只要进程B不 read, 就可以看到 Recv-Q 中积累了内容。

指令 :numbers 可以看 ip,域名;:names 则可切换回域名。
Local Address                Foreign Address        Proto Recv-Q Send-Q (state)
192.168.1.26.30000     192.168.36.75.1202   tcp4             0           52 ESTABLISHED
192.168.1.26.3690         *.*                                 tcp4             0             0 LISTEN

其中 state 只有 tcp 才会有。
:all 指令切换是否观看 Local Address == INADDR_ANY 的端口 (listening port)。
Local Address          Foreign Address        Proto Recv-Q Send-Q (state)
*.8080                                       *.*                    tcp4           0             0 LISTEN
*.32200                                     *.*                    tcp6           0             0 LISTEN
*.32200                                     *.*                    tcp4           0             0 LISTEN
*.4445                                       *.*                    tcp4           0             0 LISTEN
*.7024                                       *.*                    tcp4           0             0 LISTEN

:proto tcp/udp/all, 用于选择监听 tcp or udp or both

:ignore smtp
Local Address               Foreign Address          Proto  Recv-Q Send-Q (state)
192.168.1.26.30000    192.168.36.75.1202     tcp4              0           52 ESTABLISHED

:show ports
!smtp

:display smtp
Local Address                Foreign Address          Proto Recv-Q Send-Q (state)
192.168.1.26.30000     192.168.36.75.1202     tcp4              0          52 ESTABLISHED
localhost.foo.co.smtp      *.*                                  tcp4              0             0 LISTEN

:show ports
smtp

:ignore foobar
Local Address                Foreign Address          Proto Recv-Q Send-Q (state)
192.168.1.26.30000     192.168.36.75.1202     tcp4             0           52 ESTABLISHED

:show hosts
!foobar

:display foobar
Local Address                Foreign Address          Proto Recv-Q Send-Q (state)
192.168.1.26.30000     192.168.36.75.1202     tcp4             0           52 ESTABLISHED
foobar..svn                       *.*                                   tcp4             0             0 LISTEN

:show hosts
foobar

通过 ignore/display 可以控制某个 port or host 的显示。而 show 指令则可以查看你当前的设置。
注意,其中 port 只能是 service name, 比如 smtp;而不是数字,如 8080。

============= -ifstat =============
察看服务器网卡的 in/out 流量。
:scale [auto|kbit|kbyte|mbit|mbyte|gbit|gbyte]        切换显示的单位,其实默认的 auto 就足够了
      Interface            Traffic                        Peak                        Total
           bge0  in    286.192 KB/s        327.438 KB/s            2.091 GB
                     out   418.651 KB/s        475.283 KB/s            1.623 GB
Traffic, 当前流量
Peak, 峰值
Total, 总流量
  评论这张
 
阅读(2433)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017