概览
参考
命令 | 用处 |
top | CPU的使用率、内存使用率、交换内存使用大小、高速缓存使用大小、缓冲区使用大小,进程PID、所使用命令 |
vmstat | 虚拟内存、内核线程、磁盘、系统进程、I/O 块、中断、CPU 活动 |
lsof | 显示所有打开的文件和进程。打开的文件包括磁盘文件、网络套接字、管道、设备和进程 |
tcpdump | 网络包分析器,捕捉或者过滤网络上指定接口上接收或者传输的TCP/IP包。 |
netstat | 监控进出网络的包和网络接口统计。可以用来监控网络性能 |
htop | 与top相似,特性更丰富【比top多了看内核线程的情况】这个略过 |
iotop | 显示实时磁盘I/O和进程的统计功能。用于查找大量使用磁盘读写的进程 |
iostat | 收集显示系统存储设备输入和输出状态,常用作追踪存储设备的性能。 |
iptraf | iptraf,网络的IP流量监控,包括TCP标记、ICMP详细信息、TCP/UDP流量分离、TCP连接包和字节数.[类似于tcpdump不过有界面] |
monit | 基于 Web 程序的自动监控和管理系统进程、程序、文件、目录、权限、校验文件系统。它监控的服务包括 Apache、MYSQL、Mail、FTP、Nginx 等等。系统状态是可以从命令行或者自己的网络接口来查看。 |
nethogs | 监视每个进程的网络带宽:sent、received |
iftop | iftop监控的是网络的使用情况,两台主机之间当前宽带的使用情况 |
Suricata | 网络安全监控 |
Arpwatch | 监视 Linux 网络的以太网的网络流量的地址解析,随着网络时间戳的变化监视以太网流量和产生日志的 IP 和 MAC 地址对,检测arp攻击 |
cpu、内存、io工具
top
图

| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
1 | 系统时间 | 已运行时间:up | 在线人数:uses | 系统1min、5min、15min的负载 | | | |
2 | 总进程数:total | 正在运行进程数 | 正在睡眠的进程数 | 停止的进程数 | 僵尸进程数 | | |
3 | 用户进程占cpu率:us | 系统占用cpu率:sy | 用户空间改变过优先级的进程cpu占用率:ni | cpu空闲率:id | 等待IO的CPU占用率:wa | 硬中断cpu占用率:hi | 软中断cpu占用率:si |
4 | 内存总量 total | 内存空闲量 | 内存使用量 | 缓存的内存 | | | |
5 | 交换区总量 | 交换区空闲 | 交换区使用量 | | | | |
编号 | 标识 | 含义 |
1 | PID | 进程号 |
2 | USER | 进程创建者 |
3 | PR (Priority) | 实时优先级 |
4 | NI (Nice) | nice值 |
5 | VIRT (Virtual) | 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES |
6 | RES (Restain) | 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA |
7 | SHR (Share) | 共享内存大小,单位kb |
8 | S (State) | 进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程 |
9 | %CPU | 进程占用cpu百分比 |
10 | %MEM | 进程占用内存百分比 |
11 | TIME+ | 进程运行时间 |
12 | COMMAND | 进程名称 |
概念
-
系统负载(load average)
load average数据是每隔5秒钟检查一次活跃的进程数,然后按特定算法计算出的数值。如果这个数除以逻辑CPU的数量,结果高于5的时候就表明系统在超负荷运转了。
-
buffer/cache过高:
buffer指Linux内存的Buffer cache,cache指Linux内存中的Page cache。在当前的内核中,page cache顾名思义就是针对内存页的缓存,说白了就是,如果有内存是以page进行分配管理的,都可以使用page cache作为其缓存来管理使用。
当然,不是所有的内存都是以页(page)进行管理的,也有很多是针对块(block)进行管理的,这部分内存使用如果要用到cache功能,则都集中到buffer cache中来使用。
清缓存必须保证cache中的数据跟对应文件中的数据一致,才能对cache进行释放。**所以伴随着cache清除的行为的,一般都是系统IO飙高。**因为内核要对比cache中的数据和对应硬盘文件上的数据是否一致,如果不一致需要写回,之后才能回收。
手动清空的命令:
echo 1 > /proc/sys/vm/drop_caches
当然,这个文件可以设置的值分别为1、2、3。它们所表示的含义为:
echo 1 > /proc/sys/vm/drop_caches:表示清除pagecache。
echo 2 > /proc/sys/vm/drop_caches:表示清除回收slab分配器中的对象(包括目录项缓存和inode缓存)。slab分配器是内核中管理内存的一种机制,其中很多缓存数据实现都是用的pagecache。
echo 3 > /proc/sys/vm/drop_caches:表示清除pagecache和slab分配器中的缓存对象。
-
swap
内存不够的时候,linux可以将一些不常用的内存swap到硬盘的固定区上,这样能留出内存来。当需要的时候可以再将这些内存在swap进内存。这块空间就是swap分区。
linux系统能用的全部存储空间 是 内存 + swap的大小,也被成为virtual memory
-
res与virt
参考
virt:
1、进程“需要的”虚拟内存大小,包括进程使用的库、代码、数据,以及malloc、new分配的堆空间和分配的栈空间等;
2、假如进程新申请10MB的内存,但实际只使用了1MB,那么它会增长10MB,而不是实际的1MB使用量。
3、VIRT = SWAP + RES
res:
1、进程当前使用的内存大小,包括使用中的malloc、new分配的堆空间和分配的栈空间,但不包括swap out量;
2、包含其他进程的共享;
3、如果申请10MB的内存,实际使用1MB,它只增长1MB,与VIRT相反;
4、关于库占用内存的情况,它只统计加载的库文件所占内存大小。
5、RES = CODE + DATA
堆、栈分配的内存,如果没有使用是不会占用实存的,只会记录到虚存。
如果程序占用res比较多,说明程序申请内存多,实际使用的空间也多。
如果程序占用virt比较多,说明程序申请来很多空间,但是没有使用。
其他
P:以占据CPU百分比排序
M:以占据内存百分比排序
T:以累积占用CPU时间排序
k:终止指定的进程。按下k键-->再输入要杀死的进程的pid-->按enter键-->(选择信号类型,以数字标示,默认15为杀死)本步可省略按enter键(常用为-9)
vmstat
参考
图

man vmstat
Procs
r: The number of processes waiting for run time.
b: The number of processes in uninterruptible sleep.
Memory
swpd: the amount of virtual memory used.
free: the amount of idle memory.
buff: the amount of memory used as buffers.
cache: the amount of memory used as cache.
inact: the amount of inactive memory. (-a option)
active: the amount of active memory. (-a option)
Swap
si: Amount of memory swapped in from disk (/s).
so: Amount of memory swapped to disk (/s).
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: The number of context switches per second.
CPU
These are percentages of total CPU time.
us: Time spent running non-kernel code. (user time, including nice time)
sy: Time spent running kernel code. (system time)
id: Time spent idle. Prior to Linux 2.5.41, this includes IO-wait time.
wa: Time spent waiting for IO. Prior to Linux 2.5.41, included in idle.
st: Time stolen from a virtual machine. Prior to Linux 2.6.11, unknown.
示例
-
us: user load
编解码工作
-
sy: system load
dd if=/dev/urandom of=500MBfile bs=1M count=500
For this, /dev/urandom[2] will supply random numbers, which will be generated by the kernel. This will lead to an increased load on the CPU (sy – system time).
-
so(swap out): RAM瓶颈
内存占满后,再打开文件
-
bi(block input):
高速的IO读。一个大文件,读并写入/dev/null
dd if=bigfile.iso of=/dev/null bs=1M
-
bo(block output)
高速的IO写,大文件写如硬盘
dd if=/dev/zero of=500MBfile bs=1M count=500 oflag=dsync
-
wa(wait)
数据库迁移过程中,所有的文件从文件系统中读取,CPU必须等待IO
lsof
基础
lsof(list open files)是一个查看当前系统文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,该文件描述符提供了大量关于这个应用程序本身的信息。参考
列的含义:
-
FD:文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt等:
(1)cwd:表示current work dirctory,即:应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改
(2)txt :该类型的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的 /sbin/init 程序
(3)lnn:library references (AIX);
(4)er:FD information error (see NAME column);
(5)jld:jail directory (FreeBSD);
(6)ltx:shared library text (code and data);
(7)mxx :hex memory-mapped type number xx.
(8)m86:DOS Merge mapped file;
(9)mem:memory-mapped file;
(10)mmap:memory-mapped device;
(11)pd:parent directory;
(12)rtd:root directory;
(13)tr:kernel trace file (OpenBSD);
(14)v86 VP/ix mapped file;
(15)0:表示标准输入
(16)1:表示标准输出
(17)2:表示标准错误
一般在标准输出、标准错误、标准输入后还跟着文件状态模式:r、w、u等
(1)u:表示该文件被打开并处于读取/写入模式
(2)r:表示该文件被打开并处于只读模式
(3)w:表示该文件被打开并处于
(4)空格:表示该文件的状态模式为unknow,且没有锁定
(5)-:表示该文件的状态模式为unknow,且被锁定
同时在文件状态模式后面,还跟着相关的锁
(1)N:for a Solaris NFS lock of unknown type;
(2)r:for read lock on part of the file;
(3)R:for a read lock on the entire file;
(4)w:for a write lock on part of the file;(文件的部分写锁)
(5)W:for a write lock on the entire file;(整个文件的写锁)
(6)u:for a read and write lock of any length;
(7)U:for a lock of unknown type;
(8)x:for an SCO OpenServer Xenix lock on part of the file;
(9)X:for an SCO OpenServer Xenix lock on the entire file;
(10)space:if there is no lock.
-
TYPE:文件类型,如DIR、REG等,常见的文件类型:
(1)DIR:表示目录
(2)CHR:表示字符类型
(3)BLK:块设备类型
(4)UNIX: UNIX 域套接字
(5)FIFO:先进先出 (FIFO) 队列
(6)IPv4:网际协议 (IP) 套接字
-
DEVICE:指定磁盘的名称
-
SIZE:文件的大小
-
NODE:索引节点(文件在磁盘上的标识)
-
NAME:打开文件的确切名称
lsof命令参数
- -a 列出打开文件存在的进程
- -c<进程名> 列出指定进程所打开的文件
- -g 列出GID号进程详情
- -d<文件号> 列出占用该文件号的进程
- +d<目录> 列出目录下被打开的文件
- +D<目录> 递归列出目录下被打开的文件
- -n<目录> 列出使用NFS的文件
- -i<条件> 列出符合条件的进程。(4、6、协议、:端口、 @ip )
- -p<进程号> 列出指定进程号所打开的文件
- -u 列出UID号进程详情
- -h 显示帮助信息
- -v 显示版本信息
示例
iotop
图

IO列用户展示总的I/O使用率
iotop一般用于追踪进行高磁盘I/O读写的进程
iostat
图

iostat是一个用于收集显示系统存储设备输入和输出状态统计的简单工具。这个工具常常用来追踪存储设备的性能问题,其中存储设备包括设备、本地磁盘,以及诸如使用NFS等的远端磁盘。
iotop是看哪个进程的io、iostat是看哪个磁盘的io。
tps: 每秒钟发送到的I/O请求数.
iostat uses files mentioned below to create the reports:
/proc/stat
Contains the system statistics.
/proc/uptime
Contains the system uptime.
/proc/diskstats
Contains the disks statistics.
/sys
Contains the statistics for block devices.
/proc/self/mountstats
Contains the statistics for network filesystems.
/dev/disk
Contains the persistent device names.
小结
| cpu | 内存 | io |
top | 总cpu+进程cpu | 总内存+进程内存 | 无 |
vmstat | 总cpu | 总内存 | 总io |
iotop | 无 | 无 | 总磁盘io+进程磁盘io |
iostat | 总的cpu | 无 | 各磁盘的io |
lsof | | | 各进程打开文件的情况 |
选择:
top + iotop 基本可以看全 cpu、内存、io的总情况+各进程情况。
lsof比较特殊,可以看文件的打开情况,文件包括网络
网络
tcpdump
参考
用途
tcpdump在tcp协议第一卷中有过详细的描述,它用来捕获、分析网络数据,通常协助分析网络问题以及安全监控。它可以多对个协议进行抓包:ARP、ICMP、UDP、TCP等
tcp报文解析
具体参考tcp协议,这里只对flag进行简单说明:
value | Flag Type | Description |
S | SYN | Connection Start |
F | FIN | Connection Finish |
P | PUSH | Data Push |
R | RESET | Connection reset |
. | ACK | Acknowledgment |
示例
-
查看可用的网卡
sudo tcpdump -D
-
查看所用网卡的包,个数5个
sudo tcpdump -i any -c 5
-i = --interface,any指的是所有网卡,也可以指定某个网卡
-c (count),指的是5个包
-
ip与端口的方式
sudo tcpdump -i any -c5 -nn
-
只抓某种协议的包
sudo tcpdump -i any -c5 icmp
-
指定某个ip与port的包
host = src + dst
sudo tcpdump -i any -c5 -nn host 54.204.39.132
sudo tcpdump -i any -c5 -nn src 54.204.39.132
sudo tcpdump -i any -c5 -nn dst 54.204.39.132
sudo tcpdump -i any -c5 -nn port 80
sudo tcpdump -i any -c5 -nn host 54.204.39.132 and port 80
-
查看抓包的详细数据
sudo tcpdump -i any -c10 -nn -A port 80
-A是以ASCII码的形式查看,包中数据的内容,-X是按hex二进制的方式。
这种比较适合抓http的包
sudo tcpdump -i any -nn -A port 80
-
将抓到的包写到文件中
sudo tcpdump -i any -c10 -nn -w webserver.pcap port 80
netstat
用途
查看机器创建的连接,以及连接的状态
示例
nethogs
用途
以上两个工具都是以连接为视角的,tcpdump是抓包,netstat是看状态与统计。nethogs是以进程为视角,监视每个进程的网络带宽:sent、received。
参数也比较简单,如下图:

Program是哪个进程, DEV是哪个网关。
iftop
图

iftop -i any -n
参数含义与tcpudump的类似,-i表示interface -n表示不要dns
用于监控连接的带宽
TX:发送流量
RX:接收流量
TOTAL:总流量
Cumm:运行iftop到目前时间的总流量
peak:流量峰值
rates:分别表示过去 2s 10s 40s 的平均流量,每条连接后边3个数字也是这个意思。
小结
工具 | 功能 |
tcpdump | 网络抓包工具,可以分析哪个连接发送的内容 |
netstat | 当前各网络连接的状态 |
nethogs | 进程的网络带宽 |
iftop | 连接带宽 |
总结
指标
根据梳理的这些内容,大体可以明白这些
cpu指标:总占用率、us、sy、wa等指标
memory指标:total = free + userd + cache/buffer;virt、res
disk指标:硬盘的读写带宽
net指标:连接状态、带宽
ps: io = disk + char + net
memory中溢写到disk 是swap (so、si)
disk直接写到disk是(bo、bi)
分类