Linux 性能监控之命令行工具
Posted 奔跑的东东
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux 性能监控之命令行工具相关的知识,希望对你有一定的参考价值。
引言
对于系统和网络管理员来说每天监控和调试Linux系统的性能问题是一项繁重的工作。这些命令行工具可以在各种Linux系统下使用,可以用于监控和查找产生性能问题的原因。这个命令行工具列表提供了足够的工具,您可以挑选适用于您的监控场景的工具。
1. lsof - 列出打开的文件
在许多Linux或者类Unix系统里都有lsof命令,它常用于以列表的形式显示所有打开的文件和进程。打开的文件包括磁盘文件、网络套接字、管道、设备和进程。使用这条命令的主要情形之一就是在无法挂载磁盘和显示正在使用或者打开某个文件的错误信息的时候。
常用的参数列表:lsof filename 显示打开指定文件的所有进程
lsof -a 表示两个参数都必须满足时才显示结果
lsof -c string 显示COMMAND列中包含指定字符的进程所有打开的文件
lsof -u username 显示所属user进程打开的文件
lsof -g gid 显示归属gid的进程情况
lsof +d /DIR/ 显示目录下被进程打开的文件
lsof +D /DIR/ 同上,但是会搜索目录下的所有目录,时间相对较长
lsof -d FD 显示指定文件描述符的进程
lsof -n 不将IP转换为hostname,缺省是不加上-n参数
lsof -i 用以显示符合条件的进程情况
lsof -a 表示两个参数都必须满足时才显示结果
lsof -c string 显示COMMAND列中包含指定字符的进程所有打开的文件
lsof -u username 显示所属user进程打开的文件
lsof -g gid 显示归属gid的进程情况
lsof +d /DIR/ 显示目录下被进程打开的文件
lsof +D /DIR/ 同上,但是会搜索目录下的所有目录,时间相对较长
lsof -d FD 显示指定文件描述符的进程
lsof -n 不将IP转换为hostname,缺省是不加上-n参数
lsof -i 用以显示符合条件的进程情况
查看22端口现在运行的情况
[[email protected] ~]# lsof -i :22 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 925 root 3u IPv4 18374 0t0 TCP *:ssh (LISTEN) sshd 925 root 4u IPv6 18383 0t0 TCP *:ssh (LISTEN) sshd 9452 root 3u IPv4 1169003 0t0 TCP CentOS7.2:ssh->192.168.56.1:61347 (ESTABLISHED)
查看所属root用户进程所打开的文件类型为txt的文件
[[email protected] ~]# lsof -a -u root -d txt COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME systemd 1 root txt REG 0,34 1489960 56083 /usr/lib/systemd/systemd kthreadd 2 root txt unknown /proc/2/exe ksoftirqd 3 root txt unknown /proc/3/exe migration 7 root txt unknown /proc/7/exe rcu_bh 8 root txt unknown /proc/8/exe
2. top - 进程活动
top提供一个当前运行系统实时动态的视图,也就是正在运行进程。在默认情况下,显示系统中CPU使用率最高的任务,并每5秒钟刷新一次。
常用热键
top - 11:20:12 up 2 days, 18:39, 3 users, load average: 0.00, 0.01, 0.05 Tasks: 173 total, 1 running, 172 sleeping, 0 stopped, 0 zombie %Cpu(s): 0.3/0.7 1[| ] KiB Mem : 500780 total, 13236 free, 249296 used, 238248 buff/cache KiB Swap: 8388604 total, 7848788 free, 539816 used. 200108 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 17166 root 20 0 0 0 0 S 0.3 0.0 0:09.05 kworker/0:2 19196 root 20 0 146144 2056 1420 R 0.3 0.4 0:02.25 top 23944 root 20 0 1239128 38724 8388 S 0.3 7.7 6:39.63 firefox 1 root 20 0 191492 4212 2328 S 0.0 0.8 0:27.20 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0:02.22 kthreadd 3 root 20 0 0 0 0 S 0.0 0.0 7:11.69 ksoftirqd/0 7 root rt 0 0 0 0 S 0.0 0.0 0:00.00 migration/0 8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh 9 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcuob/0 10 root 20 0 0 0 0 S 0.0 0.0 6:09.07 rcu_sched 11 root 20 0 0 0 0 S 0.0 0.0 14:11.36 rcuos/0 12 root rt 0 0 0 0 S 0.0 0.0 0:03.03 watchdog/0 13 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 khelper 14 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kdevtmpfs 15 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 netns 16 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 perf
m:显示内存信息开关
top - 11:22:12 up 2 days, 18:41, 3 users, load average: 0.00, 0.01, 0.05 Tasks: 173 total, 1 running, 172 sleeping, 0 stopped, 0 zombie %Cpu(s): 0.0 us, 0.3 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem : 60.0/500780 [|||||||||||||||||||||||||||||||||||||||||||||| ] KiB Swap: 6.4/8388604 [||||| ]
A:分类显示系统不同资源的使用大户,有助于快速识别系统中资源消耗多的任务
1:Def - 11:23:40 up 2 days, 18:42, 3 users, load average: 0.00, 0.01, 0.05 Tasks: 174 total, 1 running, 173 sleeping, 0 stopped, 0 zombie %Cpu(s): 0.7 us, 0.7 sy, 0.0 ni, 98.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem : 500780 total, 21124 free, 249376 used, 230280 buff/cache KiB Swap: 8388604 total, 7848788 free, 539816 used. 200072 avail Mem 1 PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 920 root 20 0 644044 11096 3360 S 0.3 2.2 10:28.34 daomonit 19196 root 20 0 146144 2056 1420 R 0.3 0.4 0:03.00 top 1 root 20 0 191492 4212 2328 S 0.0 0.8 0:27.20 systemd 2 PID PPID TIME+ %CPU %MEM PR NI S VIRT RES UID COMMAND 24416 2 0:03.29 0.0 0.0 0 -20 S 0 0 0 kworker/0:2H 24365 1 0:00.04 0.0 0.3 20 0 S 238724 1380 0 gvfsd-metadata 23944 23598 6:40.25 0.0 7.7 20 0 S 1239128 38724 0 firefox 3 PID %MEM VIRT RES CODE DATA SHR nMaj nDRT %CPU COMMAND 23598 10.7 1473588 53752 16 746528 8912 26k 0 0.0 gnome-shell 23944 7.7 1239128 38724 108 582752 8388 46k 0 0.0 firefox 18581 3.2 110512 15824 392 12292 3364 23 0 0.0 dhclient 4 PID PPID UID USER RUSER TTY TIME+ %CPU %MEM S COMMAND 536 1 172 rtkit rtkit ? 0:03.06 0.0 0.1 S rtkit-daemon 1 0 0 root root ? 0:27.20 0.0 0.8 S systemd 2 0 0 root root ? 0:02.22 0.0 0.0 S kthreadd 3 2 0 root root ? 7:11.70 0.0 0.0 S ksoftirqd/0
Fields Management for window 1:Def, whose current sort field is PPID Navigate with Up/Dn, Right selects for move then <Enter> or Left commits, ‘d‘ or <Space> toggles display, ‘s‘ sets sort. Use ‘q‘ or <Esc> to end! * PID = Process Id GROUP = Group Name TGID = Thread Group Id * USER = Effective User Name PGRP = Process Group Id ENVIRON = Environment vars* PR = Priority TTY = Controlling Tty vMj = Major Faults delta * NI = Nice Value TPGID = Tty Process Grp Id vMn = Minor Faults delta * VIRT = Virtual Image (KiB) SID = Session Id USED = Res+Swap Size (KiB) * RES = Resident Size (KiB) nTH = Number of Threads nsIPC=IPC namespace Inode * SHR = Shared Memory (KiB) P = Last Used Cpu (SMP) nsMNT = MNT namespace Inode * S = Process Status TIME = CPU Time nsNET = NET namespace Inode * %MEM = Memory Usage (RES) SWAP = Swapped Size (KiB) nsPID=PID namespace Inode * TIME+ = CPU Time, hundredths CODE = Code Size (KiB) nsUSER=USER namespace Inode * COMMAND = Command Name/Line DATA = Data+Stack (KiB) nsUTS= UTS namespace Inode * %CPU = CPU Usage nMaj = Major Page Faults PPID = Parent Process pid nMin = Minor Page Faults UID = Effective User Id nDRT = Dirty Pages Count RUID = Real User Id WCHAN = Sleeping in Function RUSER = Real User Name Flags = Task Flags <sched.h> SUID = Saved User Id CGROUPS = Control Groups SUSER = Saved User Name SUPGIDS = Supp Groups IDs GID = Group Id SUPGRPS = Supp Groups Names
r:调整一个正在运行的进程Nice值
PID to renice [default pid = 920]
PID to signal/kill [default pid = 19156]
3. vmstat -系统活动、硬件及系统信息
使用vmstat命令可以得到关于进程、内存、内存分页、堵塞IO、traps及CPU活动的信息。
r:表示运行队列(就是说多少个进程真的分配到CPU),我测试的服务器目前CPU比较空闲,没 什么程序在跑,当这个值超过了CPU数目,就会出现CPU瓶颈了。这个也和top的负载有关系,
一般负载超过了3就比较高,超过了5就高,超过了10就不正常了,服务器的状态很危险。top的负载类似每秒的运行队列。如果运行队列过大,表示你的CPU很繁忙,一般会造成CPU使用
率很高。
b:表示阻塞的进程,这个不多说,进程阻塞,大家懂的。
swpd:虚拟内存已使用的大小,如果大于0,表示你的机器物理内存不足了,如果不是程序内存泄露的原因,那么你该升级内存了或者把耗内存的任务迁移到其他机器。
swpd:虚拟内存已使用的大小,如果大于0,表示你的机器物理内存不足了,如果不是程序内存泄露的原因,那么你该升级内存了或者把耗内存的任务迁移到其他机器。
free:空闲的物理内存的大小,我的机器内存总共8G,剩余3415M。
buff:Linux/Unix系统是用来存储,目录里面有什么内容,权限等的缓存,我本机大概占用300多M
buff:Linux/Unix系统是用来存储,目录里面有什么内容,权限等的缓存,我本机大概占用300多M
cache:cache直接用来记忆我们打开的文件,给文件做缓冲,我本机大概占用300多M(这里是Linux/Unix的聪明之处,把空闲的物理内存的一部分拿来做文件和目录的缓存,是为了提高程序执
行的性能,当程序使用内存时,buffer/cached会很快地被使用。)
si:每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露了,要查找耗内存进程解决掉。我的机器内存充裕,一切正常。
so:每秒虚拟内存写入磁盘的大小,如果这个值大于0,同上。
bi:块设备每秒接收的块数量,这里的块设备是指系统上所有的磁盘和其他块设备,默认块大小是1024byte,我本机上没什么IO操作,所以一直是0,但是我曾在处理拷贝大量数据(2-3T)
bi:块设备每秒接收的块数量,这里的块设备是指系统上所有的磁盘和其他块设备,默认块大小是1024byte,我本机上没什么IO操作,所以一直是0,但是我曾在处理拷贝大量数据(2-3T)
的机器上看过可以达到140000/s,磁盘写入速度差不多140M每秒。
bo:块设备每秒发送的块数量,例如我们读取文件,bo就要大于0。bi和bo一般都要接近0,不然就是IO过于频繁,需要调整。
bo:块设备每秒发送的块数量,例如我们读取文件,bo就要大于0。bi和bo一般都要接近0,不然就是IO过于频繁,需要调整。
in:每秒CPU的中断次数,包括时间中断
cs:每秒上下文切换次数,例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的数目,例如在apache和
cs:每秒上下文切换次数,例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的数目,例如在apache和
nginx这种web服务器中,我们一般做性能测试时会进行几千并发甚至几万并发的测试,选择web服务器的进程可以由进程或者线程的峰值一直下调,压测,直到cs到一个比较小的值,这
个进程和线程数就是比较合适的值了。系统调用也是,每次调用系统函数,我们的代码就会进入内核空间,导致上下文切换,这个是很耗资源,也要尽量避免频繁调系统函数。上下文切换
次数过多表示你的CPU大部分浪费在上下文切换,导致CPU干正经事的时间少了,CPU没有充分利用,是不可取的。
us:用户CPU时间,我曾经在一个做加密解密很频繁的服务器上,可以看到us接近100,r运行队列达到80(机器在做压力测试,性能表现不佳)。
sy:系统CPU时间,如果太高,表示系统调用时间长,例如是IO操作频繁。
id:空闲 CPU时间,一般来说,id + us + sy = 100,一般我认为id是空闲CPU使用率,us是用户CPU使用率,sy是系统CPU使用率。
id:空闲 CPU时间,一般来说,id + us + sy = 100,一般我认为id是空闲CPU使用率,us是用户CPU使用率,sy是系统CPU使用率。
wt:等待IO CPU时间。
[[email protected] ~]# vmstat -m
Cache Num Total Size Pages
fuse_inode 10 10 768 10
nf_conntrack_ffff88001a2d8000 0 0 320 12
nf_conntrack_ffffffff81a25e00 180 180 320 12
kcopyd_job 0 0 3312 9
dm_uevent 0 0 2608 12
dm_rq_target_io 0 0 136 30
每隔3秒5次:
[[email protected] ~]# vmstat 3 5
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 539680 17040 8 234828 508 252 7085 420 84 176 6 4 86 4 0
0 0 539680 17040 8 234828 0 0 0 0 29 53 0 0 100 0 0
1 0 539680 17040 8 234828 0 0 0 0 31 58 0 0 100 0 0
0 0 539680 17008 8 234828 0 0 0 0 34 67 0 0 100 0 0
1 0 539680 16668 8 234828 0 0 0 0 71 151 1 2 97 0 0
4. w - 显示谁已登录
w命令显示系统当前用户及其运行进程的信息。
[[email protected] ~]# w root
12:26:14 up 2 days, 19:45, 3 users, load average: 0.05, 0.12, 0.13
USER TTY FROM [email protected] IDLE JCPU PCPU WHAT
root :0 :0 Sat23 ?xdm? 1:08m 0.65s gdm-session-worker [pam/gdm-password]
root pts/0 192.168.56.1 Sun22 4:35m 0.61s 0.00s lsof
root pts/1 192.168.56.1 11:09 6.00s 0.20s 0.01s w root
5. uptime - 告诉系统已经运行了多久
uptime命令过去只显示系统运行多久。现在,可以显示系统运行多久、当前有多少的用户登录、在过去的1,5,15分钟里平均负载时多少。
[[email protected] ~]# uptime
12:30:39 up 2 days, 19:49, 3 users, load average: 0.06, 0.08, 0.12
何为系统负载呢?
系统平均负载被定义为在特定时间间隔内运行队列中的平均进程树。如果一个进程满足以下条件则其就会位于运行队列中:
- 它没有在等待I/O操作的结果
- 它没有主动进入等待状态(也就是没有调用‘wait‘)
- 没有被停止(例如:等待终止)
一般来说,每个CPU内核当前活动进程数不大于3,则系统运行表现良好!当然这里说的是每个cpu内核,也就是如果你的主机是四核cpu的话,那么只要uptime最后输出的一串字符数值小于12即表示系统负载不是很严重。当然如果达到20,那就表示当前系统负载非常严重。
系统平均负载被定义为在特定时间间隔内运行队列中的平均进程树。如果一个进程满足以下条件则其就会位于运行队列中:
- 它没有在等待I/O操作的结果
- 它没有主动进入等待状态(也就是没有调用‘wait‘)
- 没有被停止(例如:等待终止)
一般来说,每个CPU内核当前活动进程数不大于3,则系统运行表现良好!当然这里说的是每个cpu内核,也就是如果你的主机是四核cpu的话,那么只要uptime最后输出的一串字符数值小于12即表示系统负载不是很严重。当然如果达到20,那就表示当前系统负载非常严重。
6. ps - 显示进程
Linux中的ps命令是Process Status的缩写。ps命令用来列出系统中当前运行的那些进程。ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻的那些进程,如果想要动态的显示进程信息,就可以使用top命令。
要对进程进行监测和控制,首先必须要了解当前进程的情况,也就是需要查看当前进程,而 ps 命令就是最基本同时也是非常强大的进程查看命令。使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多的资源等等。总之大部分信息都是可以通过执行该命令得到的。
ps为我们提供了进程的一次性的查看,它所提供的查看结果并不动态连续的;如果想对进程时间监控,应该用 top 工具。
要对进程进行监测和控制,首先必须要了解当前进程的情况,也就是需要查看当前进程,而 ps 命令就是最基本同时也是非常强大的进程查看命令。使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多的资源等等。总之大部分信息都是可以通过执行该命令得到的。
ps为我们提供了进程的一次性的查看,它所提供的查看结果并不动态连续的;如果想对进程时间监控,应该用 top 工具。
linux上进程有5种状态:
1. 运行(正在运行或在运行队列中等待)
2. 中断(休眠中, 受阻, 在等待某个条件的形成或接受到信号)
2. 中断(休眠中, 受阻, 在等待某个条件的形成或接受到信号)
3. 不可中断(收到信号不唤醒和不可运行, 进程必须等待直到有中断发生)
4. 僵死(进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放)
5. 停止(进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行运行)
R 运行 runnable (on run queue)
ps工具标识进程的5种状态码:
R 运行 runnable (on run queue)
S 中断 sleeping
T 停止 traced or stopped
Z 僵死 a defunct (”zombie”) process
[[email protected] ~]# ps aux
[[email protected] ~]# ps -lA
[[email protected] ~]# ps axjf
参数:
-A :所有的 process 均显示出来,与 -e 具有同样的效用;
-a :不与 terminal 有关的所有 process ;
-u :有效使用者 (effective user) 相关的 process ;
x :通常与 a 这个参数一起使用,可列出较完整信息。
输出格式规划:
l :较长、较详细的将该 PID 的的信息列出;
j :工作的格式 (jobs format)
-f :做一个更为完整的输出。
特别说明:由于 ps 能够支持的 OS 类型相当的多,所以他的参数多的离谱!而且有没有加上 - 差很多!详细的用法应该要参考 man ps。
例1.将目前属于您自己这次登入的 PID 与相关信息列示出来
[[email protected] ~]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 19160 19156 0 80 0 - 29172 wait pts/1 00:00:00 bash
0 R 0 20465 19160 0 80 0 - 34343 - pts/1 00:00:00 ps
上面这个信息其实很多,各相关信息的意义为:
F:代表这个程序的flag,4代表使用者为super user
S:代表这个程序的状态
PID:这个程序的ID
C:CPU 使用的资源百分比
PRI:这个是 Priority (优先执行序) 的缩写
NI:这个是 Nice 值
ADDR:这个是 kernel function,指出该程序在内存的那个部分。如果是个 running的程序,一般就是『 - 』的啦!
SZ:使用掉的内存大小
WCHAN:目前这个程序是否正在运作当中,若为 - 表示正在运作
TTY:登入者的终端
TIME:使用掉的CPU时间
CMD:所下达的指令
例2.列出目前所有的正在内存当中的程序
[[email protected] ~]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.8 191492 4300 ? Ss May20 0:28 /usr/lib/systemd/systemd以上是关于Linux 性能监控之命令行工具的主要内容,如果未能解决你的问题,请参考以下文章