1. top:实时显示系统中各个进程的资源占用情况,包括 CPU、内存等。

  2. htop:功能比 top更强大的交互式进程查看器。

  3. pidstat:查找进程级别的性能问题。

  4. vmstat:显示虚拟内存、进程、CPU 等的统计信息。

  5. iostat:报告 CPU 和磁盘 I/O 的统计信息。

  6. sar:收集、报告和保存系统活动信息。

  7. netstat:显示网络连接、路由表、接口统计等信息。

  8. ssnetstat 的替代工具,功能更强大,用于显示套接字统计信息,可以显示系统的详细网络连接信息。

  9. lsof:列出打开的文件和进程。

  10. dstat: 可以同时查看 CPU、内存、网络、磁盘的使用情况,适合实时监控。

  11. free:显示系统内存的使用情况。

  12. perf: 可以用于分析系统的性能瓶颈,包括 CPU、内存、I/O 等方面。

top

top命令是动态显示系统中各个进程的资源占用情况的工具。

显示内容包括:

  • 系统当前时间、运行时间、登录用户数、系统平均负载。

  • 进程列表,包括进程 ID(PID)、用户、CPU 占用率、内存占用率、虚拟内存大小等信息。

常用选项:

  • top -d [秒数]:设置刷新时间间隔,例如top -d 5表示每 5 秒刷新一次。

  • top -p [进程 ID]:只显示指定进程的信息。

[root@VM-8-13-opencloudos ~]# top
top - 14:22:51 up 60 days, 15:39, 14 users,  load average: 0.11, 0.03, 0.01
Tasks: 218 total,   1 running, 217 sleeping,   0 stopped,   0 zombie
%Cpu(s):  1.6 us,  0.0 sy,  0.0 ni, 98.4 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :   7695.7 total,   1042.4 free,   2143.8 used,   4509.5 buff/cache
MiB Swap:      0.0 total,      0.0 free,      0.0 used.   4979.6 avail Mem

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
      1 root      20   0  252876  12892   8884 S   0.0   0.2   2:52.03 systemd
      2 root      20   0       0      0      0 S   0.0   0.0   0:02.22 kthreadd
      3 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 rcu_gp
      4 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 rcu_par_gp
      6 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 kworker/0:0H-kblockd
      8 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 mm_percpu_wq
      9 root      20   0       0      0      0 S   0.0   0.0   0:49.36 ksoftirqd/0
     10 root      20   0       0      0      0 I   0.0   0.0  54:52.24 rcu_sched
     11 root      rt   0       0      0      0 S   0.0   0.0   0:32.58 migration/0
     13 root      20   0       0      0      0 S   0.0   0.0   0:00.00 cpuhp/0
     14 root      20   0       0      0      0 S   0.0   0.0   0:00.00 cpuhp/1
     15 root      rt   0       0      0      0 S   0.0   0.0   0:33.73 migration/1
     16 root      20   0       0      0      0 S   0.0   0.0   0:37.79 ksoftirqd/1
     18 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 kworker/1:0H-kblockd
     19 root      20   0       0      0      0 S   0.0   0.0   0:00.00 cpuhp/2
     20 root      rt   0       0      0      0 S   0.0   0.0   0:33.06 migration/2

top 显示的第一部分为系统的概览信息,包含以下几行:

  • 第一行:系统时间、运行时间、在线用户数量、系统负载平均值。

  • load average 后的三个数字分别表示系统在过去 1 分钟、5 分钟、15 分钟的负载平均值。较高的负载平均值可能表示系统资源紧张。

  • 第二行:任务(Tasks)信息

  • total:总任务数(进程数)。

  • running:正在运行的进程数。

  • sleeping:睡眠状态的进程数。

  • stopped:停止状态的进程数。

  • zombie:僵尸进程数。

  • 第三行:CPU 使用情况

  • %us:用户空间的 CPU 使用率。

  • %sy:内核空间(系统)的 CPU 使用率。

  • %ni:修改过优先级的用户进程的 CPU 使用率。

  • %id:CPU 空闲率。

  • %wa:IO 等待的 CPU 使用率。

  • %hi:硬中断占用的 CPU 使用率。

  • %si:软中断占用的 CPU 使用率。

  • %st:虚拟机被抢占的 CPU 使用率。

  • 第四行:内存使用情况(Mem)

  • total:总内存。

  • free:空闲内存。

  • used:已用内存。

  • buff/cache:用于缓冲和缓存的内存。

  • 第五行:交换分区使用情况(Swap)

  • total:总交换空间。

  • free:空闲交换空间。

  • used:已用交换空间。

  • avail Mem:可用内存量,包括未使用的物理内存和可被缓存回收的内存。

进程信息(底部表格区域)

top 显示的下半部分,是各个进程的详细信息表。默认包含以下字段:

  • PID:进程 ID。

  • USER:运行该进程的用户。

  • PR:优先级(Priority)。值越小优先级越高。

  • NI:Nice 值,用来调整进程的优先级。

  • VIRT:虚拟内存使用量,包括进程使用的物理内存和交换空间。

  • RES:驻留内存(Resident memory),即实际使用的物理内存量。

  • SHR:共享内存大小。

  • S:进程状态。

  • R:运行状态。

  • S:睡眠状态。

  • D:不可中断睡眠状态。

  • Z:僵尸进程。

  • T:停止状态。

  • %CPU:进程的 CPU 使用率。

  • %MEM:进程的内存使用率。

  • TIME+:进程使用的总 CPU 时间。

  • COMMAND:启动进程的命令名称。

常用操作键

top 界面下,可以使用以下按键来调整显示内容:

  • M:按内存使用率排序。

  • P:按 CPU 使用率排序。

  • T:按时间排序。

  • k:终止一个进程(输入进程 PID)。

  • r:调整进程优先级(输入进程 PID)。

  • q:退出 top

  • h:查看帮助。

perf top

类似于top,能够显示占用CPU时钟最多的函数或者指令,可以用来查找热点函数

htop

htop命令 是Linux系统中的一个互动的进程查看器,一个文本模式的应用程序(在控制台或者X终端中),需要ncurses。

与Linux传统的top相比,htop更加人性化。它可让用户交互式操作,支持颜色主题,可横向或纵向滚动浏览进程列表,并支持鼠标操作。

与top相比,htop有以下优点:

  • 可以横向或纵向滚动浏览进程列表,以便看到所有的进程和完整的命令行。

  • 在启动上,比top 更快。

  • 杀进程时不需要输入进程号。

  • htop 支持鼠标操作。

  • 两者相比起来,top比较繁琐。

top缺点:

  • 只支持键盘操作。

  • 显示也单调。

htop 官网:http://htop.sourceforge.net/

htop 安装

在大多数的 Linux 发行版中你不会找到预安装的 htop,但作为最流行的实用程序之一,你会在几乎每个 Linux 发行版的默认存储库中找到 htop

因此,如果你的机器是基于 Debian/Ubuntu 驱动的,则以下命令应该可以完成你的工作:

sudo apt install htop

类似的,如果你使用的是 Fedora,则可以使用以下的命令:

sudo dnf install htop

如果你使用的是 CentOS 或 RedHat 则可以使用以下的命令:

sudo yum install htop

如果你想避免从源代码构建包,还有一个 Snap 包可用:

sudo snap install htop

如果你使用的是其它的发行版或者想从源代码构建,你可以使用 wget 下载并安装: 这需要你下载并安装 wget cmake

wget https://link.zhihu.com/?target=https%3A//hisham.hm/htop/releases/2.2.0/htop-2.2.0.tar.gz

tar -zxvf htop-2.2.0.tar.gz

cd htop-2.2.0/

./configure

make

make install

当然你也可以随时参考你可以随时参考 htop 的 GitHub 页面以获得详细说明。

说明:htop源码安装方式默认安装到 /usr/local 目录下,如果想安装到其它路径,在执行 configure 时通过 —prefix 指定,格式为:./configure --prefix=/some/path

语法

htop

参数

-C --no-color               使用单色配色方案
-d --delay=DELAY            设置更新之间的延迟,在十秒
-s --sort-key=COLUMN        纵列排序(try --sort-key=help for a list)
-u --user=USERNAME          只显示一个指定用户的进程
-p --pid=PID,[,PID,PID...]  只显示给用户
-h --help                   打印此命令帮助
-v --version                打印版本信息

参数示例

  • -C 选项:设置界面为无颜色。

  • -d 选项 : 设置刷新时间,单位为秒。如,htop -d 10命令会每10秒刷新一次。

  • -s 选项 : 按指定的列排序。如,htop -s PID命令会按PID 列的大小排序来显示。

  • -u 选项 : 显示指定的用户的进程信息。如,htop -u test命令会只显示出用户名为test的相关进程。

选项

h,?     F1:查看htop使用说明
S       F2:设置
/       F3:搜索进程
\       F4:过滤器,按关键字搜索
t       F5:显示树形结构
<,>     F6:选择排序方式
[       F7:减少nice值,这样就可以提高对应进程的优先级
]       F8:增加nice值,这样可以降低对应进程的优先级
k       F9:杀掉选中的进程
q       F10:退出htop


/ : 搜索字符
h : 显示帮助
l : 显示进程打开的文件: 如果安装了lsof,按此键可以显示进程所打开的文件
u : 显示所有用户,并可以选择某一特定用户的进程
U : 取消标记所有的进程
s : 将调用strace追踪进程的系统调用
t : 显示树形结构

H:显示/隐藏用户线程
I:倒转排序顺序
K:显示/隐藏内核线程    
M:按内存占用排序
P:按CPU排序    
T:按运行时间排序

上下键或PgUP, PgDn : 移动选中进程  
左右键或Home, End : 移动列表  
Space(空格) : 标记/取消标记一个进程。命令可以作用于多个进程,例如 "kill",将应用于所有已标记的进程

Htop设定

鼠标点击Setup或者按下F2 之后进入htop 设定的页面

1. Meters

设定顶端的 显示信息,分为左右两侧,Left column 表示左侧的显示的信息,Right column表示右侧显示的信息,如果要新加选项,可以选择Available meters添加,F5新增到上方左侧,F6新增到上方右侧。Left column和Right column下面的选项,可以选定信息的显示方式,有LED、Bar(进度条)、Text(文本模式),可以根据个人喜好进行设置

2. Display options

选择要显示的内容,按空格 x表示显示,选择完后,按F10保存

3. Colors

设定界面以什么颜色来显示,个人认为用处不大,各人喜好不同

4. Colums

作用是增加或取消要显示的各项内容,选择后F7(向上移动)、F8(向下移动)、F9(取消显示、F10(保存更改))此处增加了PPID、PGRP,根据各人需求,显示那些信息。

F3 搜索进程

在界面下按F3或直接输入”/”就可以直接进入搜索模式,是按照进程名进行搜索的,搜索到的进程会用设定的颜色标记出来,方便查看。

F4:过滤器

相当于模糊查找,不区分大小写,下方输入要搜索的内容后,则界面只显示搜索到的内容,更加方便查看

F5:以树形方式显示

F6:排序方式

按下F6后会跳转至以树形方式显示界面,让您选择以什么方式进行排序,在Sort by下选择您要以什么来排序

F7,F8:调整进程nice值

F7表示减小nice值(增大优先级),F8增大nice值(减小优先级),选择某一进程,按F7或F8来增大或减小nice值,nice值范围为-20-19

F9:杀死进程

选择某一进程按F9即可杀死此进程,很方便

F10:退出htop

pidstat

pidstatsysstat 软件包中的一个工具,用于收集各个进程的统计数据,帮助分析系统性能瓶颈。它可以监控 CPU、内存、I/O、任务切换等多个方面的使用情况,适合查找进程级别的性能问题。

基本语法

bash


复制代码
pidstat [选项] [时间间隔] [次数]
  • 时间间隔:两次采样之间的时间间隔(单位为秒)。

  • 次数:数据采样的次数。

常用选项

  • -u:显示每个进程的 CPU 使用情况(默认)。

  • -r:显示每个进程的内存使用情况。

  • -d:显示每个进程的 I/O 使用情况。

  • -w:显示每个进程的任务切换情况。

  • -p [PID]:只显示指定进程的统计信息。

  • -t:显示线程级别的数据(适用于多线程程序)。

  • -h:不显示头部信息。

常用实例

1. 显示每个进程的 CPU 使用情况

这是 pidstat 的默认行为,可以监控系统中所有进程的 CPU 使用率:

bash


复制代码
pidstat 2 5

上面的命令每隔 2 秒显示一次 CPU 使用情况,共显示 5 次。

2. 查看特定进程的 CPU 使用情况

使用 -p 选项指定某个进程 ID,例如进程 ID 为 1234:

bash


复制代码
pidstat -p 1234 2 5

3. 查看每个进程的内存使用情况

使用 -r 选项查看内存使用情况,包括虚拟内存和常驻内存等:

bash


复制代码
pidstat -r 2 5

4. 查看每个进程的 I/O 使用情况

使用 -d 选项查看 I/O 情况,包括块读取、块写入、块重写等指标:

bash


复制代码
pidstat -d 2 5

5. 查看任务切换情况

使用 -w 选项查看任务切换的情况,包含自愿和非自愿切换的次数:

bash


复制代码
pidstat -w 2 5

6. 查看线程级别的 CPU 使用情况

使用 -t 选项查看线程级别的统计信息,适用于多线程应用:

bash


复制代码
pidstat -t -p 1234 2 5

7. 实时监控特定进程的多项指标

可以组合多个选项来同时查看某进程的多个性能指标,比如 CPU、内存和 I/O 使用情况:

bash


复制代码
pidstat -urd -p 1234 2 5

输出解读

每个选项下的输出都会包含特定的统计信息。以 -u 为例,输出字段包括:

  • UID:用户 ID。

  • PID:进程 ID。

  • %usr:在用户空间使用的 CPU 百分比。

  • %system:在内核空间使用的 CPU 百分比。

  • %CPU:进程的总 CPU 使用百分比。

其他选项(如 -r-d)的输出字段会有所不同,具体取决于统计的内容。

vmstat

vmstat命令 的含义为显示虚拟内存状态(“Viryual Memor Statics”),但是它可以报告关于进程、内存、I/O等系统整体运行状态。

语法

vmstat(选项)(参数)

选项

-a:显示活动内页;
-f:显示启动后创建的进程总数;
-m:显示slab信息;
-n:头信息仅显示一次;
-s:以表格方式显示事件计数器和内存状态;
-d:报告磁盘状态;
-p:显示指定的硬盘分区状态;
-S:输出信息的单位。

参数

  • 事件间隔:状态信息刷新的时间间隔;

  • 次数:显示报告的次数。

实例

vmstat 3
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0    320  42188 167332 1534368    0    0     4     7    1    0  0  0 99  0  0
 0  0    320  42188 167332 1534392    0    0     0     0 1002   39  0  0 100  0  0
 0  0    320  42188 167336 1534392    0    0     0    19 1002   44  0  0 100  0  0
 0  0    320  42188 167336 1534392    0    0     0     0 1002   41  0  0 100  0  0
 0  0    320  42188 167336 1534392    0    0     0     0 1002   41  0  0 100  0  0

字段说明:

Procs(进程)

  • r: 运行队列中进程数量,这个值也可以判断是否需要增加CPU。(长期大于1)

  • b: 等待IO的进程数量。

Memory(内存)

  • swpd: 使用虚拟内存大小,如果swpd的值不为0,但是SI,SO的值长期为0,这种情况不会影响系统性能。

  • free: 空闲物理内存大小。

  • buff: 用作缓冲的内存大小。

  • cache: 用作缓存的内存大小,如果cache的值大的时候,说明cache处的文件数多,如果频繁访问到的文件都能被cache处,那么磁盘的读IO bi会非常小。

Swap

  • si: 每秒从交换区写到内存的大小,由磁盘调入内存。

  • so: 每秒写入交换区的内存大小,由内存调入磁盘。

注意:内存够用的时候,这2个值都是0,如果这2个值长期大于0时,系统性能会受到影响,磁盘IO和CPU资源都会被消耗。有些朋友看到空闲内存(free)很少的或接近于0时,就认为内存不够用了,不能光看这一点,还要结合si和so,如果free很少,但是si和so也很少(大多时候是0),那么不用担心,系统性能这时不会受到影响的。

IO(现在的Linux版本块的大小为1kb)

  • bi: 每秒读取的块数

  • bo: 每秒写入的块数

注意:随机磁盘读写的时候,这2个值越大(如超出1024k),能看到CPU在IO等待的值也会越大。

system(系统)

  • in: 每秒中断数,包括时钟中断。

  • cs: 每秒上下文切换数。

注意:上面2个值越大,会看到由内核消耗的CPU时间会越大。

CPU(以百分比表示)

  • us: 用户进程执行时间百分比(user time)

us的值比较高时,说明用户进程消耗的CPU时间多,但是如果长期超50%的使用,那么我们就该考虑优化程序算法或者进行加速。

  • sy: 内核系统进程执行时间百分比(system time)

sy的值高时,说明系统内核消耗的CPU资源多,这并不是良性表现,我们应该检查原因。

  • wa: IO等待时间百分比

wa的值高时,说明IO等待比较严重,这可能由于磁盘大量作随机访问造成,也有可能磁盘出现瓶颈(块操作)。

  • id: 空闲时间百分比

iostat

iostat命令 被用于监视系统输入输出设备和CPU的使用情况。它的特点是汇报磁盘活动统计情况,同时也会汇报出CPU使用情况。同vmstat一样,iostat也有一个弱点,就是它不能对某个进程进行深入分析,仅对系统的整体情况进行分析。

iowait 指在一个采样周期内有百分之几的时间是属于以下情况:CPU处于空闲状态并且至少有一个未完成的磁盘IO请求。

安装 iostat

iostat包含在sysstat包内。如果你没有,你首先需要安装它。 在 RedHat / CentOS / Fedora

yum install sysstat

在 Debian / Ubuntu / Linux Mint

sudo apt-get install sysstat

语法

iostat(选项)(参数)

选项

# iostat --help
Usage: iostat [ options ] [ <interval> [ <count> ] ]
Options are:
[ -c ] [ -d ] [ -h ] [ -k | -m ] [ -N ] [ -s ] [ -t ] [ -V ] [ -x ] [ -y ] [ -z ]
[ -j { ID | LABEL | PATH | UUID | ... } ] [ --human ] [ -o JSON ]
[ [ -H ] -g <group_name> ] [ -p [ <device> [,...] | ALL ] ]

参数说明:

-c         输出CPU统计信息。不能与-d参数同时使用。
-d         输出设备和分区的I/O统计信息。不能与-c参数同时使用。(默认的参数是-d)。
-h         让人类更容易阅读设备使用情况报告。--human使用此选项隐式启用。
-k         用“kbytes/秒”代替“块/秒”显示统计信息。
-m         用“mbytes/秒”代替“块/秒”显示统计信息。
-t         打印显示的每份报告的时间。
-V         显示版本号并退出。
-x         显示扩展统计信息。不能与参数-p同时使用。
-y         如果在给定时间间隔内显示多条记录,则省略自系统启动以来的第一份统计报告。
-z         告诉 iostat 忽略在样本期间没有活动的设备的输出。
-j         显示持久的设备名称。选项ID、LABEL等指定持久名称的类型。
--human    以人类可读格式打印大小(例如1.0k, 1.2M等)。使用此选项显示的单位取代与度量相关的任何其他默认单位(例如千字节,扇区…)。
-o         以JSON (Javascript Object Notation)格式显示统计数据。JSON输出字段顺序未定义,未来可能会添加新字段。
-H         该选项必须与-g一起使用,表示只显示组的全局统计信息,而不显示组中单个设备的统计信息。
-p         选项显示系统使用的块设备及其所有分区的统计信息。如果在命令行中输入一个设备名,那么将显示该设备及其所有分区的统计信息。最后,ALL关键字表示必须显示系统定义的所有块设备和分区的统计信息,包括那些从未使用过的设备和分区。如果在此选项之前定义了选项-j,则可以使用所选的持久名称类型指定在命令行上输入的设备。

参数

interval 刷新时间间隔 count 刷新次数

运行示例

示例1

# iostat
Linux 4.18.0-477.13.1.el8_8.x86_64 (node1) 	08/28/2024 	_x86_64_	(2 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           3.30    0.01    1.90    0.12    0.00   94.68

Device             tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
vda               7.85        84.22        36.59 1081853831  470049100

第一部分包含了CPU报告

性能指标

含义

%user

显示在用户级(应用程序)执行时发生的CPU利用率百分比。

%nice

显示在具有nice优先级的用户级别执行时发生的CPU利用率百分比。

%system

显示在系统级(内核)执行时发生的CPU利用率百分比。

%iowait

显示在系统有未完成的磁盘I/O请求期间CPU空闲的时间百分比。

%steal

显示虚拟机监控程序为另一个虚拟处理器提供服务时,一个或多个虚拟CPU在非自愿等待上花费的时间百分比。

%idle

显示CPU空闲且系统没有未完成的磁盘I/O请求的时间百分比。

第二部分包含了设备利用率报告

性能指标

含义

Device

此列给出了 /dev 目录中列出的设备(或分区)名称。

tps

表示每秒向设备发出的传输次数。传输是对设备的 I/O 请求。多个逻辑请求可合并为对设备的一个 I/O 请求。传输大小不确定。

kB_read/s

表示每秒从设备读取的数据量,以块数(千字节、兆字节)表示。块相当于扇区,因此大小为 512 字节。

kB_wrtn/s

表示写入设备的数据量,以每秒块数(千字节、兆字节)表示。

kB_read

读取的数据块总数(千字节、兆字节)。

kB_wrtn

写入的数据块总数(千字节、兆字节)。

示例2

以更友好的显示方式显示 IO 信息,使用-y忽略第一份统计。并每隔 1 秒重新一次,共5次。

# iostat -hdy 1 5
Linux 4.18.0-477.13.1.el8_8.x86_64 (node1) 	08/28/2024 	_x86_64_	(2 CPU)

      tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn Device
    64.00       288.0k       308.0k     288.0k     308.0k vda

      tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn Device
    12.00         0.0k        84.0k       0.0k      84.0k vda

      tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn Device
    15.00         0.0k        36.0k       0.0k      36.0k vda

      tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn Device
    28.00         0.0k        76.0k       0.0k      76.0k vda

      tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn Device
    11.00         0.0k       100.0k       0.0k     100.0k vda

示例3

# iostat -xd 1
Linux 4.18.0-477.13.1.el8_8.x86_64 (node1) 	08/28/2024 	_x86_64_	(2 CPU)

Device            r/s     w/s     rkB/s     wkB/s   rrqm/s   wrqm/s  %rrqm  %wrqm r_await w_await aqu-sz rareq-sz wareq-sz  svctm  %util
vda              4.64    3.21     84.14     36.59     0.28     1.07   5.64  25.01    5.86    8.23   0.05    18.12    11.41   0.44   0.34

Device            r/s     w/s     rkB/s     wkB/s   rrqm/s   wrqm/s  %rrqm  %wrqm r_await w_await aqu-sz rareq-sz wareq-sz  svctm  %util
vda              1.00    0.00      4.00      0.00     0.00     0.00   0.00   0.00    1.00    0.00   0.00     4.00     0.00   2.00   0.20

Device            r/s     w/s     rkB/s     wkB/s   rrqm/s   wrqm/s  %rrqm  %wrqm r_await w_await aqu-sz rareq-sz wareq-sz  svctm  %util
vda              0.00   37.00      0.00    395.50     0.00    10.00   0.00  21.28    0.00    0.92   0.03     0.00    10.69   0.11   0.40

Device            r/s     w/s     rkB/s     wkB/s   rrqm/s   wrqm/s  %rrqm  %wrqm r_await w_await aqu-sz rareq-sz wareq-sz  svctm  %util
vda              0.00    0.00      0.00      0.00     0.00     0.00   0.00   0.00    0.00    0.00   0.00     0.00     0.00   0.00   0.00

Device            r/s     w/s     rkB/s     wkB/s   rrqm/s   wrqm/s  %rrqm  %wrqm r_await w_await aqu-sz rareq-sz wareq-sz  svctm  %util
vda              0.00    0.00      0.00      0.00     0.00     0.00   0.00   0.00    0.00    0.00   0.00     0.00     0.00   0.00   0.00

Device            r/s     w/s     rkB/s     wkB/s   rrqm/s   wrqm/s  %rrqm  %wrqm r_await w_await aqu-sz rareq-sz wareq-sz  svctm  %util
vda              1.00    0.00      4.00      0.00     0.00     0.00   0.00   0.00    1.00    0.00   0.00     4.00     0.00   1.00   0.10

从这里你可以看到,iostat 提供了非常丰富的性能指标。第一列的 Device 表示磁盘设备的名字,其他各列指标,虽然数量较多,但是每个指标的含义都很重要。

性能指标

含义

r/s

设备每秒完成的读取请求数(合并后)。

w/s

设备每秒完成的写入请求数(合并后)。

rkB/s

每秒从设备读取的扇区数(千字节、兆字节)。

wkB/s

每秒写入设备的扇区数(千字节、兆字节)。

rrqm/s

每秒合并到设备的排队 I/O 请求数。

wrqm/s

每秒合并到设备的写入请求数。

%rrqm

在发送到设备之前合并在一起的读取请求的百分比。

%wrqm

发送到设备前合并在一起的写入请求的百分比。

r_await

向设备发出的读取请求获得服务的平均时间(毫秒)。这包括请求在队列中花费的时间和为请求提供服务的时间。

w_await

向待服务设备发出写入请求的平均时间(毫秒)。这包括请求在队列中花费的时间和为请求提供服务的时间。

aqu-sz

向设备发出的请求的平均队列长度。注意:在以前的版本中,该字段被称为 avgqu-sz。

rareq-sz

向设备发出的读取请求的平均大小(千字节)。

wareq-sz

向设备发出的写入请求的平均大小(千字节)。

svctm

向设备发出的 I/O 请求的平均服务时间(毫秒)。警告!不要再相信这个字段了。 未来的 sysstat 版本将删除此字段。

%util

向设备发出 I/O 请求所用时间的百分比(设备带宽利用率)。 对于串行服务请求的设备,当该值接近 100%,设备就会饱和。 但对于以并行方式提供请求的设备,如 RAID 阵列和现代固态硬盘,该数值并不能反映其性能极限。

当 %iowait 升高,需要重点关注以下指标:

  • avgrq-sz: 向设备发出请求的平均大小(单位:扇区)

  • avgqu-sz: 向设备发出请求的队列平均长度。也是个做 IO 调优时需要注意的地方,这个就是直接每次操作的数据的大小,如果次数多,但数据拿的小的话,其实 IO 也会很小.如果数据拿的大,IO 的数据会高

  • r_await: 向服务设备发出读取请求的平均时间(单位:毫秒)。包括请求入队的时间以及设备处理请求的时间

  • w_await: 向服务设备发出写请求的平均时间(单位:毫秒)。包括请求入队的时间以及设备处理请求的时间

  • %util:一秒中有百分之多少的时间用于 I/O 操作,或者说一秒中有多少时间 I/O 队列是非空的。如果 %util 接近 100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘可能存在瓶颈

  • %svctm:平均每次设备 I/O 操作的服务时间 (毫秒)。一般要小于 await (因为同时等待的请求的等待时间被重复计算了),svctm 的大小一般和磁盘性能有关,CPU/内存的负荷也会对其有影响,请求过多也会间接导致 svctm 的增加。await 的大小一般取决于服务时间(svctm) 以及 I/O 队列的长度和 I/O 请求的发出模式。如果 svctm 比较接近 await,说明 I/O 几乎没有等待时间;如果 await 远大于 svctm,说明 I/O 队列太长,应用得到的响应时间变慢,如果响应时间超过了用户可以容许的范围,这时可以考虑更换更快的磁盘,调整内核 elevator 算法,优化应用,或者升级 CPU

sar

sar命令 是Linux下系统运行状态统计工具,它将指定的操作系统状态计数器显示到标准输出设备。sar工具将对系统当前的状态进行取样,然后通过计算数据和比例来表达系统的当前运行状态。它的特点是可以连续对系统取样,获得大量的取样数据。取样数据和分析的结果都可以存入文件,使用它时消耗的系统资源很小。

语法

sar(选项)(参数)

选项

-A: 显示所有的报告信息;
-b: 显示I/O速率;
-B: 显示换页状态;
-c: 显示进程创建活动;
-d: 显示每个块设备的状态;
-e: 设置显示报告的结束时间;
-f: 从指定文件提取报告;
-i: 设状态信息刷新的间隔时间;
-n: 报告网络统计信息。
-P: 报告每个CPU的状态;
-R: 显示内存状态;
-u: 显示CPU利用率;
-v: 显示索引节点,文件和其他内核表的状态;
-w: 显示交换分区状态;
-x: 显示给定进程的状态。
-r: 以分页方式显示输出,每页最多显示 100 行。  
-o: 输出选项,指定要显示的列。例如,`-o mrk,prt,cvg` 将显示 CPU 使用率、进程标识符、磁盘使用率 和 网络流量。  
-t: 时间戳选项,指定要在输出中添加时间戳。  
-s: 统计选项,指定要显示的统计数据的类型。例如,`-s us,ms` 将显示 CPU 使用率的 us 和 ms 时间段的平均值。  
-c: 选项用于指定要发送的命令。例如,`-c ls` 将显示当前目录中的文件和子目录列表。

参数

  • 间隔时间:每次报告的间隔时间(秒);

  • 次数:显示报告的次数。

实例

察看内存和交换空间的使用率:

sar -r
Linux 2.4.20-8 (www.jsdig.com)    20130503  
12:00:01 AM kbmemfree kbmemused  %memused 
kbmemshrd kbbuffers  kbcached  
12:10:00 AM    240468   1048252     81.34    
0    133724    485772  
12:20:00 AM    240508   1048212     81.34   
0    134172    485600  
…  
08:40:00 PM    934132    354588     27.51    
0     26080    185364  
Average:       324346    964374     74.83  
0     96072    467559

kbmemfree与kbmemused字段分别显示内存的未使用与已使用空间,后面跟着的是已使用空间的百分比(%memused字段)。kbbuffers与kbcached字段分别显示缓冲区与系统全域的数据存取量,单位为KB。

观察系统部件10分钟,并对数据进行排序:

sar -o temp 60 10

显示保存在每日数据文件“sa16”中的内存和网络统计信息。

sar -r -n DEV -f /var/log/sa/sa16

查看 CPU 使用率:

sar -t

查看磁盘使用率:

sar -s disk

查看网络流量:

sar -s nic

发送命令到系统服务:

sar -c ls

显示系统当前时间戳:

sar -t +%s

这些只是 sar 命令的一些示例,您可以根据具体需求选择不同的选项和参数。

注意: sar 命令的输出结果可能会因为系统性能的不同而有所不同。如果要获得更准确的结果,请考虑在系统性能最佳的时候进行监控。

netstat

netstat命令 用来打印Linux中网络系统的状态信息,可让你得知整个Linux系统的网络情况。

语法

netstat(选项)

选项

-a或--all:显示所有连线中的Socket;
-A<网络类型>或--<网络类型>:列出该网络类型连线中的相关地址;
-c或--continuous:持续列出网络状态;
-C或--cache:显示路由器配置的快取信息;
-e或--extend:显示网络其他相关信息;
-F或--fib:显示FIB;
-g或--groups:显示多重广播功能群组组员名单;
-h或--help:在线帮助;
-i或--interfaces:显示网络界面信息表单;
-l或--listening:显示监控中的服务器的Socket;
-M或--masquerade:显示伪装的网络连线;
-n或--numeric:直接使用ip地址,而不通过域名服务器;
-N或--netlink或--symbolic:显示网络硬件外围设备的符号连接名称;
-o或--timers:显示计时器;
-p或--programs:显示正在使用Socket的程序识别码和程序名称;
-r或--route:显示Routing Table;
-s或--statistice:显示网络工作信息统计表;
-t或--tcp:显示TCP传输协议的连线状况;
-u或--udp:显示UDP传输协议的连线状况;
-v或--verbose:显示指令执行过程;
-V或--version:显示版本信息;
-w或--raw:显示RAW传输协议的连线状况;
-x或--unix:此参数的效果和指定"-A unix"参数相同;
--ip或--inet:此参数的效果和指定"-A inet"参数相同。

实例

列出所有端口 (包括监听和未监听的)

netstat -a     #列出所有端口
netstat -at    #列出所有tcp端口
netstat -au    #列出所有udp端口

列出所有处于监听状态的 Sockets

netstat -l        #只显示监听端口
netstat -lt       #只列出所有监听 tcp 端口
netstat -lu       #只列出所有监听 udp 端口
netstat -lx       #只列出所有监听 UNIX 端口

显示每个协议的统计信息

netstat -s   显示所有端口的统计信息
netstat -st   显示TCP端口的统计信息
netstat -su   显示UDP端口的统计信息

```shell

 **在netstat输出中显示 PID 和进程名称** 

```shell
netstat -pt

netstat -p可以与其它开关一起使用,就可以添加“PID/进程名称”到netstat输出中,这样debugging的时候可以很方便的发现特定端口运行的程序。

在netstat输出中不显示主机,端口和用户名(host, port or user)

当你不想让主机,端口和用户名显示,使用netstat -n。将会使用数字代替那些名称。同样可以加速输出,因为不用进行比对查询。

netstat -an

如果只是不想让这三个名称中的一个被显示,使用以下命令:

netsat -a --numeric-ports
netsat -a --numeric-hosts
netsat -a --numeric-users

持续输出netstat信息

netstat -c   #每隔一秒输出网络信息

显示系统不支持的地址族(Address Families)

netstat --verbose

在输出的末尾,会有如下的信息:

netstat: no support for `AF IPX' on this system.
netstat: no support for `AF AX25' on this system.
netstat: no support for `AF X25' on this system.
netstat: no support for `AF NETROM' on this system.

显示核心路由信息

netstat -r

使用netstat -rn显示数字格式,不查询主机名称。

找出程序运行的端口

并不是所有的进程都能找到,没有权限的会不显示,使用 root 权限查看所有的信息。

netstat -ap | grep ssh

找出运行在指定端口的进程:

netstat -an | grep ':80'

通过端口找进程ID

netstat -anp|grep 8081 | grep LISTEN|awk '{printf $7}'|cut -d/ -f1

显示网络接口列表

netstat -i

显示详细信息,像是ifconfig使用netstat -ie

IP和TCP分析

查看连接某服务端口最多的的IP地址:

netstat -ntu | grep :80 | awk '{print $5}' | cut -d: -f1 | awk '{++ip[$1]} END {for(i in ip) print ip[i],"\t",i}' | sort -nr

TCP各种状态列表:

netstat -nt | grep -e 127.0.0.1 -e 0.0.0.0 -e ::: -v | awk '/^tcp/ {++state[$NF]} END {for(i in state) print i,"\t",state[i]}'

查看phpcgi进程数,如果接近预设值,说明不够用,需要增加:

netstat -anpo | grep "php-cgi" | wc -l

扩展知识

网络连接状态详解

共有12中可能的状态,前面11种是按照TCP连接建立的三次握手和TCP连接断开的四次挥手过程来描述的:

  1. LISTEN:首先服务端需要打开一个socket进行监听,状态为 LISTEN,侦听来自远方TCP端口的连接请求 ;

  2. SYN_SENT:客户端通过应用程序调用connect进行active open,于是客户端tcp发送一个SYN以请求建立一个连接,之后状态置为 SYN_SENT,在发送连接请求后等待匹配的连接请求;

  3. SYN_RECV:服务端应发出ACK确认客户端的 SYN,同时自己向客户端发送一个SYN,之后状态置为,在收到和发送一个连接请求后等待对连接请求的确认;

  4. ESTABLISHED:代表一个打开的连接,双方可以进行或已经在数据交互了, 代表一个打开的连接,数据可以传送给用户;

  5. FIN_WAIT1:主动关闭(active close)端应用程序调用close,于是其TCP发出FIN请求主动关闭连接,之后进入FIN_WAIT1状态, 等待远程TCP的连接中断请求,或先前的连接中断请求的确认;

  6. CLOSE_WAIT:被动关闭(passive close)端TCP接到FIN后,就发出ACK以回应FIN请求(它的接收也作为文件结束符传递给上层应用程序),并进入CLOSE_WAIT, 等待从本地用户发来的连接中断请求;

  7. FIN_WAIT2:主动关闭端接到ACK后,就进入了 FIN-WAIT-2,从远程TCP等待连接中断请求;

  8. LAST_ACK:被动关闭端一段时间后,接收到文件结束符的应用程 序将调用CLOSE关闭连接,这导致它的TCP也发送一个 FIN,等待对方的ACK.就进入了LAST-ACK,等待原来发向远程TCP的连接中断请求的确认;

  9. TIME_WAIT:在主动关闭端接收到FIN后,TCP 就发送ACK包,并进入TIME-WAIT状态,等待足够的时间以确保远程TCP接收到连接中断请求的确认;

  10. CLOSING: 比较少见,等待远程TCP对连接中断的确认;

  11. CLOSED: 被动关闭端在接受到ACK包后,就进入了closed的状态,连接结束,没有任何连接状态;

  12. UNKNOWN:未知的Socket状态;

常见标志位

  • SYN: (同步序列编号,Synchronize Sequence Numbers)该标志仅在三次握手建立TCP连接时有效。表示一个新的TCP连接请求。

  • ACK: (确认编号,Acknowledgement Number)是对TCP请求的确认标志,同时提示对端系统已经成功接收所有数据。

  • FIN: (结束标志,FINish)用来结束一个TCP回话.但对应端口仍处于开放状态,准备接收后续数据。

ss

ss命令 用来显示处于活动状态的套接字信息。ss命令可以用来获取socket统计信息,它可以显示和netstat类似的内容。但ss的优势在于它能够显示更多更详细的有关TCP和连接状态的信息,而且比netstat更快速更高效。

当服务器的socket连接数量变得非常大时,无论是使用netstat命令还是直接cat /proc/net/tcp,执行速度都会很慢。可能你不会有切身的感受,但请相信我,当服务器维持的连接达到上万个的时候,使用netstat等于浪费 生命,而用ss才是节省时间。

天下武功唯快不破。ss快的秘诀在于,它利用到了TCP协议栈中tcp_diag。tcp_diag是一个用于分析统计的模块,可以获得Linux 内核中第一手的信息,这就确保了ss的快捷高效。当然,如果你的系统中没有tcp_diag,ss也可以正常运行,只是效率会变得稍慢。

语法

ss [参数]
ss [参数] [过滤]

选项

-h, --help      帮助信息
-V, --version   程序版本信息
-n, --numeric   不解析服务名称
-r, --resolve   解析主机名
-a, --all       显示所有套接字(sockets)
-l, --listening 显示监听状态的套接字(sockets)
-o, --options   显示计时器信息
-e, --extended  显示详细的套接字(sockets)信息
-m, --memory    显示套接字(socket)的内存使用情况
-p, --processes 显示使用套接字(socket)的进程
-i, --info      显示 TCP内部信息
-s, --summary   显示套接字(socket)使用概况
-4, --ipv4      仅显示IPv4的套接字(sockets)
-6, --ipv6      仅显示IPv6的套接字(sockets)
-0, --packet    显示 PACKET 套接字(socket)
-t, --tcp       仅显示 TCP套接字(sockets)
-u, --udp       仅显示 UCP套接字(sockets)
-d, --dccp      仅显示 DCCP套接字(sockets)
-w, --raw       仅显示 RAW套接字(sockets)
-x, --unix      仅显示 Unix套接字(sockets)
-f, --family=FAMILY  显示 FAMILY类型的套接字(sockets),FAMILY可选,支持  unix, inet, inet6, link, netlink
-A, --query=QUERY, --socket=QUERY
      QUERY := {all|inet|tcp|udp|raw|unix|packet|netlink}[,QUERY]
-D, --diag=FILE     将原始TCP套接字(sockets)信息转储到文件
 -F, --filter=FILE  从文件中都去过滤器信息
       FILTER := [ state TCP-STATE ] [ EXPRESSION ]

实例

ss -t -a    # 显示TCP连接
ss -s       # 显示 Sockets 摘要
ss -l       # 列出所有打开的网络连接端口
ss -pl      # 查看进程使用的socket
ss -lp | grep 3306  # 找出打开套接字/端口应用程序
ss -u -a    显示所有UDP Sockets
ss -o state established '( dport = :smtp or sport = :smtp )' # 显示所有状态为established的SMTP连接
ss -o state established '( dport = :http or sport = :http )' # 显示所有状态为Established的HTTP连接
ss -o state fin-wait-1 '( sport = :http or sport = :https )' dst 193.233.7/24  # 列举出处于 FIN-WAIT-1状态的源端口为 80或者 443,目标网络为 193.233.7/24所有 tcp套接字

# ss 和 netstat 效率对比
time netstat -at
time ss

# 匹配远程地址和端口号
# ss dst ADDRESS_PATTERN
ss dst 192.168.1.5
ss dst 192.168.119.113:http
ss dst 192.168.119.113:smtp
ss dst 192.168.119.113:443

# 匹配本地地址和端口号
# ss src ADDRESS_PATTERN
ss src 192.168.119.103
ss src 192.168.119.103:http
ss src 192.168.119.103:80
ss src 192.168.119.103:smtp
ss src 192.168.119.103:25

将本地或者远程端口和一个数比较

# ss dport OP PORT 远程端口和一个数比较;
# ss sport OP PORT 本地端口和一个数比较
# OP 可以代表以下任意一个:
# <= or le : 小于或等于端口号
# >= or ge : 大于或等于端口号
# == or eq : 等于端口号
# != or ne : 不等于端口号
# < or gt : 小于端口号
# > or lt : 大于端口号
ss  sport = :http
ss  dport = :http
ss  dport \> :1024
ss  sport \> :1024
ss sport \< :32000
ss  sport eq :22
ss  dport != :22
ss  state connected sport = :http
ss \( sport = :http or sport = :https \)
ss -o state fin-wait-1 \( sport = :http or sport = :https \) dst 192.168.1/24

用TCP 状态过滤Sockets

ss -4 state closing
# ss -4 state FILTER-NAME-HERE
# ss -6 state FILTER-NAME-HERE
# FILTER-NAME-HERE 可以代表以下任何一个:
# established、 syn-sent、 syn-recv、 fin-wait-1、 fin-wait-2、 time-wait、 closed、 close-wait、 last-ack、 listen、 closing、
# all : 所有以上状态
# connected : 除了listen and closed的所有状态
# synchronized :所有已连接的状态除了syn-sent
# bucket : 显示状态为maintained as minisockets,如:time-wait和syn-recv.
# big : 和bucket相反.

显示ICP连接

[root@localhost ~]# ss -t -a
State       Recv-Q Send-Q                            Local Address:Port                                Peer Address:Port
LISTEN      0      0                                             *:3306                                           *:*
LISTEN      0      0                                             *:http                                           *:*
LISTEN      0      0                                             *:ssh                                            *:*
LISTEN      0      0                                     127.0.0.1:smtp                                           *:*
ESTAB       0      0                                112.124.15.130:42071                              42.156.166.25:http
ESTAB       0      0                                112.124.15.130:ssh                              121.229.196.235:33398

显示 Sockets 摘要

[root@localhost ~]# ss -s
Total: 172 (kernel 189)
TCP:   10 (estab 2, closed 4, orphaned 0, synrecv 0, timewait 0/0), ports 5

Transport Total     ip        IPv6
*         189       -         -
RAW       0         0         0
UDP       5         5         0
TCP       6         6         0
INET      11        11        0
FRAG      0         0         0

列出当前的established, closed, orphaned and waiting TCP sockets

列出所有打开的网络连接端口

[root@localhost ~]# ss -l
Recv-Q Send-Q                                 Local Address:Port                                     Peer Address:Port
0      0                                                  *:3306                                                *:*
0      0                                                  *:http                                                *:*
0      0                                                  *:ssh                                                 *:*
0      0                                          127.0.0.1:smtp                                                *:*

查看进程使用的socket

[root@localhost ~]# ss -pl
Recv-Q Send-Q                                          Local Address:Port                                              Peer Address:Port
0      0                                                           *:3306                                                         *:*        users:(("mysqld",1718,10))
0      0                                                           *:http                                                         *:*        users:(("nginx",13312,5),("nginx",13333,5))
0      0                                                           *:ssh                                                          *:*        users:(("sshd",1379,3))
0      0                                                   127.0.0.1:smtp                                                         *:*        us

找出打开套接字/端口应用程序

[root@localhost ~]# ss -pl | grep 3306
0      0                            *:3306                          *:*        users:(("mysqld",1718,10))

显示所有UDP Sockets

[root@localhost ~]# ss -u -a
State       Recv-Q Send-Q                                     Local Address:Port                                         Peer Address:Port
UNCONN      0      0                                                      *:syslog                                                  *:*
UNCONN      0      0                                         112.124.15.130:ntp                                                     *:*
UNCONN      0      0                                            10.160.7.81:ntp                                                     *:*
UNCONN      0      0                                              127.0.0.1:ntp                                                     *:*
UNCONN      0      0                                                      *:ntp                                                     *:*

出所有端口为 22(ssh)的连接

[root@localhost ~]# ss state all sport = :ssh
Netid State      Recv-Q Send-Q     Local Address:Port                      Peer Address:Port
tcp   LISTEN     0      128                    *:ssh                                  *:*
tcp   ESTAB      0      0          192.168.0.136:ssh                      192.168.0.102:46540
tcp   LISTEN     0      128                   :::ssh                                 :::*

查看TCP的连接状态

[root@localhost ~]# ss  -tan|awk 'NR>1{++S[$1]}END{for (a in S) print a,S[a]}'
LISTEN 7
ESTAB 31
TIME-WAIT 28

lsof

lsof命令 用于查看你进程打开的文件,打开文件的进程,进程打开的端口(TCP、UDP)。找回/恢复删除的文件。是十分方便的系统监视工具,因为lsof命令需要访问核心内存和各种文件,所以需要root用户执行。

在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。

语法

lsof (选项)

选项

-a:列出打开文件存在的进程;
-c<进程名>:列出指定进程所打开的文件;
-g:列出GID号进程详情;
-d<文件号>:列出占用该文件号的进程;
+d<目录>:列出目录下被打开的文件;
+D<目录>:递归列出目录下被打开的文件;
-n<目录>:列出使用NFS的文件;
-i<条件>:列出符合条件的进程(协议、:端口、 @ip )
-p<进程号>:列出指定进程号所打开的文件;
-u:列出UID号进程详情;
-h:显示帮助信息;
-v:显示版本信息

实例

lsof
command     PID USER   FD      type             DEVICE     SIZE       NODE NAME
init          1 root  cwd       DIR                8,2     4096          2 /
init          1 root  rtd       DIR                8,2     4096          2 /
init          1 root  txt       REG                8,2    43496    6121706 /sbin/init
init          1 root  mem       REG                8,2   143600    7823908 /lib64/ld-2.5.so
init          1 root  mem       REG                8,2  1722304    7823915 /lib64/libc-2.5.so
init          1 root  mem       REG                8,2    23360    7823919 /lib64/libdl-2.5.so
init          1 root  mem       REG                8,2    95464    7824116 /lib64/libselinux.so.1
init          1 root  mem       REG                8,2   247496    7823947 /lib64/libsepol.so.1
init          1 root   10u     FIFO               0,17                1233 /dev/initctl
migration     2 root  cwd       DIR                8,2     4096          2 /
migration     2 root  rtd       DIR                8,2     4096          2 /
migration     2 root  txt   unknown                                        /proc/2/exe
ksoftirqd     3 root  cwd       DIR                8,2     4096          2 /
ksoftirqd     3 root  rtd       DIR                8,2     4096          2 /
ksoftirqd     3 root  txt   unknown                                        /proc/3/exe
migration     4 root  cwd       DIR                8,2     4096          2 /
migration     4 root  rtd       DIR                8,2     4096          2 /
migration     4 root  txt   unknown                                        /proc/4/exe
ksoftirqd     5 root  cwd       DIR                8,2     4096          2 /
ksoftirqd     5 root  rtd       DIR                8,2     4096          2 /
ksoftirqd     5 root  txt   unknown                                        /proc/5/exe
events/0      6 root  cwd       DIR                8,2     4096          2 /
events/0      6 root  rtd       DIR                8,2     4096          2 /
events/0      6 root  txt   unknown                                        /proc/6/exe
events/1      7 root  cwd       DIR                8,2     4096          2 /

lsof输出各列信息的意义如下:

标识

说明

COMMAND

进程的名称

PID

进程标识符

PPID

父进程标识符(需要指定-R参数)

USER

进程所有者

PGID

进程所属组

FD

文件描述符,应用程序通过它识别该文件

文件描述符列表:

标识

说明

cwd

表示当前工作目录,即:应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改

txt

该类型的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的 /sbin/init 程序

lnn

库引用 (AIX);

er

FD 信息错误(参见名称栏)

jld

jail 目录 (FreeBSD);

ltx

共享库文本(代码和数据)

mxx

十六进制内存映射类型编号xx

m86

DOS合并映射文件

mem

内存映射文件

mmap

内存映射设备

pd

父目录

rtd

根目录

tr

内核跟踪文件 (OpenBSD)

v86

VP/ix 映射文件

0

表示标准输出

1

表示标准输入

2

表示标准错误

一般在标准输出、标准错误、标准输入后还跟着文件状态模式:

标识

说明

u

表示该文件被打开并处于读取/写入模式

r

表示该文件被打开并处于只读模式

w

表示该文件被打开并处于写入模式

空格

表示该文件的状态模式为 unknow,且没有锁定

-

表示该文件的状态模式为 unknow,且被锁定

同时在文件状态模式后面,还跟着相关的锁:

标识

说明

N

对于未知类型的Solaris NFS锁

r

用于部分文件的读取锁定

R

对整个文件进行读取锁定

w

对文件的一部分进行写锁定(文件的部分写锁)

W

对整个文件进行写锁定(整个文件的写锁)

u

用于任何长度的读写锁

U

对于未知类型的锁

x

对于文件部分的SCO OpenServer Xenix锁

X

对于整个文件的SCO OpenServer Xenix锁

space

如果没有锁

文件类型

标识

说明

DIR

表示目录

CHR

表示字符类型

BLK

块设备类型

UNIX

UNIX 域套接字

FIFO

先进先出 (FIFO) 队列

IPv4

网际协议 (IP) 套接字

DEVICE

指定磁盘的名称

SIZE

文件的大小

NODE

索引节点(文件在磁盘上的标识)

NAME

打开文件的确切名称

REG

常规文件

列出指定进程号所打开的文件:

lsof -p $pid

获取端口对应的进程ID=>pid

lsof -i:9981 -P -t -sTCP:LISTEN

列出打开文件的进程:

lsof $filename

查看端口占用

lsof -i:$port

查看所有打开的文件:

lsof

查看指定进程打开的文件:

lsof -p <PID>

查看指定用户打开的文件:

lsof -u <username>

查看指定文件名相关的进程:

lsof <filename>

查看网络连接相关的进程:

lsof -i

查看指定端口相关的进程:

lsof -i :<port>

查看正在使用某个目录的进程:

lsof +D /path/to/directory

查看被删除但仍然被某个进程打开的文件:

lsof -u +L1

查看某个文件系统上被打开的文件:

lsof /mountpoint

以列表形式显示结果:

lsof -F

显示结果中不包含主机名:

lsof -n

显示结果中不包含进程路径:

lsof -b

以逆序显示结果:

lsof -r

以特定间隔时间循环显示结果:

lsof -r <interval>

以持续模式显示结果:

lsof -t <interval>

dstat

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

下载安装

方法一

yum install -y dstat

方法二

官网下载地址:http://dag.wieers.com/rpm/packages/dstat

wget http://dag.wieers.com/rpm/packages/dstat/dstat-0.6.7-1.rh7.rf.noarch.rpm
rpm -ivh dstat-0.6.7-1.rh7.rf.noarch.rpm

使用说明

安装完后就可以使用了,dstat非常强大,可以实时的监控cpu、磁盘、网络、IO、内存等使用情况。

直接使用dstat,默认使用的是-cdngy参数,分别显示cpu、disk、net、page、system信息,默认是1s显示一条信息。可以在最后指定显示一条信息的时间间隔,如dstat 5是没5s显示一条,dstat 5 10表示没5s显示一条,一共显示10条。

[root@iZ23uulau1tZ ~]# dstat
----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system--
usr sys idl wai hiq siq| read  writ| recv  send|  in   out | int   csw
  0   0  99   0   0   0|7706B  164k|   0     0 |   0     0 | 189   225
  0   0 100   0   0   0|   0     0 |4436B  826B|   0     0 | 195   248
  1   0  99   0   0   0|   0     0 |4744B  346B|   0     0 | 203   242
  0   0 100   0   0   0|   0     0 |5080B  346B|   0     0 | 206   242
  0   1  99   0   0   0|   0     0 |5458B  444B|   0     0 | 214   244
  1   0  99   0   0   0|   0     0 |5080B  346B|   0     0 | 208   242

下面对显示出来的部分信息作一些说明:

  1. cpu:hiq、siq分别为硬中断和软中断次数。

  2. system:int、csw分别为系统的中断次数(interrupt)和上下文切换(context switch)。

其他的都很好理解。

语法

dstat [-afv] [options..] [delay [count]]

常用选项

-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文件中。

当然dstat还有很多更高级的用法,常用的基本这些选项,更高级的用法可以结合man文档。

实例

如想监控swap,process,sockets,filesystem并显示监控的时间:

[root@iZ23uulau1tZ ~]# dstat -tsp --socket --fs
----system---- ----swap--- ---procs--- ------sockets------ --filesystem-
  date/time   | used  free|run blk new|tot tcp udp raw frg|files  inodes
26-07 09:23:48|   0     0 |  0   0 0.0|104   8   5   0   0|  704   6488
26-07 09:23:49|   0     0 |  0   0   0|104   8   5   0   0|  704   6488
26-07 09:23:50|   0     0 |  0   0   0|104   8   5   0   0|  704   6489
26-07 09:23:51|   0     0 |  0   0   0|104   8   5   0   0|  704   6489
26-07 09:23:52|   0     0 |  0   0   0|104   8   5   0   0|  704   6489
26-07 09:23:53|   0     0 |  0   0   0|104   8   5   0   0|  704   6489

若要将结果输出到文件可以加--output filename

[root@iZ23uulau1tZ ~]# dstat -tsp --socket --fs --output /tmp/ds.csv
----system---- ----swap--- ---procs--- ------sockets------ --filesystem-
  date/time   | used  free|run blk new|tot tcp udp raw frg|files  inodes
26-07 09:25:31|   0     0 |  0   0 0.0|104   8   5   0   0|  736   6493
26-07 09:25:32|   0     0 |  0   0   0|104   8   5   0   0|  736   6493
26-07 09:25:33|   0     0 |  0   0   0|104   8   5   0   0|  736   6493
26-07 09:25:34|   0     0 |  0   0   0|104   8   5   0   0|  736   6493
26-07 09:25:35|   0     0 |  0   0   0|104   8   5   0   0|  736   6494
26-07 09:25:36|   0     0 |  0   0   0|104   8   5   0   0|  736   6494

这样生成的csv文件可以用excel打开,然后生成图表。

通过dstat --list可以查看dstat能使用的所有参数,其中上面internal是dstat本身自带的一些监控参数,下面/usr/share/dstat中是dstat的插件,这些插件可以扩展dstat的功能,如可以监控电源(battery)、mysql等。

下面这些插件并不是都可以直接使用的,有的还依赖其他包,如想监控mysql,必须要装python连接mysql的一些包。

[root@iZ23uulau1tZ ~]# dstat --list
internal:
        aio, cpu, cpu24, disk, disk24, disk24old, epoch, fs, int, int24, io, ipc, load, lock, mem, net, page, page24, proc, raw, socket, swap, swapold, sys, tcp, time, udp, unix, vm
/usr/share/dstat:
        battery, battery-remain, cpufreq, dbus, disk-util, fan, freespace, gpfs, gpfs-ops, helloworld, innodb-buffer, innodb-io, innodb-ops, lustre, memcache-hits, mysql-io, mysql-keys, mysql5-cmds, mysql5-conn, mysql5-io, mysql5-keys,
        net-packets, nfs3, nfs3-ops, nfsd3, nfsd3-ops, ntp, postfix, power, proc-count, rpc, rpcd, sendmail, snooze, thermal, top-bio, top-cpu, top-cputime, top-cputime-avg, top-io, top-latency, top-latency-avg, top-mem, top-oom, utmp,
        vm-memctl, vmk-hba, vmk-int, vmk-nic, vz-cpu, vz-io, vz-ubc, wifi

free

free命令 可以显示当前系统未使用的和已使用的内存数目,还可以显示被内核使用的内存缓冲区。

语法

free(选项)

选项

-b # 以Byte为单位显示内存使用情况;
-k # 以KB为单位显示内存使用情况;
-m # 以MB为单位显示内存使用情况;
-g # 以GB为单位显示内存使用情况。 
-o # 不显示缓冲区调节列;
-s<间隔秒数> # 持续观察内存使用状况;
-t # 显示内存总和列;
-V # 显示版本信息。

实例

free -t    # 以总和的形式显示内存的使用信息
free -s 10 # 周期性的查询内存使用信息,每10s 执行一次命令

显示内存使用情况

free -m
             total       used       free     shared    buffers     cached
Mem:          2016       1973         42          0        163       1497
-/+ buffers/cache:        312       1703
Swap:         4094          0       4094

第一部分Mem行解释:

total:内存总数;
used:已经使用的内存数;
free:空闲的内存数;
shared:当前已经废弃不用;
buffers Buffer:缓存内存数;
cached Page:缓存内存数。

关系:total = used + free

第二部分(-/+ buffers/cache)解释:

(-buffers/cache) used内存数:第一部分Mem行中的 used – buffers – cached
(+buffers/cache) free内存数: 第一部分Mem行中的 free + buffers + cached

可见-buffers/cache反映的是被程序实实在在吃掉的内存,而+buffers/cache反映的是可以挪用的内存总数。

第三部分是指交换分区。

输出结果的第四行是交换分区SWAP的,也就是我们通常所说的虚拟内存。 区别:第二行(mem)的used/free与第三行(-/+ buffers/cache) used/free的区别。 这两个的区别在于使用的角度来看,第一行是从OS的角度来看,因为对于OS,buffers/cached 都是属于被使用,所以他的可用内存是2098428KB,已用内存是30841684KB,其中包括,内核(OS)使用+Application(X, oracle,etc)使用的+buffers+cached.

第三行所指的是从应用程序角度来看,对于应用程序来说,buffers/cached 是等于可用的,因为buffer/cached是为了提高文件读取的性能,当应用程序需在用到内存的时候,buffer/cached会很快地被回收。

所以从应用程序的角度来说,可用内存=系统free memory+buffers+cached。 如本机情况的可用内存为:

18007156=2098428KB+4545340KB+11363424KB

接下来解释什么时候内存会被交换,以及按什么方交换。

当可用内存少于额定值的时候,就会开会进行交换。如何看额定值:

cat /proc/meminfo

MemTotal:       16140816 kB
MemFree:          816004 kB
MemAvailable:    2913824 kB
Buffers:           17912 kB
Cached:          2239076 kB
SwapCached:            0 kB
Active:         12774804 kB
Inactive:        1594328 kB
Active(anon):   12085544 kB
Inactive(anon):    94572 kB
Active(file):     689260 kB
Inactive(file):  1499756 kB
Unevictable:      116888 kB
Mlocked:          116888 kB
SwapTotal:       8191996 kB
SwapFree:        8191996 kB
Dirty:                56 kB
Writeback:             0 kB
AnonPages:      12229228 kB
Mapped:           117136 kB
Shmem:             58736 kB
Slab:             395568 kB
SReclaimable:     246700 kB
SUnreclaim:       148868 kB
KernelStack:       30496 kB
PageTables:       165104 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:    16262404 kB
Committed_AS:   27698600 kB
VmallocTotal:   34359738367 kB
VmallocUsed:      311072 kB
VmallocChunk:   34350899200 kB
HardwareCorrupted:     0 kB
AnonHugePages:   3104768 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:      225536 kB
DirectMap2M:    13279232 kB
DirectMap1G:     5242880 kB

交换将通过三个途径来减少系统中使用的物理页面的个数:

  1. 减少缓冲与页面cache的大小,

  2. 将系统V类型的内存页面交换出去,

  3. 换出或者丢弃页面。(Application 占用的内存页,也就是物理内存不足)。

事实上,少量地使用swap是不是影响到系统性能的。

那buffers和cached都是缓存,两者有什么区别呢?

为了提高磁盘存取效率, Linux做了一些精心的设计, 除了对dentry进行缓存(用于VFS,加速文件路径名到inode的转换), 还采取了两种主要Cache方式:

Buffer Cache和Page Cache。前者针对磁盘块的读写,后者针对文件inode的读写。这些Cache有效缩短了 I/O系统调用(比如read,write,getdents)的时间。 磁盘的操作有逻辑级(文件系统)和物理级(磁盘块),这两种Cache就是分别缓存逻辑和物理级数据的。

Page cache实际上是针对文件系统的,是文件的缓存,在文件层面上的数据会缓存到page cache。文件的逻辑层需要映射到实际的物理磁盘,这种映射关系由文件系统来完成。当page cache的数据需要刷新时,page cache中的数据交给buffer cache,因为Buffer Cache就是缓存磁盘块的。但是这种处理在2.6版本的内核之后就变的很简单了,没有真正意义上的cache操作。

Buffer cache是针对磁盘块的缓存,也就是在没有文件系统的情况下,直接对磁盘进行操作的数据会缓存到buffer cache中,例如,文件系统的元数据都会缓存到buffer cache中。

简单说来,page cache用来缓存文件数据,buffer cache用来缓存磁盘数据。在有文件系统的情况下,对文件操作,那么数据会缓存到page cache,如果直接采用dd等工具对磁盘进行读写,那么数据会缓存到buffer cache。

所以我们看linux,只要不用swap的交换空间,就不用担心自己的内存太少.如果常常swap用很多,可能你就要考虑加物理内存了.这也是linux看内存是否够用的标准.

如果是应用服务器的话,一般只看第二行,+buffers/cache,即对应用程序来说free的内存太少了,也是该考虑优化程序或加内存了。

pref

perf 是 Linux 下的强大性能分析工具,提供了丰富的命令选项,支持多种系统和应用的性能分析。以下是 perf 的基本语法、常用选项和实例。

语法

bash


复制代码
perf [COMMAND] [options] [arguments]

常用的 perf 命令

  1. perf stat:获取整体系统性能统计信息,提供 CPU、内存、缓存等数据。

  2. perf record:记录指定进程的性能数据。

  3. perf report:分析和展示 perf record 收集的数据。

  4. perf top:类似 top 的工具,实时显示当前系统的热点函数和符号。

  5. perf list:列出所有可用的事件和计数器。

  6. perf annotate:分析代码中各行的性能数据(适合有源码支持的情况)。

选项

  • -e:指定事件类型,如 cpu-cyclesinstructionscache-misses 等。

  • -p:指定进程 ID,分析特定进程。

  • -a:分析整个系统而不仅是某个进程。

  • -o:指定输出文件,用于保存数据(通常配合 perf record)。

  • -c:设定采样频率。

  • --call-graph:启用调用栈跟踪,用于分析函数调用链。

  • --sort:设置排序方式(适用于 perf report)。

实例

1. perf stat 基本用法

获取系统的整体性能统计信息,分析指定命令的执行性能:

bash


复制代码
perf stat ls

ls 命令执行期间,perf stat 将收集 CPU、缓存等硬件事件统计信息,最后展示执行的性能概览。

2. 监控特定进程的性能数据

使用 -p 选项监控某个特定进程的性能数据,例如进程 ID 为 12345:

bash


复制代码
perf stat -p 12345

3. 采集系统的所有 CPU 事件

使用 -a 选项采集所有 CPU 的事件信息:

bash


复制代码
perf stat -a sleep 5

在系统中运行 5 秒,并采集这段时间内所有 CPU 的性能数据。

4. 记录进程的性能数据

使用 perf record 记录进程的性能数据(默认事件是 CPU 周期):

bash


复制代码
perf record -p 12345 -o perf.data

将进程 12345 的性能数据记录到 perf.data 文件中。

5. 分析记录的数据

使用 perf report 分析 perf.data 文件中的数据:

bash


复制代码
perf report -i perf.data

perf report 会展示在 perf record 时收集到的性能数据,包含函数和符号的性能开销。

6. 实时监控热点函数

使用 perf top 进行实时监控,类似 top,会显示系统内最耗资源的函数:

bash


复制代码
perf top

7. 指定事件类型

可以使用 -e 选项指定具体事件类型,比如指令执行数和缓存未命中数:

bash


复制代码
perf stat -e instructions,cache-misses ls

8. 启用调用栈跟踪

使用 --call-graph 选项开启调用栈跟踪,这在分析复杂程序的性能瓶颈时非常有用:

bash


复制代码
perf record --call-graph dwarf -p 12345

9. 列出支持的事件

使用 perf list 查看系统中所有支持的事件类型:

bash


复制代码
perf list

10. 代码注解

perf annotate 用于分析代码的热点行(适合有源码支持的情况):

bash


复制代码
perf annotate -i perf.data