浅谈linux下监控系统资源的几种工具


浅谈linux下监控系统资源的几种工具用法

  • 系统资源输出参数
  • TOP工具
  • dstat工具
  • lsof工具

系统资源输出参数 ??系统资源输出参数多如牛毛,把大部分常用参数的含义整理如下
  • Procs
    r (The number of processes waiting for run time)等待运行的进程数。如果等待运行的进程数越多,意味着CPU非常繁忙。另外,如果该参数长期大于和等于逻辑cpu个数,则CPU资源可能存在较大的瓶颈。
    b (The number of processes in uninterruptible sleep)处在非中断睡眠状态的进程数。意味着进程被阻塞。主要是指被资源阻塞的进程对列数(比如IO资源、页面调度等),当这个值较大时,需要根据应用程序来进行分析,比如数据库产品,中间件应用等。
  • Memory
    swpd (the amount of virtual memory used)已使用的虚拟内存大小。如果虚拟内存使用较多,可能系统的物理内存比较吃紧,需要采取合适的方式来减少物理内存的使用。swapd不为0,并不意味物理内存吃紧,如果swapd没变化,si、so的值长期为0,这也是没有问题的
    free (the amount of idle memory)空闲的物理内存的大小,free很小并不代表内存不足,这是linux的优越性,大量的buffers和cache也属于可用内存的一部分。
    buff (the amount of memory used as buffers)用来做buffer(缓存,主要用于块设备缓存)的内存数,单位:KB
    cache (the amount of memory used as cache)用来做cache(缓存,主要用于缓存文件)的内存,单位:KB
    inact (the amount of inactive memory.要用 vmstat -a),inactive memory的总量(长时间未访问过的页面放进inactive list,该值大表明在必要时可以回收的页面很多)
    active (the amount of active memory.要用vmstat -a),active memroy的总量(刚访问过的页面放进active list,无法马上回收,只能通过与文件或交换区进行页交换)
  • Swap
    si {Amount of memory swapped in from disk (/s)},从磁盘交换到内存的交换页数量,单位:KB/秒。
    so {Amount of memory swapped to disk (/s)},从内存交换到磁盘的交换页数量,单位:KB/秒
    备注: 内存够用的时候,这2个值都是0,如果这2个值长期大于0时,系统性能会受到影响,磁盘IO和CPU资源都会被消耗。当看到空闲内存(free)很少的或接近于0时,就认为内存不够用了,这个是不正确的。不能光看这一点,还要结合si和so,如果free很少,但是si和so也很少(大多时候是0),那么不用担心,系统性能这时不会受到影响的。
    当内存的需求大于RAM的数量,服务器启动了虚拟内存机制,通过虚拟内存,可以将RAM段移到SWAP DISK的特殊磁盘段上,这样会 出现虚拟内存的页导出和页导入现象,页导出并不能说明RAM瓶颈,虚拟内存系统经常会对内存段进行页导出,但页导入操作就表明了服务器需要更多的内存了, 页导入需要从SWAP DISK上将内存段复制回RAM,导致服务器速度变慢。
  • IO
    bi {Blocks received from a block device (blocks/s)},每秒从块设备接收到的块数,单位:块/秒 也就是读块设备。
    bo {Blocks sent to a block device (blocks/s)},每秒发送到块设备的块数,单位:块/秒 也就是写块设备。
  • System
    in (The number of interrupts per second, including the clock)每秒的中断数,包括时钟中断。与cs一般同步增长。in和cs两值越大,会看到由内核消耗的CPU时间(sy)也会越大。
    cs (The number of context switches per second),每秒的环境(上下文)切换次数。比如我们调用系统函数,就要进行上下文切换,而过多的上下文切换会浪费较多的cpu资源,这个数值应该越小越好,如果太大了,要考虑调低线程或者进程的数目,例如apache和nginx这种web服务进程。
  • CPU:These are percentages of total CPU time.
    us {Time spent running non-kernel code.(user time, including nice time)},用户CPU时间(非内核进程占用时间)(单位为百分比)。 us的值比较高时,说明用户进程消耗的CPU时间多。
    sy {Time spent running kernel code. (system time)},系统使用的CPU时间(单位为百分比)。sy的值高时,说明系统内核消耗的CPU资源多,这并不是良性表现,我们应该检查原因。
    id {Time spent idle. Prior to Linux 2.5.41, this includes IO-wait time.},空闲的CPU的时间(百分比),在Linux 2.5.41之前,这部分包含IO等待时间。
    wa (Time spent waiting for IO. Prior to Linux 2.5.41, shown as zero.),等待IO的CPU时间,在Linux 2.5.41之前,这个值为0 .这个指标意味着CPU在等待硬盘读写操作的时间,用百分比表示。wait越大则机器io性能就越差。说明IO等待比较严重,这可能由于磁盘大量作随机访问造成,也有可能磁盘出现瓶颈(块操作)。
    st (Time stolen from a virtual machine),针对虚拟技术,如果st不为0,说明本来分配给本机的CPU时间被其他虚拟机偷走了。
TOP工具 ??top命令可以实时动态地查看系统的整体运行情况,是一个综合了多方信息监测系统性能和运行信息的实用工具。通过top命令所提供的互动式界面,用热键可以管理。
??htop命令是top工具的一个变种,一个 Linux 下的交互式的进程浏览器可以用来替换Linux下的top命令。
浅谈linux下监控系统资源的几种工具
文章图片

用法帮助如下
浅谈linux下监控系统资源的几种工具
文章图片

dstat工具 ??dstat命令 是一个用来替换vmstat、iostat、netstat、nfsstat和ifstat这些命令的工具,是一个全能系统信息统计工具。与sysstat相比,dstat拥有一个彩色的界面,在手动观察性能状况时,数据比较显眼容易观察;而且dstat支持即时刷新,譬如输入 dstat 3 即每三秒收集一次,但最新的数据都会每秒刷新显示。和sysstat相同的是,dstat也可以收集指定的性能资源,譬如 dstat -c 即显示CPU的使用情况。
dstat的基本用法就是输入dstat命令,输出如下:
浅谈linux下监控系统资源的几种工具
文章图片

常用参数如下
-c:显示CPU系统占用,用户占用,空闲,等待,中断,软件中断等信息。 -C:当有多个CPU时候,此参数可按需分别显示cpu状态,例:-C 0,1 是显示cpu0和cpu1的信息。 -d:显示磁盘读写数据大小。 -D hda,total:include hda and total。 -n:显示网络状态。 -N eth1,total:有多块网卡时,指定要显示的网卡。 -l:显示系统负载情况。 -m:显示内存使用情况。 -g:显示页面使用情况。 -p:显示进程状态。 -s:显示交换分区使用情况。 -S:类似D/N。 -r:I/O请求情况。 -y:系统状态。 --ipc:显示ipc消息队列,信号等信息。 --socket:用来显示tcp udp端口状态。 -a:此为默认选项,等同于-cdngy。 -v:等同于 -pmgdsc -D total。 --output 文件:此选项也比较有用,可以把状态信息以csv的格式重定向到指定的文件中,以便日后查看。例:dstat --output /root/dstat.csv & 此时让程序默默的在后台运行并把结果输出到/root/dstat.csv文件中。

  • 示例:监控swap,process,sockets,filesystem并显示监控的时间:
    命令:dstat -tsp --socket --fs
    浅谈linux下监控系统资源的几种工具
    文章图片

    将结果输出到文件可以加–output filename,这样生成的csv文件可以用excel打开,然后生成图表.
    浅谈linux下监控系统资源的几种工具
    文章图片

  • 通过dstat --list可以查看dstat能使用的所有参数,其中上面internal是dstat本身自带的一些监控参数,下面/usr/share/dstat中是dstat的插件,这些插件可以扩展dstat的功能,如可以监控电源(battery)、mysql等
dstat --list internal: epoch, epoch-adv, time, time-adv /etc/pcp/dstat: aio, cpu, cpu-adv, cpu-use, disk, disk-avgqu, disk-avgrq, disk-svctm, disk-tps, disk-util, disk-wait, entropy, freespace, fs, int, io, ipc, load, lock, mem, mem-adv, memcache, net, net-packets, nfs3, nfs3-ops, nfs4, nfs4-ops, nfsd3, nfsd3-ops, nfsd4, nfsd4-ops, page, postfix, proc, proc-count, raw, redis, rpc, rpcd, socket, socket6, swap, sys, tcp, udp, unix, utmp, vm, vm-adv

lsof工具 ??lsof命令 用于查看你进程开打的文件,打开文件的进程,进程打开的端口(TCP、UDP)。找回/恢复删除的文件。是十分方便的系统监视工具,因为 lsof 命令需要访问核心内存和各种文件,所以需要root用户执行。
在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。
  • 选项参数如下:
-a:列出打开文件存在的进程; -c<进程名>:列出指定进程所打开的文件; -g:列出GID号进程详情; -d<文件号>:列出占用该文件号的进程; +d<目录>:列出目录下被打开的文件; +D<目录>:递归列出目录下被打开的文件; -n<目录>:列出使用NFS的文件; -i<条件>:列出符合条件的进程。(4、6、协议、:端口、 @ip ) -p<进程号>:列出指定进程号所打开的文件; -u:列出UID号进程详情; -h:显示帮助信息; -v:显示版本信息。

  • 示例如下图:
    浅谈linux下监控系统资源的几种工具
    文章图片
  • lsof输出各列信息的意义如下:
COMMAND:进程的名称 PID:进程标识符 PPID:父进程标识符(需要指定-R参数) USER:进程所有者 PGID:进程所属组 FD:文件描述符,应用程序通过文件描述符识别该文件。

  • 文件描述列表
cwd:表示current work dirctory,即:应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改 txt:该类型的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的 /sbin/init 程序 lnn:library references (AIX); er:FD information error (see NAME column); jld:jail directory (FreeBSD); ltx:shared library text (code and data); mxx :hex memory-mapped type number xx. m86:DOS Merge mapped file; mem:memory-mapped file; mmap:memory-mapped device; pd:parent directory; rtd:root directory; tr:kernel trace file (OpenBSD); v86VP/ix mapped file; 0:表示标准输出 1:表示标准输入 2:表示标准错误

  • 一般在标准输出、标准错误、标准输入后还跟着文件状态模式:
u:表示该文件被打开并处于读取/写入模式。 r:表示该文件被打开并处于只读模式。 w:表示该文件被打开并处于。 空格:表示该文件的状态模式为unknow,且没有锁定。 -:表示该文件的状态模式为unknow,且被锁定。

  • 同时在文件状态模式后面跟着相关的锁
N:for a Solaris NFS lock of unknown type; r:for read lock on part of the file; R:for a read lock on the entire file; w:for a write lock on part of the file; (文件的部分写锁) W:for a write lock on the entire file; (整个文件的写锁) u:for a read and write lock of any length; U:for a lock of unknown type; x:for an SCO OpenServer Xenix lock on partof the file; X:for an SCO OpenServer Xenix lock on theentire file; space:if there is no lock.

  • TYPE-文件类型
DIR:表示目录。 CHR:表示字符类型。 BLK:块设备类型。 UNIX: UNIX 域套接字。 FIFO:先进先出 (FIFO) 队列。 IPv4:网际协议 (IP) 套接字。 DEVICE:指定磁盘的名称 SIZE:文件的大小 NODE:索引节点(文件在磁盘上的标识) NAME:打开文件的确切名称

常见的示例如下:
查看由登陆用户启动而非系统启动的进程:lsof /dev/pts/1
指定进程号,可以查看该进程打开的文件:lsof -p 9527
查看指定程序打开的文件:lsof -c httpd
查看指定用户打开的文件:lsof -u root | more
查看指定目录下被打开的文件:lsof +D /var/log/ 参数+D为递归列出目录下被打开的文件 lsof +d /var/log/ 参数+d为列出目录下被打开的文件
查看所有网络连接:lsof -i -n,lsof -i @ 127.0.0.1
  • 通过参数-i查看网络连接的情况,包括连接的ip、端口等以及一些服务的连接情况,例如:sshd等。也可以通过指定ip查看该ip的网络连接情况
查看端口连接情况:lsof -i :80 -n
  • 通过参数-i:端口可以查看端口的占用情况,-i参数还有查看协议,ip的连接情况等
查看指定进程打开的网络连接:lsof -i –n -a -p 9527
  • 参数-i、-a、-p等,-i查看网络连接情况,-a查看存在的进程,-p指定进程
lsof -i -a -n -p 4728 COMMANDPID USERFDTYPE DEVICE SIZE/OFF NODE NAME sshd4728 root5uIPv4766760t0TCP 192.168.39.11:ssh->192.168.39.100:49281 (ESTABLISHED) sshd4728 root16uIPv6767690t0TCP [::1]:x11-ssh-offset (LISTEN) sshd4728 root17uIPv4767700t0TCP 127.0.0.1:x11-ssh-offset (LISTEN)

查看指定状态的网络连接:lsof -n -P -i TCP -s TCP:ESTABLISHED
  • -n:no host names, -P:no port names,-i TCP指定协议,-s指定协议状态通过多个参数可以清晰的查看网络连接情况、协议连接情况等
lsof -n -P -i TCP -s TCP:ESTABLISHED COMMANDPID USERFDTYPE DEVICE SIZE/OFF NODE NAME sshd4726 root5uIPv4766760t0TCP 192.168.39.11:22->192.168.39.100:49281 (ESTABLISHED) sshd4728 root5uIPv4766760t0TCP 192.168.39.11:22->192.168.39.100:49281 (ESTABLISHED) sshd4751 root5uIPv4768090t0TCP 192.168.39.11:22->192.168.39.100:49282 (ESTABLISHED) sshd4753 root5uIPv4768090t0TCP 192.168.39.11:22->192.168.39.100:49282 (ESTABLISHED)

【浅谈linux下监控系统资源的几种工具】通过日志文件恢复文件
lsof |grep /var/log/messages rm -f /var/log/messages lsof |grep /var/log/messages cat /proc/653/fd/6 cat /proc/653/fd/6 > /var/log/messages

完 毕

    推荐阅读