精华内容
下载资源
问答
  • 监控系统状态作为一名运维工程师,我们一定要了解我们的系统,如果出现问题,我们要查看哪里出了问题,有什么样的症状。如果我们要查看系统资源耗费情况。需要怎样查看呢?[root@localhost ~]# w20:44:47(当前时间...

    监控系统状态
    作为一名运维工程师,我们一定要了解我们的系统,如果出现问题,我们要查看哪里出了问题,有什么样的症状。
    如果我们要查看系统资源耗费情况。需要怎样查看呢?
    [root@localhost ~]# w
    20:44:47(当前时间) up 7 min,(启动多长时间) 1 user,(几个用户登录,他可以在第二行详细的看出) load average: 0.00, 0.04, 0.05(重点看系统负载)
    USER (用户) TTY (登录的终端) FROM(从哪里登录来) LOGIN@ IDLE JCPU PCPU WHAT
    root pts/0 (网络远程登录就是pts/0,pts/1,终端登录则是tty1...) 192.168.1.101 20:38 7.00s 0.08s 0.01s w

    load average: 0.00, 0.04, 0.05(重点看系统负载)。平日看最多的就是这个,他有三组数字,代表1分钟,5分钟,15分钟。这个时间段内系统的负载值是多少,他是一个数值。那这个数值是什么含义呢?它和cup有关系,单位时间段内使用cup的活动的进程有多少个。
    比如第一组数值0.00,他是表示1分钟内使用这个cpu活动的进程有多少个,这个数值不一定是整数,它是一个平均值,可以使零点几,也可以是一百多,那么这个数值多少算是正常的呢?比如当前值是0,说明当前没有活动,机器处在空闲状态,这对于服务器或者系统来讲非常浪费。

    那么什么时候是最理想的状态呢?这取决与你有几颗cup,这里的cup指的是逻辑cpu,而不是物理cup。每一刻物理cpu上又有许多逻辑cpu。

    那么我们这样查看设备上有几颗cpu呢?用命令[root@localhost ~]# cat /proc/cpuinfo
    [root@localhost ~]# cat /proc/cpuinfo
    processor : 0(这个数字如果是0,那代表它有一颗cpu,如果是1那就有2颗,如果是39,或者40,那代表他有40颗。这只代表它有多少逻辑cup,而不是逻辑cpu。)

    从上面的信息可以看出,我们的虚拟机只有一颗cpu,那么第一组的数字为1的时候,它是最理想的。所以我们重点关注第一组数字。

    当我们的系统负载值过高时,我们就需要想想这是为什么?我的进程在干什么?我的那些任务在使用cpu呢?我们需要进一步查看系统的瓶颈在哪里。

    我们只要输入vmstat这条命令就可以查看我们的cpu。内存。虚拟磁盘,io磁盘,system系统进程等等相关的东西。
    这条命令一般这样用。
    [root@localhost ~]# vmstat 1 5(1代表每一秒钟显示1次,显示5秒钟后结束)
    procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
    r b swpd free buff cache si so bi bo in cs us sy id wa st
    2 0 0 737072 2076 141924 0 0 19 3 54 58 0 0 100 0 0
    0 0 0 737056 2076 141924 0 0 0 0 49 46 0 0 100 0 0
    0 0 0 737056 2076 141924 0 0 0 0 52 50 0 0 100 0 0
    0 0 0 737056 2076 141924 0 0 0 0 46 38 0 0 100 0 0
    0 0 0 737056 2076 141924 0 0 0 0 50 44 0 0 100 0 0

    我们只需要关注r、b,swpd、si、so、bi、bo、us、wa这些就够了。
    r:run。表示运行或者等待cpu时间片的进程。我们不要以为这些等待的进程没有运行,某一时刻1个cpu只能有一个进程占用,其他进程只能排队,而此时这些排队的进程仍然处于运行状态,如果这个数值长期大于服务器cpu的个数,则说明cpu资源不够用了。就好像有一个电话亭有十个人打电话,有点人打的时间长,有的人打的时间短,为了公平,我们让每个人都只打1分钟,然后再去后面排队,等到每个人都打一遍后,再轮到第一个人打1分钟。

    b:block。有多少个进程在等待。

    swpd:如果数字不变,没有关系。如果数字持续变化,则说明交换分区和内存在频繁的交换数据,这说明我们的内存不够了。

    si,so:它与swpd有关,si,i表示in,它表示有多少kb的数据从swap进入到内存中。。so表示out。它表示有多少kb的数据从内存进入到swap中。这里面我们有参照物,这就是内存,in表示进去的,out表示出来的。

    bi、bo:bi表示从磁盘中出来,进入到内存中,也是读的数据量是多少。bo,写的数据量。这两个数据如果很大,这说明磁盘正在频繁读写,磁盘相对于内存和cpu会慢很多,如果很多的数据需要读写,这样对造成b列增加,会有更多的进程在等待磁盘。

    us:表示用户级别的资源占用cup的百分比。这个数字不会超过100。如果这个长时间数字大于50,这说明系统的资源不够了。

    wa:等待cpu的百分比。如果这一列很大,则表示cpu不够用了。

    top:查看进程使用资源情况
    top - 21:57:44 up 53 min, 1 user, load average: 0.00, 0.01, 0.05
    Tasks: 84 total(任务总和), 2 running(运行), 82 sleeping(休眠状态), 0 stopped(停止), 0 zombie(僵尸进程,主进程意外停止,子进程还在)
    %Cpu(s): 0.3 us(如果这项在60%以上,那么我们就要注意了。它会使我们电脑寿命大幅减小), 0.3 sy, 0.0 ni, 99.0 id, 0.0 wa, 0.0 hi, 0.3 si, 0.0 st(被偷走的cpu百分比,如果服务器做了虚拟化,他会有一些子机,这样可能会偷走一部分cpu)

    KiB Mem(物理内存) : 1012376 total(内存总和), 750428 free(内存剩余), 130844 used(使用多少), 131104 buff/cache(我们一般关注物理分区)
    KiB Swap(交换分区): 2097148 total, 2097148 free, 0 used. 727448 avail Mem

    *我们的系统负载值可以很高,但是我们的us很低,这是可以的。但是大部分情况下,我们的us很高,我们的系统负载也一定会很高,因为我们某一些进程,它占用cpu很高,他势必会造成CPU很忙,cpu很忙,那其他的进程就会排队,一排队,那系统负载肯定会增高*

    这是我们真正要关注的东西,默认情况下它是按cpu的百分比排序,使用cpu多的会排在前面。
    %MEN是内存。
    RES是物理内存大小,单位是kb
    如果我们想按照内存占用大小来排序,就按M(大写),如果想切回cpu排序,就按P(大写)。

    我们还可以按数字1,查看指定cpu。默认是看cpu的平均值,按1可以来回切换。
    按字母-c可以查看具体的进程命令全局的路径,按-bn1可以静态显示所有进程信息,这个可以在我们写脚本的时候用,按字母q退出。

    我们也可以关注一下pid,如果我们想结束某一个进程,只要输入kill+pid 号,就可以结束它。

    sar:全面分析系统状态的命令。它被成为linux系统中的瑞士×××,它的功能非常复杂,如果系统中没有这个命令,我们就需要用yum安装sysstat这个包。
    安装完成后,我们运行这条命令
    [root@localhost ~]# sar
    无法打开 /var/log/sa/sa06: 没有那个文件或目录
    发现它无法运行,这是因为如果sar命令不加具体的选项或者参数,他默认会去调用系统里边保留的一个历史文件。
    [root@localhost ~]# ls /var/log/sa
    sa06
    这个目录就是sar生成的历史文件所在的目录,sar有一个特性,它每十分钟就会把系统状态过滤一遍,保存在文件里,而这个文件就存在在这个目录中。如果想用sar这条命令,则要加参数。

    比如我们要产看网卡流量
    [root@localhost ~]# sar -n DEV 1 3(它的用法和vmstat类似,1代表每隔1秒显示1次,3代表显示三次。)
    Linux 3.10.0-693.el7.x86_64 (localhost.localdomain) 2018年03月06日 _x8664 (1 CPU)

    22时52分25秒 IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
    22时52分26秒 lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00
    22时52分26秒 ens33 0.99 0.99 0.06 0.18 0.00 0.00 0.00

    22时52分26秒 IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
    22时52分27秒 lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00
    22时52分27秒 ens33 1.01 1.01 0.06 0.39 0.00 0.00 0.00

    22时52分27秒 IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
    22时52分28秒 lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00
    22时52分28秒 ens33 2.02 1.01 1.25 0.39 0.00 0.00 0.00

    平均时间: IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
    平均时间: lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00
    平均时间: ens33 1.34 1.00 0.45 0.32 0.00 0.00 0.00
    它的输出有两个网卡,一个是lo,另一个是ens33,因为我的系统有两个网卡。第一列是时间。第二列是网卡的名字,rxpck/s是每秒接收到的数据包,txpck/s是每秒发送出去的数据包。rxKB/s是接收到的数据量,txKB/s是发送的数据量,单位都是KB。我们着重看这几个就可以了。

    rxpck/s:如果有一些你不想要的东西向你的网卡发送很多的数据包,他发送很多数据包我们就要接受很多的数据包,数据包量很大的情况下我们的网卡承担不了,最终导致网络堵塞,网站不能打开。如果数据包是几千个,是正常的,如果是上万的,我们就要注意我们的网卡是否被***了。

    如果我们要查看相关历史,加一个选项-f指定一个文件,/var/log/sa/saxx(xx表示文件日期的两位数字),这个文件就是在这个目录下的一个文件,因为我们刚刚装上这个工具,所以只生成了当天的文件,这个文件名字是有规律的是哪一天,他就以那一天的数字作为结尾,这样我们就可以查看历史数据,这个目录下的文件我们可以保留一个月。
    
    我们也可以查看系统负载

    [root@localhost ~]# sar -q 1 3
    Linux 3.10.0-693.el7.x86_64 (localhost.localdomain) 2018年03月06日 _x8664 (1 CPU)

    23时20分26秒 runq-sz plist-sz ldavg-1 ldavg-5 ldavg-15 blocked
    23时20分27秒 1 101 0.00 0.01 0.05 0
    23时20分28秒 1 101 0.00 0.01 0.05 0
    23时20分29秒 1 101 0.00 0.01 0.05 0
    平均时间: 1 101 0.00 0.01 0.05 0
    查看系统负载我们经常是查看历史数据
    [root@localhost ~]# sar -q -f /var/log/sa/saxx

    查看磁盘
    [root@localhost ~]# sar -b 1 3
    Linux 3.10.0-693.el7.x86_64 (localhost.localdomain) 2018年03月06日 _x8664 (1 CPU)

    23时34分40秒 tps rtps wtps bread/s bwrtn/s
    23时34分41秒 0.00 0.00 0.00 0.00 0.00
    23时34分42秒 0.00 0.00 0.00 0.00 0.00
    23时34分43秒 0.00 0.00 0.00 0.00 0.00
    平均时间: 0.00 0.00 0.00 0.00 0.00
    查看磁盘的历史数据
    [root@localhost ~]# sar -b -f /var/log/sa/saxx

    有关sar的所有的历史文件,我们都可以通过-f /var/log/sa/saxx来查看,只要在sar后面加上具体的参数,文件后面的具体日期就可以。
    在/var/log/sa/这个目录下不仅有saxx,还有一个sarxx,这个目录不会当天生成,而是会在第二天生成,他们的区别在于sa是一个二进制文件,不能用cat查看,只能用sar -f去加载查看它,而sarxx是可以用cat查看的。

    监控网卡流量的命令还有一个nload,但是系统中没有这个命令,所以我们要安装这个包,但是安装前我们要先安装epel-releaes这个包。

    安装完后我们直接运行这个命令,运行后就会出现一个动态的显示网卡实时速度的页面。

    Device ens33 [192.168.1.105] (1/2):当前的网卡命和IP,按方向键可以切换出第二个网卡。

    Incoming:

                                                                                                      Curr: 2.09 kBit/s(当前值)
                                                                                                      Avg: 4.87 kBit/s(平均值)
                                                                                                      Min: 944.00 Bit/s(最小值)
                                                                                                      Max: 49.74 kBit/s(最大值)
                                                                                                      Ttl: 8.06 MByte

    Outgoing:

                                                                                                      Curr: 9.77 kBit/s(当前值)
                                                                                                      Avg: 9.16 kBit/s(平均值)
                                                                                                      Min: 3.52 kBit/s最小值)
                                                                                                      Max: 10.48 kBit/s(最大值)
                                                                                                      Ttl: 719.61 kByte

    如果出现***情况,进入的流量就会很大,那么curr(当前值)就会很大,所以我们要多注意。

    转载于:https://blog.51cto.com/13067688/2088730

    展开全文
  • 这时候就需要登录服务器进一步深入分析问题的根源。那么分析问题需要有一定的技术经验积累,并且有些问题涉及到的领域非常广,才能定位到问题。所以,分析问题和踩坑是非常锻炼一个人的成长和提升自我能力。如果我们...

    来源:https://www.jianshu.com/p/0bbac570fa4c

    导读

    有时候会遇到一些疑难杂症,并且监控插件并不能一眼立马发现问题的根源。这时候就需要登录服务器进一步深入分析问题的根源。那么分析问题需要有一定的技术经验积累,并且有些问题涉及到的领域非常广,才能定位到问题。所以,分析问题和踩坑是非常锻炼一个人的成长和提升自我能力。如果我们有一套好的分析工具,那将是事半功倍,能够帮助大家快速定位问题,节省大家很多时间做更深入的事情。

    本篇文章主要介绍各种问题定位的工具以及会结合案例分析问题。

    分析问题的方法论:

    套用5W2H方法,可以提出性能分析的几个问题

    • What-现象是什么样的

    • When-什么时候发生

    • Why-为什么会发生

    • Where-哪个地方发生的问题

    • How much-耗费了多少资源

    • How to do-怎么解决问题

    目录[-]

    1、CPU

    2、内存

    3、磁盘IO

    4、网络

    5、系统负载

    6、火焰图

    7、案例分析

    1、CPU

    1.1 说明

    针对应用程序,我们通常关注的是内核CPU调度器功能和性能。

    线程的状态分析主要是分析线程的时间用在什么地方,而线程状态的分类一般分为:

    a. on-CPU:执行中,执行中的时间通常又分为用户态时间user和系统态时间sys。
    b. off-CPU:等待下一轮上CPU,或者等待I/O、锁、换页等等,其状态可以细分为可执行、匿名换页、睡眠、锁、空闲等状态。

    如果大量时间花在CPU上,对CPU的剖析能够迅速解释原因;如果系统时间大量处于off-cpu状态,定位问题就会费时很多。但是仍然需要清楚一些概念:

    • 处理器

    • 硬件线程

    • CPU内存缓存

    • 时钟频率

    • 每指令周期数CPI和每周期指令数IPC

    • CPU指令

    • 使用率

    • 用户时间/内核时间

    • 调度器

    • 运行队列

    • 抢占

    • 多进程

    • 多线程

    • 字长

    1.2 分析工具

    fc967d479e0bc62d78d0110cb4e80c8a.png

    说明:

    • uptime,vmstat,mpstat,top,pidstat只能查询到cpu及负载的的使用情况。

    • perf可以跟着到进程内部具体函数耗时情况,并且可以指定内核函数进行统计,指哪打哪。

    1.3 使用方式

    //查看系统cpu使用情况
    top

    //查看所有cpu核信息
    mpstat -P ALL 1

    //查看cpu使用情况以及平均负载
    vmstat 1

    //进程cpu的统计信息
    pidstat -u 1 -p pid

    //跟踪进程内部函数级cpu使用情况
    perf top -p pid -e cpu-clock

    2、内存

    2.1 说明

    内存是为提高效率而生,实际分析问题的时候,内存出现问题可能不只是影响性能,而是影响服务或者引起其他问题。同样对于内存有些概念需要清楚:

    • 主存

    • 虚拟内存

    • 常驻内存

    • 地址空间

    • OOM

    • 页缓存

    • 缺页

    • 换页

    • 交换空间

    • 交换

    • 用户分配器libc、glibc、libmalloc和mtmalloc

    • LINUX内核级SLUB分配器

    2.2 分析工具

    00836bcb1b577d0390b335235d3f70c6.png

    说明:

    • free,vmstat,top,pidstat,pmap只能统计内存信息以及进程的内存使用情况。

    • valgrind可以分析内存泄漏问题。

    • dtrace动态跟踪。需要对内核函数有很深入的了解,通过D语言编写脚本完成跟踪。

    2.3 使用方式

    //查看系统内存使用情况
    free -m

    //虚拟内存统计信息
    vmstat 1

    //查看系统内存情况
    top

    //1s采集周期,获取内存的统计信息
    pidstat -p pid -r 1

    //查看进程的内存映像信息
    pmap -d pid

    //检测程序内存问题
    valgrind --tool=memcheck --leak-check=full --log-file=./log.txt  ./程序名

    3、磁盘IO

    3.1 说明

    磁盘通常是计算机最慢的子系统,也是最容易出现性能瓶颈的地方,因为磁盘离 CPU 距离最远而且 CPU 访问磁盘要涉及到机械操作,比如转轴、寻轨等。访问硬盘和访问内存之间的速度差别是以数量级来计算的,就像1天和1分钟的差别一样。要监测 IO 性能,有必要了解一下基本原理和 Linux 是如何处理硬盘和内存之间的 IO 的。

    在理解磁盘IO之前,同样我们需要理解一些概念,例如:

    • 文件系统

    • VFS

    • 文件系统缓存

    • 页缓存page cache

    • 缓冲区高速缓存buffer cache

    • 目录缓存

    • inode

    • inode缓存

    • noop调用策略

    3.2 分析工具

    cafa118aebe182d988cd908e3b329b5d.png

    3.3 使用方式

    //查看系统io信息
    iotop

    //统计io详细信息
    iostat -d -x -k 1 10

    //查看进程级io的信息
    pidstat -d 1 -p  pid

    //查看系统IO的请求,比如可以在发现系统IO异常时,可以使用该命令进行调查,就能指定到底是什么原因导致的IO异常
    perf record -e block:block_rq_issue -ag
    ^C
    perf report

    4、网络

    4.1 说明

    网络的监测是所有 Linux 子系统里面最复杂的,有太多的因素在里面,比如:延迟、阻塞、冲突、丢包等,更糟的是与 Linux 主机相连的路由器、交换机、无线信号都会影响到整体网络并且很难判断是因为 Linux 网络子系统的问题还是别的设备的问题,增加了监测和判断的复杂度。现在我们使用的所有网卡都称为自适应网卡,意思是说能根据网络上的不同网络设备导致的不同网络速度和工作模式进行自动调整。

    4.2 分析工具

    2ce33d45bba00811ce3d3b0ebf4cb4f3.png

    4.3 使用方式

    //显示网络统计信息
    netstat -s

    //显示当前UDP连接状况
    netstat -nu

    //显示UDP端口号的使用情况
    netstat -apu

    //统计机器中网络连接各个状态个数
    netstat -a | awk \\'/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}\\'

    //显示TCP连接
    ss -t -a

    //显示sockets摘要信息
    ss -s

    //显示所有udp sockets
    ss -u -a

    //tcp,etcp状态
    sar -n TCP,ETCP 1

    //查看网络IO
    sar -n DEV 1

    //抓包以包为单位进行输出
    tcpdump -i eth1 host 192.168.1.1 and port 80 

    //抓包以流为单位显示数据内容
    tcpflow -cp host 192.168.1.1

    5、系统负载

    5.1 说明

    Load 就是对计算机干活多少的度量(WikiPedia:the system Load is a measure of the amount of work that a compute system is doing)简单的说是进程队列的长度。Load Average 就是一段时间(1分钟、5分钟、15分钟)内平均Load。

    5.2 分析工具

    06850df684ebc60b2078fef2bd316846.png

    5.3 使用方式

    //查看负载情况
    uptime

    top

    vmstat

    //统计系统调用耗时情况
    strace -c -p pid

    //跟踪指定的系统操作例如epoll_wait
    strace -T -e epoll_wait -p pid

    //查看内核日志信息
    dmesg

    6、火焰图

    6.1 说明

    火焰图(Flame Graph是 Bredan Gregg 创建的一种性能分析图表,因为它的样子近似 ?而得名。

    火焰图主要是用来展示 CPU的调用栈。

    y 轴表示调用栈,每一层都是一个函数。调用栈越深,火焰就越高,顶部就是正在执行的函数,下方都是它的父函数。

    x 轴表示抽样数,如果一个函数在 x 轴占据的宽度越宽,就表示它被抽到的次数多,即执行的时间长。注意,x 轴不代表时间,而是所有的调用栈合并后,按字母顺序排列的。

    火焰图就是看顶层的哪个函数占据的宽度最大。只要有”平顶”(plateaus),就表示该函数可能存在性能问题。颜色没有特殊含义,因为火焰图表示的是 CPU 的繁忙程度,所以一般选择暖色调。

    常见的火焰图类型有On-CPU、Off-CPU、Memory、Hot/Cold、Differential等等。

    6.2 安装依赖库

    //安装systemtap,默认系统已安装
    yum install systemtap systemtap-runtime

    //内核调试库必须跟内核版本对应,例如:uname -r 2.6.18-308.el5
    kernel-debuginfo-2.6.18-308.el5.x86_64.rpm
    kernel-devel-2.6.18-308.el5.x86_64.rpm
    kernel-debuginfo-common-2.6.18-308.el5.x86_64.rpm

    //安装内核调试库
    debuginfo-install --enablerepo=debuginfo search kernel
    debuginfo-install --enablerepo=debuginfo  search glibc

    6.3 安装

    git clone https://github.com/lidaohang/quick_location.git
    cd quick_location

    6.4 CPU级别火焰图

    cpu占用过高,或者使用率提不上来,你能快速定位到代码的哪块有问题吗?
    一般的做法可能就是通过日志等方式去确定问题。现在我们有了火焰图,能够非常清晰的发现哪个函数占用cpu过高,或者过低导致的问题。

    6.4.1 on-CPU

    cpu占用过高,执行中的时间通常又分为用户态时间user和系统态时间sys。

    使用方式:

    //on-CPU user
    sh ngx_on_cpu_u.sh pid

    //进入结果目录
    cd ngx_on_cpu_u

    //on-CPU kernel
    sh ngx_on_cpu_k.sh pid

    //进入结果目录
    cd ngx_on_cpu_k

    //开一个临时端口8088
    python -m SimpleHTTPServer 8088

    //打开浏览器输入地址
    127.0.0.1:8088/pid.svg

    DEMO:

    #include 
    #include 

    void foo3(){
    }

    void foo2(){
      int i;
      for(i=0 ; i 10; i++)
           foo3();
    }

    void foo1(){
      int i;
      for(i = 0; i1000; i++)
         foo3();
    }

    int main(void){
      int i;
      for( i =0; i1000000000; i++) {
          foo1();
          foo2();
      }
    }

    DEMO火焰图:

    538fcae66d9bbd5083d0e8bf2766251a.png

    6.4.2 off-CPU

    cpu过低,利用率不高。等待下一轮CPU,或者等待I/O、锁、换页等等,其状态可以细分为可执行、匿名换页、睡眠、锁、空闲等状态。

    使用方式:

    // off-CPU user
    sh ngx_off_cpu_u.sh pid

    //进入结果目录
    cd ngx_off_cpu_u

    //off-CPU kernel
    sh ngx_off_cpu_k.sh pid

    //进入结果目录
    cd ngx_off_cpu_k

    //开一个临时端口8088
    python -m SimpleHTTPServer 8088

    //打开浏览器输入地址
    127.0.0.1:8088/pid.svg

    官网DEMO:

    6347a9569db337f655fa15bc6eb876b4.png

    6.5 内存级别火焰图

    如果线上程序出现了内存泄漏,并且只在特定的场景才会出现。这个时候我们怎么办呢?有什么好的方式和工具能快速的发现代码的问题呢?同样内存级别火焰图帮你快速分析问题的根源。

    使用方式:

    sh ngx_on_memory.sh pid

    //进入结果目录
    cd ngx_on_memory

    //开一个临时端口8088
    python -m SimpleHTTPServer 8088

    //打开浏览器输入地址
    127.0.0.1:8088/pid.svg

    官网DEMO:

    472cf6fc306e561c132cd2f4f9c5b877.png

    6.6 性能回退-红蓝差分火焰图

    你能快速定位CPU性能回退的问题么?如果你的工作环境非常复杂且变化快速,那么使用现有的工具是来定位这类问题是很具有挑战性的。当你花掉数周时间把根因找到时,代码已经又变更了好几轮,新的性能问题又冒了出来。主要可以用到每次构建中,每次上线做对比看,如果损失严重可以立马解决修复。

    通过抓取了两张普通的火焰图,然后进行对比,并对差异部分进行标色:红色表示上升,蓝色表示下降。差分火焰图是以当前(“修改后”)的profile文件作为基准,形状和大小都保持不变。因此你通过色彩的差异就能够很直观的找到差异部分,且可以看出为什么会有这样的差异。

    使用方式:

    cd quick_location

    //抓取代码修改前的profile 1文件
    perf record -F 99 -p pid -g -- sleep 30
    perf script > out.stacks1

    //抓取代码修改后的profile 2文件
    perf record -F 99 -p pid -g -- sleep 30
    perf script > out.stacks2

    //生成差分火焰图:
    ./FlameGraph/stackcollapse-perf.pl ../out.stacks1 > out.folded1
    ./FlameGraph/stackcollapse-perf.pl ../out.stacks2 > out.folded2
    ./FlameGraph/difffolded.pl out.folded1 out.folded2 | ./FlameGraph/flamegraph.pl > diff2.svg

    DEMO:

    //test.c
    #include 
    #include 

    void foo3(){
    }

    void foo2(){
      int i;
      for(i=0 ; i 10; i++)
           foo3();
    }

    void foo1(){
      int i;
      for(i = 0; i1000; i++)
         foo3();
    }

    int main(void){
      int i;
      for( i =0; i1000000000; i++) {
          foo1();
          foo2();
      }
    }

    //test1.c
    #include 
    #include 

    void foo3(){
    }

    void foo2(){
      int i;
      for(i=0 ; i 10; i++)
           foo3();
    }

    void foo1(){
      int i;
      for(i = 0; i1000; i++)
         foo3();
    }

    void add(){
      int i;
      for(i = 0; i10000; i++)
         foo3();
    }

    int main(void){
      int i;
      for( i =0; i1000000000; i++) {
          foo1();
          foo2();
          add();
      }
    }

    DEMO红蓝差分火焰图:

    5e9b6d10e89148892930dbd4c723f343.png

    7、案例分析

    7.1 接入层nginx集群异常现象

    通过监控插件发现在2017.09.25 19点nginx集群请求流量出现大量的499,5xx状态码。并且发现机器cpu使用率升高,目前一直持续中。

    7.2 分析nginx相关指标

    a) 分析nginx请求流量:

    d32df9db6d757e8286ce894057219f2d.png

    结论:

    通过上图发现流量并没有突增,反而下降了,跟请求流量突增没关系。

    b) 分析nginx响应时间

    6df6425dd77a30c0b1378960c7a0345b.png

    结论:

    通过上图发现nginx的响应时间有增加可能跟nginx自身有关系或者跟后端upstream响应时间有关系。

    c) 分析nginx upstream响应时间

    72d08a86fedfc3eb06ad843080b34716.png

    结论:

    通过上图发现nginx upstream 响应时间有增加,目前猜测可能后端upstream响应时间拖住nginx,导致nginx出现请求流量异常。

    7.3 分析系统cpu情况

    a) 通过top观察系统指标

    top

    939a9e290be0da4aa080911e44a1f627.png

    结论:

    发现nginx worker cpu比较高

    b) 分析nginx进程内部cpu情况

    perf top -p pid

    f1b30d207de826b2d3f8cc50d2d51aea.png

    结论:

    发现主要开销在free,malloc,json解析上面

    7.4 火焰图分析cpua) 生成用户态cpu火焰图

    //test.c
    #include 
    #include 
    //on-CPU user
    sh ngx_on_cpu_u.sh pid

    //进入结果目录
    cd ngx_on_cpu_u

    //开一个临时端口8088
    python -m SimpleHTTPServer 8088

    //打开浏览器输入地址
    127.0.0.1:8088/pid.svg

    2b9fc3f1782ca988214509fc6c3c52be.png

    结论:

    发现代码里面有频繁的解析json操作,并且发现这个json库性能不高,占用cpu挺高。

    7.5 案例总结

    a) 分析请求流量异常,得出nginx upstream后端机器响应时间拉长

    b) 分析nginx进程cpu高,得出nginx内部模块代码有耗时的json解析以及内存分配回收操作

    7.5.1 深入分析

    根据以上两点问题分析的结论,我们进一步深入分析。

    后端upstream响应拉长,最多可能影响nginx的处理能力。但是不可能会影响nginx内部模块占用过多的cpu操作。并且当时占用cpu高的模块,是在请求的时候才会走的逻辑。不太可能是upstram后端拖住nginx,从而触发这个cpu的耗时操作。

    7.5.2 解决方式

    遇到这种问题,我们优先解决已知的,并且非常明确的问题。那就是cpu高的问题。解决方式先降级关闭占用cpu过高的模块,然后进行观察。经过降级关闭该模块cpu降下来了,并且nginx请求流量也正常了。之所以会影响upstream时间拉长,因为upstream后端的服务调用的接口可能是个环路再次走回到nginx。

    - END -

    590542092fd3eb8b961531033883bef6.png

    精彩文章推荐:

    掌握K8s这30个知识点,轻松突破年薪30W!

    10 个Linux Awk文本处理经典案例12年老司机总结的 5 条面试忠告,终身受用一根网线发起的攻击面试官:Redis监控指标有哪些?被遗忘的 10 个Linux命令,很实用!Prometheus 监控系统:30个常见问题部署一套完整的Kubernetes高可用集群

    ec28c3ff3b5074acc5405b94bdf5151c.png

    年轻时偷的懒,迟早是要还的。点亮bc058f15e9ab198dbfffa974ee9f1ea2.gif

    展开全文
  • 怎样彻底清除UniAccess Agent

    千次阅读 2017-04-26 13:14:00
    怎样彻底清除UniAccess Agent作者:chszs。转载需注明。博客主页:http://blog.csdn.net/chszsUniAccess Agent是联软科技公司推出的一款企业网络监控软件。用它能够建立网络准入控制系统以及...1、登录Ubuntu系统...
    怎样彻底清除UniAccess Agent
    作者:chszs。转载需注明。

    博客主页:

    http://blog.csdn.net/chszs
    UniAccess Agent是联软科技公司推出的一款企业网络监控软件。用它能够建立网络准入控制系统以及加强桌面电脑的安全管理。UniAccess Agent是出了名的难以卸载。

    但我无意中发现了卸载UniAccess Agent的好办法。

    1、登录Ubuntu系统,找到C:\Program Files\LeagSoft,删除此文件夹。

    2、重新启动系统。登录Win7。删除机器上的余孽。包含:
    - “開始”菜单上的**企业信息网络接入系统
    - C盘根文件夹下的UniAccessAgentDownloadData
    - C:\Windows\LVAgentPublicSysParkAll文件夹
    - C:\Windows\System32文件夹下的UniAccessAgentUUIDInfo.arc文件
    - 注冊表Regedit,搜索uniaccess,清除对应的键值。

    清除干净后,我心情舒畅极了!


    总结:我的电脑是Ubuntu和Win7双系统,所以实现以上步骤非常轻松。对于单系统的用户,做个Windows或Linux的USB启动盘,一样搞定。

    展开全文
  • SaltStack Event事件系统使用指南

    千次阅读 2017-09-18 01:02:52
    怎样启用和监控事件系统; 配置和启用对主机系统上非Salt活动的监控; 基于事件触发的Salt反应器 Salt Event事件系统有哪些功能: 当用户登录到生产服务器时发送一个文本消息当构建失败时调用报警接口发送通知在产生...
    本文主要内容来自SaltStack官网的英文入门教学文档,适当补充个人实践中的一些知识所形成。

    本指南将主要带大家熟悉以下内容
    • 怎样启用和监控事件系统
    • 配置和启用对主机系统上非Salt活动的监控
    • 基于事件触发的Salt反应器

    1、Salt Event事件系统有哪些功能:
    • 当用户登录到生产服务器时发送一个文本消息
    • 当构建失败时调用报警接口发送通知
    • 在产生未经授权的配置变更时,立即予以恢复
    • 自动化扩展云平台上的资源
    • 监视磁盘,处理器,RAM和其他系统统计信息,并在超出定义阈值时采取措施

    2、观察事件信息
    几乎Salt中各种组件的通信都是基于事件总线实现的。
    可以在Salt Master上面运行以下命令来实时地观察当前事件总线上收到的各种事件信息:
    salt-run state.event pretty=True
    另外打开一个窗口登录Salt Master,执行salt p1 test.ping。上面的监视窗口会输出信息如下:
    20170917195557483110    {
        "_stamp": "2017-09-17T11:55:57.483329",
        "minions": [
            "p1"
        ]
    }
    salt/job/20170917195557483110/new    {
        "_stamp": "2017-09-17T11:55:57.483457",
        "arg": [],
        "fun": "test.ping",
        "jid": "20170917195557483110",
        "minions": [
            "p1"
        ],
        "tgt": "p1",
        "tgt_type": "glob",
        "user": "root"
    }
    salt/job/20170917195557483110/ret/p1    {
        "_stamp": "2017-09-17T11:55:57.645305",
        "cmd": "_return",
        "fun": "test.ping",
        "fun_args": [],
        "id": "p1",
        "jid": "20170917195557483110",
        "retcode": 0,
        "return": true,
        "success": true
    }
    

    事件的格式:
    • 事件标签,salt事件都是以"sat/"打头的,多层级的,层级间使用"/"分隔。在事件标签中往往会包含job ID或minion ID。
    • 事件数据,都会包含一个时间戳以及其它与该事件相关的信息。

    3、自定义事件
    启用附加的Salt事件
    • PRESENCE EVENTS,启用Salt presence事件后,Salt Master将会周期性地向事件总线发出该事件,以探听所有minions的连接就绪状态。需要修改master config配置文件,设置参数presence_events: True
    • SALT STATE EVENTS,启用Salt状态事件后,当Salt状态运行中的每一个功能完成执行后,Salt minion都会发送一个进度事件,需要修改master config配置文件,设置参数state_events: True

    让一个Salt 状态完成时就发送出一个事件
    对于比较复杂的Salt state配置,可能会包含多个状态同步的内容。你可以通过添加fire_event参数,让一个状态同步完成后,发出一个事件通知:
    nano installed:
      pkg.installed:
        - name: nano
        - fire_event: True

    更进一步的,你甚至可以把参数fire_event的值替换为一个自定义的字符串,这时不但会在状态同步完成时发送事件通知,还会把你自定义的这个信息也添加到事件数据中去。
    nano installed:
      pkg.installed:
        - name: nano
       - fire_event: nano/installed
    发送一个自定义的事件
    在一个minion上面执行:
    salt-call event.send /my/test/event '{"data": "my event test"}'
    在Salt Master上可以观察下:
    /my/test/event    {
        "_stamp": "2017-09-17T14:25:16.953828",
        "cmd": "_minion_event",
        "data": {
            "__pub_fun": "event.send",
            "__pub_jid": "20170917222516899269",
            "__pub_pid": 31967,
            "__pub_tgt": "salt-call",
            "data": "my event test"
        },
        "id": "p1",
        "tag": "/my/test/event"
    }
    salt/job/20170917222516965122/ret/p1    {
        "_stamp": "2017-09-17T14:25:16.965923",
        "arg": [
            "/my/test/event",
            "{\"data\": \"my event test\"}"
        ],
        "cmd": "_return",
        "fun": "event.send",
        "fun_args": [
            "/my/test/event",
            "{\"data\": \"my event test\"}"
        ],
        "id": "p1",
        "jid": "20170917222516965122",
        "retcode": 0,
        "return": true,
        "tgt": "p1",
        "tgt_type": "glob"
    }

    4、BEACONS(Salt信标)
    Salt Beacons为监控系统活动并触发报警事件提供了一种解决方案。因为该功能很新,在网上几乎找不到什么中文资料。不过,在各种系统监控平台软件大行其道的今天,谁会在什么场景中使用Salt Beacons功能也存在疑问。
    目前Salt Beacons可以提供的监控能力包括:
    • 文件系统变化
    • 系统负载
    • 服务运行状态
    • shell活动,如用户登录
    • 网络和磁盘使用情况

    启用一个Beacon:
    通常通过在minion的配置文件中放置一个top-level信标部的段落来启用信标功能。
    beacons:
      inotify:
        home/user/importantfile:
          mask:
            - modify
    当beacon结合salt reactor使用时,可能会由reactor引发对minion上配置文件的重新状态同步操作。而这些操作无疑会继续触发beacon的报警事件,进而产生一个环路。为了避免这类问题,一般需要再增加一个控制参数哪下:
    beacons:
      inotify:
        home/user/importantfile:
          mask:
            - modify
          disable_during_state_run: True
    disable_during_state_run: True,在执行状态同步期间,暂停beacon功能。

    设置beacon监视的时间间隔:
    默认为1s,可以使用interval参数人为指定。
    beacons:
      inotify:
        /etc/httpd/conf.d: {}
        /opt: {}
        interval: 5
      load:
        - 1m:
          - 0.0
          - 2.0
        - 5m:
          - 0.0
          - 1.5
        - 15m:
          - 0.1
          - 1.0
        - interval: 10

    下面将一步一步带领大家配置出一个Salt Beacon:
    设置一个beacon,监视一个文件的变化。使用到inotify beacon和python-pyinotify包。
    1)在minion上安装python-pyinotify包
    yum install python-inotify
    同时在master上打开事件观察器:
    salt-run state.event pretty=True

    2)配置一个beacon
    登录minion,编辑/etc/salt/minion文件,增加以下内容:
    beacons:
      inotify:
        /home/vagrant/importantfile:
          mask:
           - modify
    保存并重启salt minion服务:
    service salt-minion restart

    3)测试
    此时上面配置的beacon已经生效,我们可以向被监视的文件中写入内容,同时观察事件总线的信息输出。
    在minion上面执行:
    echo "this is the second testing" >> importantfile
    在master上观察事件总线:
    salt/beacon/cmpp_90/inotify//home/bjywb/importantfile    {
        "_stamp": "2017-09-17T15:10:15.579421",
        "data": {
            "change": "IN_MODIFY",
            "id": "cmpp_90",
            "path": "/home/bjywb/importantfile"
        },
        "tag": "salt/beacon/cmpp_90/inotify//home/bjywb/importantfile"
    }
    注:再结合使用reactor的功能,就可以实现一个自动化地文件变化、发现变更、触发reactor、执行状态同步。以实现对指定配置文件的实时监视和状态控制。

    5、EVENT REACTOR(事件反应器)
    Salt Reactor用于对指定事件做出反应。

    Salt Reactor的配置方法
    通过在master上/etc/salt/master 或 /etc/salt/master.d/reactor.conf中添加一个top-level的reactor段落来使用这一功能。这两个配置文件在使用时只能二选一,因为只允许存在一个reactor的配置段落。
    下图中是三个配置样例,分别是针对minion启动事件、云主机销毁事件、一个自定义事件所设置的salt reactor行为。
    reactor:                           # Salt master config section "reactor"

      - 'salt/minion/*/start':         # Match tag "salt/minion/*/start"
        - /srv/reactor/start.sls        # Things to do when a minion starts
        - /srv/reactor/monitor.sls      # Other things to do

      - 'salt/cloud/*/destroyed':       # Globs can be used to match tags
        - /srv/reactor/destroy/*.sls    # Globs can be used to match file names

      - 'myco/custom/event/tag':       # React to custom event tags
       - salt://reactor/mycustom.sls   # Put reactor files under file_roots
    Reactor配置起来比较简单,它唯一的功能就是建立一个指定的事件标签和一个或多个reactor SLS文件的关联关系。

    需要特别注意的两点:
    • Salt Reactor是单线程运行的,所以需要避免复杂的逻辑或耗时的处理。应该把工作都留给reactor SLS文件去处理,而后者是通过启动独立的进程执行的。
    • Reactor SLS文件支持使用YAML和Jinja,可以引用事件标签和事件数据变量,使用Jinja语法设计处理逻辑。

    一个测试案例:
    在/etc/salt/master中添加一个reactor的测试用例。
    reactor:
      - 'gq/custom/event/tag':
        - salt://reactor/gqcustomevent.sls

    重启master服务:
    systemctl  restart salt-master

    关于REACTOR SLS文件:
    通常放置于/srv/salt/reactors路径下,在格式和语法上都和state sls文件非常相似。
    建议将Salt reactor SLS视为salt和salt-run命令(在master上执行)的入口点,而不是作为Salt state系统(在minion上执行)的入口。

    三种REACTION类型:
    • Remote execution,使用salt命令在目标minion上执行一些操作,包括应用state或highstate状态)
    • Salt Runners,使用salt-run命令执行的一些任务,如利用http runner去调用一个webhook。
    • Wheel,用于管理Salt环境变量、密钥管理或更新配置,如使用salt-key管理认证。

    Remote execution执行模块的使用样例:
    reactor语法格式如下。
    <section id>:
      local.<function>:
        - tgt: <target>
        - arg:
            <arguments>
    注:在功能模块的前面需要以"local"开头,但这么使用的原因目前没有特别的意义。
    如果把下面这个salt远程执行命令写作reactor的话,会是下图的样子:
    salt 'myminion' pkg.install cowsay
    install cowsay on myminion:
      local.pkg.install:
        - tgt: 'myminion'
        - arg:
          - cowsay
    如果想使用更复杂的target匹配规则,可以使用expr_form参数,如下:
    clean_tmp:
      local.cmd.run:
        - tgt: 'os:Ubuntu'
        - expr_form: grain
        - arg:
         - rm -rf /tmp/*
    因为支持Jinja语法,所以也可以通过引用事件数据中的变量来指定target。
    create file on myminion:
     local.cmd.run:
       - tgt: {{ id }}
       - arg:
         - 'touch /tmp/test_file_here'
    调用runner模块和wheel模块的例子:
    clear_the_grains_cache_for_all_minions:
      runner.cache.clear_grains
    webhook1:
      runner.http.query:
        - arg:
          - http://abc.com/path/to/webhook
    accept_new_minion:
      wheel.key.accept:
       - match: {{ data['id'] }}
    更多的使用举例:
    一个响应salt/cloud/*/created事件的reactor。
    new vm alert:
      local.pagerduty.create_event:
        - tgt: minion
        - kwarg:
            description: "New VM {{ data['name'] }}"
            details: "New VM on {{ data['provider'] }}: {{ data['name'] }}"
            service_key: 1162ee51ed6e46239265c969729c48eb
            profile: my-pagerduty-account
    一个响应自定义事件的reactor。
    spam slack:
      local.slack_notify.post_message
        - tgt: buildserver
        - kwarg:
            channel: "Development"
            api_key: peWcBiMOS9HrZG15peWcBiMOS9HrZG15"
            message: "Build {{ data['build_id'] }} finished with status: {{ data['status'] }}"
    一个会调用state状态同步命令的reactor。
    {% if data['id'] == 'mysql1' %}highstate_run:
      local.state.highstate:
        - tgt: mysql1
    {% endif %}

    展开全文
  • 怎样保存sql server profiler的跟踪结果

    千次阅读 2016-06-28 22:20:38
    新同事进来后,为了熟悉公司旧有系统业务,每天用系统登录自己的测试库,玩得不亦乐乎。为了专注地分析各种业务的不同语句,他还在不同的时机暂停和开启profiler的监控,并且保存下来,以便以后查看。那么问题来了,...
  • 展开全部PMP考试涉及到项目启动、2113规划、执行、监控、收5261尾等五大流程4102中的知识技能,同时还考1653察项目管理者对成本管理、预算管理、风险管理等项目管理系统知识,需要在平时进行积累和努力。在做好PMP...
  • 由0晋升200%系统高手

    2008-09-12 16:27:33
    实例3:遭遇系统故障该怎样有效提问(下) 实例4:常见Windows故障消息及解决流程 问答·技巧 第4章 备份与修复 4.1 数据备份 4.1.1 什么情况下需要数据备份 4.1.2 硬盘及分区备份 4.1.3 系统备份 ...
  • 第一部分 ORACLE系统优化基本知识 23 第1章 ORACLE结构回顾 23 §1.1 Oracle数据库结构 23 §1.1.1 Oracle数据字典 23 §1.1.2 表空间与数据文件 24 §1.1.3 Oracle实例(Instance) 24 §1.2 Oracle文件 26 §1.2.1...
  • 怎样获取最新版本?□全新下载:全能优化(Guardio):... 1.添加:系统优化 之 Windows启动优化 之 登录通知,管理Windows登录通知组件;2.添加:系统优化 之 Windows启动优化 之 打印监控,...
  • 然而这次在做4A系统(认证、授权、监控、审计)时,无论怎样都绕不过这一块内容了,于是在仔细研究了一下之前的方案,并参考网上的一些资料后,做了一些改进,特此记录一下。 总体方案 服务端生成RSA密钥对,并将...
  • 多媒体教室

    2013-06-14 08:10:31
    正常条件下,学生机软件只要运行,就会自动登录系统,同时自动检测教师机是否进行操作(如屏幕广播、VCD 广播、屏幕监控、屏幕回放、学生演示、文件分发、黑屏肃静等等)。如正进行以上操作,则学生机自动接收该操作...
  • 附录二:怎样在实时监控界面上实时显示刷卡者照片 112 附录三:如果控制器(门禁主机)和电脑软件通讯不上,怎么查找原因? 113 附录四:如果刷卡不开门怎样查找原因? 116 附录五:如何恢复数据库? 116 附录六:设置...
  • 一般人儿..我可真不告诉他每当系统运行...甚至有一些“大虾”在登录Windows后的第一件事便是打开任务管理器,让它呆在任务栏上,以便随时对其进行“监控”。不管怎样,用好任务管理器是菜鸟们竞升高手的必经之路,本
  • 任务管理器

    2010-11-10 10:51:00
    ...甚至有一些“大虾”在登录Windows后的第一件事便是打开任务管理器,让它呆在任务栏上,以便随时对其进行“监控”。不管怎样,用好任务管理器是菜鸟们竞升高手的必经之路,本文就来介绍一些
  • C#.net_经典编程例子400个

    热门讨论 2013-05-17 09:25:30
    299 7.6 系统监控 299 实例211 检测系统启动模式 300 实例212 内存使用状态监控 301 实例213 监视剪贴板内容 302 7.7 系统软件信息 303 实例214 获取用户名 303 实例215 获取系统...
  • 实例278 系统登录设计 360 实例279 操作员权限设置 362 实例280 自动生成编号 365 实例281 判断输入数据是否符合要求 367 8.7 数据库控件应用 369 实例282 用TDBGrid组件浏览数据库 369 实例283 ...
  • C#开发典型模块大全

    2014-03-12 18:11:22
    8.3.2 系统登录 191 8.3.3 邮件发送实现 192 8.3.4 为邮件上传多个附件 193 8.3.5 邮件接收实现 194 8.3.6 查看邮件详细信息 196 8.3.7 下载附件的实现 197 8.3.8 删除邮件实现 198 8.3.9 用户管理 ...
  • 第1章 窗体与界面设计 1 1.1 菜单应用实例 2 实例001 带历史信息的菜单 2 实例002 菜单动态合并 3 ...实例289 带图像列表的系统登录程序 419 实例290 利用SQL语句执行外围命令 420 实例291 系统初始化 ...
  • delphi 开发经验技巧宝典源码

    热门讨论 2010-08-12 16:47:23
    0223 怎样弹出ConnectionString设置页 148 0224 利用ADO获取DELETE后所影响的记录数 148 7.3 业务实现数据处理技术 149 0225 随机产生中奖号码 149 0226 使用快捷键保存数据 150 0227 密码只允许输入8位...
  • 7.6 系统监控 344 实例250 检测系统启动模式 344 实例251 内存使用状态监控 345 实例252 键盘钩子屏蔽热键 346 实例253 CPU使用率 348 7.7 系统软件信息 350 实例254 获取计算机中已安装的字体 350 实例255 获取...
  • 程序开发范例宝典>>

    2012-10-24 10:41:28
    7.6 系统监控 344 实例250 检测系统启动模式 344 实例251 内存使用状态监控 345 实例252 键盘钩子屏蔽热键 346 实例253 CPU使用率 348 7.7 系统软件信息 350 实例254 获取计算机中已安装的字体 ...
  • C#程序开发范例宝典(第2版).part02

    热门讨论 2012-11-12 07:55:11
    7.6 系统监控 344 实例250 检测系统启动模式 344 实例251 内存使用状态监控 345 实例252 键盘钩子屏蔽热键 346 实例253 CPU使用率 348 7.7 系统软件信息 350 实例254 获取计算机中已安装的字体 350 实例255 ...
  • C#程序开发范例宝典(第2版).part13

    热门讨论 2012-11-12 20:17:14
    7.6 系统监控 344 实例250 检测系统启动模式 344 实例251 内存使用状态监控 345 实例252 键盘钩子屏蔽热键 346 实例253 CPU使用率 348 7.7 系统软件信息 350 实例254 获取计算机中已安装的字体 350 实例255 ...
  • 7.6 系统监控 344 实例250 检测系统启动模式 344 实例251 内存使用状态监控 345 实例252 键盘钩子屏蔽热键 346 实例253 CPU使用率 348 7.7 系统软件信息 350 实例254 获取计算机中已安装的字体 350 实例255 ...
  • 7.6 系统监控 344 实例250 检测系统启动模式 344 实例251 内存使用状态监控 345 实例252 键盘钩子屏蔽热键 346 实例253 CPU使用率 348 7.7 系统软件信息 350 实例254 获取计算机中已安装的字体 350 实例255 ...
  • 4.12.26 用Grid Control监控整个系统 125 第二部分 Oracle Database 11g的体系结构、模式和事务管理 127 第5章 Oracle Database 11g体系结构 128 5.1 Oracle数据库的结构 128 5.1.1 逻辑数据库结构 128 ...
  • 7.6 系统监控 344 实例250 检测系统启动模式 344 实例251 内存使用状态监控 345 实例252 键盘钩子屏蔽热键 346 实例253 CPU使用率 348 7.7 系统软件信息 350 实例254 获取计算机中已安装的字体 350 ...
  • 7.6 系统监控 344 实例250 检测系统启动模式 344 实例251 内存使用状态监控 345 实例252 键盘钩子屏蔽热键 346 实例253 CPU使用率 348 7.7 系统软件信息 350 实例254 获取计算机中已安装的字体 350 ...

空空如也

空空如也

1 2 3
收藏数 47
精华内容 18
关键字:

怎样登录监控系统