1. 任务查看器top命令 - 系统负载,进程占用CPU
使用top命令,查看当前系统的使用信息和负载,查看linux中各个进程的信息,可以看出每个进程cpu的使用情况,内存的占用情况等等一些有价值的信息。
1.1. 系统区域
top - 21:23:08 up 28 min, 2 users, load average: 0.04, 0.08, 0.29
Tasks: 121 total, 2 running, 119 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 1863032 total, 569728 free, 407688 used, 885616 buff/cache
KiB Swap: 2097148 total, 2097148 free, 0 used. 1258088 avail Mem
-
第一行综合负载信息
- 21:23:08 是上一次统计时间,每个一段时间会自动更新一次,比如 3 秒钟。
- up 28 min,表示系统自从上一次启动之后的运行时间,由于我是在虚拟机里进行测试,时间比较短,这里是28分钟。线上生产环境的机器往往都是以 days 为单位。比如 up 120 days
- load average:系统最近1分钟,5分钟 和 15分钟的平均负载;三个负载信息分别表示:1分钟、5分钟、15分钟内系统的平均负荷。判断系统负荷是否过重,必须理解load average的真正含义。
- 当CPU的系统负荷为0,意味CPU负载0
- 系统负荷为0.5,意味着CPU占用50%
- 系统负荷为1.7,意味着CPU已经满负荷工作100%,后面等着上70%工作任务。
- 第一行综合信息通过 uptime 获取到。
-
第二行是进程信息
- total:表示已经启动的进程总数。
- running:正在运行的进程数。
- sleeping: 正在休眠的进程数。
- stoped:停止运行的进程数。
- zombile:僵尸进程总数(TODO 进一步解释)
-
第三行是CPU信息
- us:用户空间占用CPU百分比
- sy:系统内核空间占用CPU百分比
- ni:用户进程空间内改变过优先级的进程占用CPU百分比
- id:空闲CPU百分比。
- wa:等待输入输出的CPU时间百分比
- hi:硬中断的时间百分比
- si:软中断的时间百分比
- st:运行虚拟机所消耗的真实CPU时间百分比,如果没有虚拟机运行该值为0.
-
第四行是内存信息,以字节为单位,total = free used buff/cache
- total,可用物理内存的总的空间大小。
- free,可用物理内存的剩余空间大小。
- used,已经使用的物理内存的空间大小。
- buff/cache,表示 buff 和 cache 之和,他们都是系统所使用的内存,buff 是内核使用的内存空间大小,用于速度不对等时数据传输的缓冲区,cache 是 Page Cache 和 Slab 使用的内存,用户缓存数据结果。在其他程序需要内存时,这部分空间会被释放。
Avail Mem ,在不进行交换的情况下, 有空多少空闲内存可使用使用的估算值, 3.14内核以上才有。
-
第五行是内存交换空间信息
- total,交换内存空间大小,一般大于物理内存空间。
- free,空闲的交换空间大小。
- used,已经使用的交换空间大小。
1.2. 进程信息区域
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 128596 7260 4196 S 0.0 0.4 0:01.58 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
4 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
5 root 20 0 0 0 0 S 0.0 0.0 0:00.07 kworker/u256:0
6 root 20 0 0 0 0 S 0.0 0.0 0:00.02 ksoftirqd/0
7 root rt 0 0 0 0 S 0.0 0.0 0:00.02 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.22 rcu_sched
第二个区域为进程信息,另外也可以通过 top -H pid 查看一个进程中的线程信息。
- PID:进程ID。
- USER:启动进程锁使用的用户名。
- PR:进程的优先级,由系统内核动态调整,值越低,优先级越高,越容易获得CPU资源。
- NI:进程的 NICE 值,对于普通进程,RP值是在NI基础之上加 20,该值可以由用户调节,比如使用命令 renice -10 -p 。
- VIRT:进程所占用的虚拟内存大小,以 KB为单位。
- RES:进程所用的,未被换出物理内存的大小,以KB为单位。
- SHR:进程所占用的共享内存的大小,以KB为单位。
- S: 表示进程的运行状态,S 代表睡眠状态,其余的值还有 D:不可中断的随眠状态,R:运行中,T:跟踪/停止,Z:僵尸状态。
- %CPU:进程当前占用的CPU资源比例。
- %MEM:进程当前占用内存资源比例。
- TIME :进程总计使用的CPU时间。
- COMMAND:启动进程的程序或命令。
1.3. top交互态命令
h
用于帮助信息Z,B,E,e Global: 'Z' colors; 'B' bold; 'E'/'e' summary/task memory scale l,t,m Toggle Summary: 'l' load avg; 't' task/cpu stats; 'm' memory info 0,1,2,3,I Toggle: '0' zeros; '1/2/3' cpus or numa node views; 'I' Irix mode f,F,X Fields: 'f'/'F' add/remove/order/sort; 'X' increase fixed-width R,H,J,C . Toggle: 'R' Sort; 'H' Threads; 'J' Num justify; 'C' Coordinates
0
将0参数的隐藏;1,2,3
用于显示cpu视图或num节点状态;l
、t
、m
: 切换负载、任务、内存信息的显示c
: 触发命令详细执行d
或s
: 设置显示的刷新间隔
当按下d
或s
时,你将被提示输入一个值(以秒为单位),它会以设置的值作为刷新间隔。如果你这里输入了1,top将会每秒刷新。
1.4. top常用命令
# 查看系统进程的线程及统计信息
$ top -H -p 967496
Threads: 56 total, 0 running, 56 sleeping, 0 stopped, 0 zombie
%Cpu(s): 42.3 us, 0.3 sy, 0.0 ni, 57.1 id, 0.0 wa, 0.2 hi, 0.1 si, 0.0 st
MiB Mem : 514140.2 total, 297172.7 free, 210791.2 used, 6176.3 buff/cache
MiB Swap: 0.0 total, 0.0 free, 0.0 used. 296216.3 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
3385696 root 20 0 727220 38364 11228 S 0.7 0.0 128:19.03 gobgpd
3385713 root 20 0 727220 38364 11228 S 0.7 0.0 126:19.00 gobgpd
2548928 root 20 0 727220 38364 11228 S 0.7 0.0 89:11.99 gobgpd
3382210 root 20 0 727220 38364 11228 S 0.3 0.0 120:16.27 gobgpd
3385577 root 20 0 727220 38364 11228 S 0.3 0.0 135:23.85 gobgpd
# 查看系统程序执行命令
$ top -c
# 查看系统程序执行命令
$ top -c
# 查看系统cpu核心使用情况
$ top -1
#top进入交互态后,f进行排序和显示选择, 选择需要排序的顺序按s;选择需要显示或不显示的按d或空格;
$ top / f / Down / d / q #这里选择线程数和最后使用cpu作为显示;退出后,发现多了两列nTH和P,范别代表线程数和最后使用CPU;
* nTH = Number of Threads
* P = Last Used Cpu (SMP)
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND nTH P
4189935 root 20 0 258.4g 0.4g 0.0g S 2491 0.1 5860:52 ./xxx 32 2
3920573 root 20 0 4.6g 1.6g 0.0g R 192.7 0.3 4043:31 test-system 13 33
2. ps命令
ps aux | grep nginx
VSZ -- 虚拟地址空间大小 --> 与top 的 VIRT 对应
RSS -- 实际物理内存大小 --> 与top 的 RES 对应
aux a-所有用户, x-运行, 结合才能列出所有pid 信息,u-user 信息,例如cpu,mem, tty, stat, 等信息,BSD 格式
ef 选项: 使用标准格式显示每一个进程。 有一个PPID, 与aux BSD格式显示方式不同。
- 这里给出定期查看系统进程脚本
#!/bin/bash
#查看内存占用前5的进程及占用量
LOGFILE=/tmp/top_mem_usage.log
COUNTER=0
MAX_COUNT=144 # 最大循环次数
while true
do
((COUNTER++))
if [ $COUNTER -gt $MAX_COUNT ]; then
echo "Reached max count $MAX_COUNT, exiting"
break
fi
# 获取内存占用前5进程
PS_OUTPUT=$(ps aux --sort=-rss | head -n 6)
# 构造日志内容,包含计数器值
LOG_CONTENT="Count: ${COUNTER}\n${PS_OUTPUT}\n\n"
# 日志写入
echo -e "${LOG_CONTENT}" >> ${LOGFILE}
sleep 600
done
3. cat /proc/pid/status
linux查看某个进程内存占用情况以及/proc/pid/status解释
pid 是你关心的进程pid,例如nginx进程 。其中的
VmRss --> Rss
VmSize --> VSZ
三种方法可以互相对照, 结果是一样的。
- /proc/pid/status解释
$ cat /proc/9744/status
Name: gedit /*进程的程序名*/
State: S (sleeping) /*进程的状态信息,具体参见http://blog.chinaunix.net/u2/73528/showart_1106510.html*/
Tgid: 9744 /*线程组号*/
Pid: 9744 /*进程pid*/
PPid: 7672 /*父进程的pid*/
TracerPid: 0 /*跟踪进程的pid*/
Uid: 1000 1000 1000 1000 /*uid euid suid fsuid*/
Gid: 1000 1000 1000 1000 /*gid egid sgid fsgid*/
FDSize: 256 /*文件描述符的最大个数,file->fds*/
Groups: 0 4 20 24 25 29 30 44 46 107 109 115 124 1000 /*启动该进程的用户所属的组的id*/
VmPeak: 60184 kB /*进程地址空间的大小*/
VmSize: 60180 kB /*进程虚拟地址空间的大小reserved_vm:进程在预留或特殊的内存间的物理页*/
VmLck: 0 kB /*进程已经锁住的物理内存的大小.锁住的物理内存不能交换到硬盘*/
VmHWM: 18020 kB /*文件内存映射和匿名内存映射的大小*/
VmRSS: 18020 kB /*应用程序正在使用的物理内存的大小,就是用ps命令的参数rss的值 (rss)*/
VmData: 12240 kB /*程序数据段的大小(所占虚拟内存的大小),存放初始化了的数据*/
VmStk: 84 kB /*进程在用户态的栈的大小*/
VmExe: 576 kB /*程序所拥有的可执行虚拟内存的大小,代码段,不包括任务使用的库 */
VmLib: 21072 kB /*被映像到任务的虚拟内存空间的库的大小*/
VmPTE: 56 kB /*该进程的所有页表的大小*/
Threads: 1 /*共享使用该信号描述符的任务的个数*/
SigQ: 0/8183 /*待处理信号的个数/目前最大可以处理的信号的个数*/
SigPnd: 0000000000000000 /*屏蔽位,存储了该线程的待处理信号*/
ShdPnd: 0000000000000000 /*屏蔽位,存储了该线程组的待处理信号*/
SigBlk: 0000000000000000 /*存放被阻塞的信号*/
SigIgn: 0000000000001000 /*存放被忽略的信号*/
SigCgt: 0000000180000000 /*存放被俘获到的信号*/
CapInh: 0000000000000000 /*能被当前进程执行的程序的继承的能力*/
CapPrm: 0000000000000000 /*进程能够使用的能力,可以包含CapEff中没有的能力,这些能力是被进程自己临时放弃的*/
CapEff: 0000000000000000 /*是CapPrm的一个子集,进程放弃没有必要的能力有利于提高安全性*/
Cpus_allowed: 01 /*可以执行该进程的CPU掩码集*/
Mems_allowed: 1 /**/
voluntary_ctxt_switches: 1241 /*进程主动切换的次数*/
nonvoluntary_ctxt_switches: 717 /*进程被动切换的次数*/
4. Sysstat
pidstat是sysstat工具的一个命令,用于监控全部或指定进程的cpu、内存、线程、设备IO等系统资源的占用情况。pidstat首次运行时显示自系统启动开始的各项统计信息,之后运行pidstat将显示自上次运行该命令以后的统计信息。用户可以通过指定统计的次数和时间来获得所需的统计信息。
sysstat 工具包中除了pidstat,还包含iostat、mpstat、sa 等工具。
-
在Debian/Ubuntu系统中可以使用下面的命令来安装
$ apt-get install sysstat
-
CentOS/Fedora/RHEL版本的linux中则使用下面的命令:
$ yum install -y sysstat
4.1. 使用pidstat查看总体统计
pidstat 是sysstat软件套件的一部分,sysstat包含很多监控linux系统状态的工具,它能够从大多数linux发行版的软件源中获得。
使用pidstat不加任何参数等价于加上-p参数,但是只有正在活动的任务会被显示出来。
$ pidstat
Linux 3.10.0-1160.el7.x86_64 (localhost.localdomain) 2022年08月13日 _x86_64_ (2 CPU)
21时42分29秒 UID PID %usr %system %guest %CPU CPU Command
21时42分29秒 0 1 0.01 0.04 0.00 0.06 1 systemd
21时42分29秒 0 5 0.00 0.01 0.00 0.01 0 kworker/u256:0
21时42分29秒 0 6 0.00 0.00 0.00 0.00 0 ksoftirqd/0
21时42分29秒 0 7 0.00 0.00 0.00 0.00 0 migration/0
21时42分29秒 0 9 0.00 0.01 0.00 0.01 1 rcu_sched
21时42分29秒 0 11 0.00 0.00 0.00 0.00 0 watchdog/0
- PID 被监控的任务的进程号
- %usr 当在用户层执行(应用程序)时这个任务的cpu使用率,和 nice 优先级无关。注意这个字段计算的cpu时间不包括在虚拟处理器中花去的时间。
- %system 这个任务在系统层使用时的cpu使用率。
- %guest 任务花费在虚拟机上的cpu使用率(运行在虚拟处理器)。
- %CPU 任务总的cpu使用率。在SMP环境(多处理器)中,如果在命令行中输入-I参数的话,cpu使用率会除以你的cpu数量。
- CPU 正在运行这个任务的处理器编号。
- Command 这个任务的命令名称。
4.2. I/O 统计数据
通过使用-d
参数来得到I/O的统计数据。比如:
[root@localhost ~]# pidstat -d -p 1290
Linux 3.10.0-1160.el7.x86_64 (localhost.localdomain) 2022年08月13日 _x86_64_ (2 CPU)
21时53分29秒 UID PID kB_rd/s kB_wr/s kB_ccwr/s Command
21时53分29秒 0 1290 1.20 0.00 0.00 NetworkManager
IO 输出会显示一些内的条目:
- kB_rd/s 任务从硬盘上的读取速度(kb)
- kB_wr/s 任务向硬盘中的写入速度(kb)
- kB_ccwr/s 任务写入磁盘被取消的速率(kb)
4.3. 内存使用和页面失败
使用-r
标记你能够得到内存使用情况的数据。
[root@localhost ~]# pidstat -r -p 1290
Linux 3.10.0-1160.el7.x86_64 (localhost.localdomain) 2022年08月13日 _x86_64_ (2 CPU)
21时55分01秒 UID PID minflt/s majflt/s VSZ RSS %MEM Command
21时55分01秒 0 1290 0.76 0.01 474808 8780 0.47 NetworkManager
-
重要的条目:
- minflt/s 从内存中加载数据时每秒出现的小的错误的数目,这些不要求从磁盘载入内存页面。
- majflt/s 从内存中加载数据时每秒出现的较大错误的数目,这些要求从磁盘载入内存页面。
- VSZ 虚拟容量:整个进程的虚拟内存使用(kb)
- RSS 长期内存使用:任务的不可交换物理内存的使用量(kb)
4.4. 举例
-
你可以通过使用下面的命令来监测内存使用
# pidstat -r 2 5
这会给你5份关于page faults的统计数据结果,间隔2秒。这将会更容易的定位出现问题的进程。
-
显示所有mysql服务器的子进程
# pidstat -T CHILD -C mysql
-
将所有的统计数据结合到一个便于阅读的单一报告中,U表示用户,r表示内存,d表示IO使用:
# pidstat -Urd -h
5. 查看磁盘、文件和文件夹大小
当磁盘大小超过标准时会有报警提示,使用df和du命令可能发现问题的所在。
df:可以查看一级文件夹大小、使用比例、档案系统及其挂入点,但对文件却无能为力。
du:可以查看文件及文件夹的大小。
- df查看个挂入点的情况:
root@ubuntu:/etc# df -h
Filesystem Size Used Avail Use% Mounted on
udev 470M 0 470M 0% /dev
tmpfs 98M 11M 87M 11% /run
/dev/sda1 19G 3.5G 15G 20% /
tmpfs 488M 0 488M 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 488M 0 488M 0% /sys/fs/cgroup
tmpfs 98M 0 98M 0% /run/user/1000
- 磁盘的空间报警以后,想查找哪个目录哪个文件占了最多的空间,可以是用du命令:
$ du -h --max-depth=1
#列出了当前当前目录下的文件夹的大小:
224K ./fonts
772K ./syntaxhighlighter
400K ./css
752K ./js
5.5M ./img
7.6M .
6. 查看内存占用情况
[root@localhost ~]# free -ht
total used free shared buff/cache available
Mem: 1.8G 397M 556M 9.6M 864M 1.2G
Swap: 2.0G 0B 2.0G
Total: 3.8G 397M 2.5G
7. 网络情况
7.1. iftop
iftop命令可以用来监控网卡的实时流量(可以指定网段)、反向解析IP、显示端口信息等,详细的将会在后面的使用参数中说明。
7.1.1. 安装iftop命令
# 安装依赖
$ yum install flex byacc libpcap ncurses ncurses-devel libpcap-devel
$ yum install -y iftop
7.1.2. iftop运行命令参考界面如下图:
12.5Kb 25.0Kb 37.5Kb 50.0Kb 62.5Kb
└────────────────────┴────────────────────┴────────────────────┴────────────────────┴─────────────────────
192.168.197.129 => 192.168.197.1 608b 845b 948b
<= 184b 552b 418b
192.168.197.129 => 192.168.197.2 0b 0b 54b
<= 0b 0b 75b
──────────────────────────────────────────────────────────────────────────────────────────────────────────
TX: cum: 3.92KB peak: 2.16Kb rates: 608b 845b 0.98Kb
RX: 1.92KB 1.80Kb 184b 552b 493b
TOTAL: 5.84KB 3.70Kb 792b 1.36Kb 1.46Kb
- 不进行DNS反解析:iftop -n -i eth0
- =>代表发送数据
- <=代表接收数据
- TX:发送
- RX:接受
- TOTAL:全部的流量
- cum:目前累积流量
- peak:峰值流量
- rates:平均值,2秒,10秒,40秒的平均流量
- t 切换显示状态,接受、发送数据
- p 显示端口
7.1.3. iftop常用命令参数
-i 设定监测的网卡,如:# iftop -i eth1
-B 以bytes为单位显示流量(默认是bits),如:# iftop -B
-n 使host信息默认直接都显示IP,如:# iftop -n
-N 使端口信息默认直接都显示端口号,如: # iftop -N
-F 显示特定网段的进出流量,如# iftop -F 10.10.1.0/24或# iftop -F 10.10.1.0/255.255.255.0
-h(display this message),帮助,显示参数信息
-p 使用这个参数后,中间的列表显示的本地主机信息,出现了本机以外的IP信息;
-b 使流量图形条默认就显示;
-f 这个暂时还不太会用,过滤计算包用的;
-P 使host信息及端口信息默认就都显示;
-m 设置界面最上边的刻度的最大值,刻度分五个大段显示,例:# iftop -m 100M
进入iftop画面后的一些操作命令(注意大小写)
按 h 切换是否显示帮助;
按 n 切换显示本机的IP或主机名;
按 s 切换是否显示本机的host信息;
按 d 切换是否显示远端目标主机的host信息;
按 t 切换显示格式为2行/1行/只显示发送流量/只显示接收流量;
按 N 切换显示端口号或端口服务名称;
按 S 切换是否显示本机的端口信息;
按 D 切换是否显示远端目标主机的端口信息;
按 p 切换是否显示端口信息;
按 P 切换暂停/继续显示;
按 b 切换是否显示平均流量图形条;
按 B 切换计算2秒或10秒或40秒内的平均流量;
按 T 切换是否显示每个连接的总流量;
按 l 打开屏幕过滤功能,输入要过滤的字符,比如ip,按回车后,屏幕就只显示这个IP相关的流量信息;
按 L 切换显示画面上边的刻度;刻度不同,流量图形条会有变化;
按 j 或按 k 可以向上或向下滚动屏幕显示的连接记录;
按 1 或 2 或 3 可以根据右侧显示的三列流量数据进行排序;
按 < 根据左边的本机名或IP排序;
按 > 根据远端目标主机的主机名或IP排序;
按 o 切换是否固定只显示当前的连接;
按 f 可以编辑过滤代码,这是翻译过来的说法,我还没用过这个!
按 ! 可以使用shell命令,这个没用过!没搞明白啥命令在这好用呢!
按 q 退出监控
7.2. nethogs
7.2.1. nethogs命令安装
nethogs工具可以帮助我们很方便的查看当前系统中的进程使用网络的情况,这有助于我们找到当前系统中的网络瓶颈。nethogs命令需要首先安装,我们首先来下载
nethogs工具,执行命令:wget https://github.com/raboof/nethogs/archive/vXX.XX.XX.tar.gz
因此,我们尽量不要使用该版本的nethogs。
在下载下nethogs工具后,我们首先安装nethogs工具的依赖包,执行命令:
yum install -y libpcap libpcap-devel
之后,我们将该压缩包解压,如下所示:
该源码包不需要进行预编译过程,执行编译和安装即可,我们执行命令:
make && make install
即可完成nethogs工具的安装。
7.2.2. nethogs命令使用
nethogs安装完成后,nethogs命令会出现在/usr/local/sbin/目录下,我们直接执行命令:
nethogs
即可查看当前使用网络的进程,该命令执行结果如下所示:
从上图中可以看出,我们可以借助nethogs工具,查看当前系统中所有使用网络的进程了,借此可以分析当前系统中的网络瓶颈。
8. 基础性能排障实例
-
先用
top
命令看linux系统总体的cpu使用情况
如果有异常,用pidstat -p
查看细粒度的各个进程的cpu使用情况;否则,转向下一步。 -
用
pidstat -r
命令查看linux系统总体的内存使用情况
如果有异常,用pidstat -r -p 1290
查看细粒度的各个进程的内存使用情况;否则,转向下一步。 -
用
pidstat -d
命令查看linux系统总体的IO使用情况
如果有异常,用pidstat -r -p 1290
查看细粒度的各个进程的IO使用情况;否则,转向下一步。 -
用
iftop
命令查看linux系统总体的网络使用情况
如果有异常,用nethogs
查看细粒度的各个进程的网络带宽使用情况。