Linux 必知必会
1、整理状态 TOP
查看整机状态
[root@centos ~]# top
执行结果(是动态的):
top - 23:05:50 up 103 days, 1:03, 1 user, load average: 0.00, 0.01, 0.05
Tasks: 107 total, 1 running, 106 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.3 sy, 0.0 ni, 99.3 id, 0.3 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 1016516 total, 66388 free, 338992 used, 611136 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 501404 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
583 root 20 0 555744 11344 688 S 0.3 1.1 10:44.68 tuned
1 root 20 0 188548 2548 1320 S 0.0 0.3 7:45.21 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:01.41 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 1:38.48 ksoftirqd/0
5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
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 6:39.63 rcu_sched
10 root rt 0 0 0 0 S 0.0 0.0 0:28.19 watchdog/0
12 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kdevtmpfs
13 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 netns
14 root 20 0 0 0 0 S 0.0 0.0 0:01.53 khungtaskd
15 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 writeback
16 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kintegrityd
17 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 bioset
18 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kblockd
19 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 md
25 root 20 0 0 0 0 S 0.0 0.0 0:20.30 kswapd0
26 root 25 5 0 0 0 S 0.0 0.0 0:00.00 ksmd
27 root 39 19 0 0 0 S 0.0 0.0 0:25.36 khugepaged
28 root 20 0 0 0 0 S 0.0 0.0 0:00.00 fsnotify_mark
29 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 crypto
37 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kthrotld
39 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kmpath_rdacd
40 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kpsmoused
41 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 ipv6_addrconf
60 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 deferwq
104 root 20 0 0 0 0 S 0.0 0.0 0:15.53 kauditd
第一行,任务队列信息,同 uptime 命令的执行结果
系统时间:23:05:50
运行时间:up 103 days,
当前登录用户: 1 user
负载均衡: load average: 0.00, 0.01, 0.05
average后面的三个数分别是1分钟、5分钟、15分钟的负载情况。
load average数据是每隔5秒钟检查一次活跃的进程数,然后按特定算法计算出的数值。如果这个数除以逻辑CPU的数量,结果高于5的时候就表明系统在超负荷运转了
第二行,Tasks — 任务(进程)
107 total, 1 running, 106 sleeping, 0 stopped, 0 zombie
总进程:107 total, 运行:1 running, 休眠:106 sleeping, 停止: 0 stopped, 僵尸进程: 0 zombie
第三行,cpu状态信息
按键盘数字1会展开具体CPU核数。
0.0 us, 0.3 sy, 0.0 ni, 99.3 id, 0.3 wa, 0.0 hi, 0.0 si, 0.0 st
0.0%us【user space】— 用户空间占用CPU的百分比。
0.3%sy【sysctl】— 内核空间占用CPU的百分比。
0.0%ni【】— 改变过优先级的进程占用CPU的百分比
99.3%id【idolt】— 空闲CPU百分比
0.3%wa【wait】— IO等待占用CPU的百分比
0.0%hi【Hardware IRQ】— 硬中断占用CPU的百分比
0.0%si【Software Interrupts】— 软中断占用CPU的百分比
0.0%st 实时中断CPU的百分比
第四行,内存状态
KiB Mem : 1016516 total, 66388 free, 338992 used, 611136 buff/cache
1016516 total, 66388 k free, 338992 k used, 611136 k buffers【缓存的内存量】
第五行,swap交换分区信息
KiB Swap: 0 total, 0 free, 0 used. 501404 avail Mem
0k total, 0k free, 0k used, 501404 k cached【缓冲的交换区总量】
备注:
可用内存=free + buffer + cached
对于内存监控,在top里我们要时刻监控第五行swap交换分区的used,如果这个数值在不断的变化,说明内核在不断进行内存和swap的数据交换,这是真正的内存不够用了。
第四行中使用中的内存总量(used)指的是现在系统内核控制的内存数,
第四行中空闲内存总量(free)是内核还未纳入其管控范围的数量。
纳入内核管理的内存不见得都在使用中,还包括过去使用过的现在可以被重复利用的内存,内核并不把这些可被重新使用的内存交还到free中去,因此在linux上free内存会越来越少,但不用为此担心。
2、CPU状态 vmstat
vmstat -n 3 5
运行结果:
[root@centos ~]# vmstat -n 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
4 0 0 76036 108356 490940 0 0 7 29 1 4 0 0 99 0 0
0 0 0 76036 108356 490940 0 0 0 137 135 211 0 0 100 0 0
0 0 0 75684 108356 490960 0 0 0 16 133 274 1 0 99 0 0
0 0 0 75684 108356 490964 0 0 0 0 111 235 0 0 100 0 0
0 0 0 75716 108356 490964 0 0 0 25 132 282 1 1 99 0 0
vmstat -n 3 5
第一个参数表示采样的世界间隔数单位是秒,第二个参数是采样的次数。
表示每3秒采样5次。
结果解读:
procs
r
:运行和等待CPU时间片的进程数,原则上1核的CPU的运行队列不要超过2,整个系统的运行队列不能超过总核数的2倍,否则代表系统压力过大。b
:等待资源的进程数,比如正在等待磁盘I/O、网络I/O等。
CPU
us
:用户进程消耗CPU时间百分比,us值高,用户进程消耗CPU时间多,如果长期大于50%,优化程序;sy
:内核进程消耗的CPU时间百分比;id
:空闲时间(包括IO等待时间),中央处理器的空闲时间 。以百分比表示。 低于60%,开始有压力了。wa
:等待IO时间。
memory
swpd
:使用虚拟内存大小 。free
:可用内存大小 。buff
:用作缓冲的内存大小 。cache
:用作缓存的内存大小。
Swap:
si
: 每秒从交换区写到内存的大小。so
: 每秒写入交换区的内存大小。
IO:(现在的Linux版本块的大小为1024bytes)
bi
: 每秒读取的块数 。bo
: 每秒写入的块数 。bi,bo长期不等于0,表示IO压力较大。
系统:
in
: 每秒中断数,包括时钟中断。【interrupt】cs
: 每秒上下文切换数。 【count/second】
其他参数:
# -a 活跃和非活跃的都显示,信息来自/proc/stat中的processes字段
vmstat -a 3 5
# -s 查看内存使用详细情况,信息的分别来自于/proc/meminfo,/proc/stat和/proc/vmstat
vmstat -s
# -d 查看磁盘读写情况,信息来自于/proc/diskstats.
vmstat -d
# -p 查看指定分区的磁盘读写情况,信息来自于/proc/diskstats
vmstat -p /dev/sda1
# -m 查看系统slab信息,信息来自于/proc/slabinfo
vmstat -m
其他命令:
查看所有cpu核信息:
mpstat -P ALL 2
进程使用cpu的用量分解信息
pidstat -u 1 -p 进程编号
3、内存 free
free -m # 以Mb为单位查看
free -g # 以Gb为单位查看
应用可用内存/系统物理内存 < 20% ,需要增加内存。
pidstat -p 进程编号 -r 采样隔间频率(秒)
4、硬盘 df
df -h
示例:
[root@centos ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 50G 8.8G 38G 19% /
devtmpfs 487M 0 487M 0% /dev
tmpfs 497M 24K 497M 1% /dev/shm
tmpfs 497M 316K 497M 1% /run
tmpfs 497M 0 497M 0% /sys/fs/cgroup
tmpfs 100M 0 100M 0% /run/user/0
5、磁盘 io
iostat -xdk 2 3
如果出现-bash: xxxstat: command not found
,可用先安装系统性能监控工具:
[root@centos ~]# yum install sysstat
[root@centos ~]# iostat -xdk 2 1
Linux 3.10.0-514.26.2.el7.x86_64 (VM_0_13_centos) 11/06/2020 _x86_64_ (1 CPU)
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
vda 0.00 2.89 0.19 3.22 6.67 29.04 20.93 0.03 7.40 5.49 7.51 0.47 0.16
scd0 0.00 0.00 0.00 0.00 0.00 0.00 11.12 0.00 0.35 0.35 0.00 0.33 0.00
磁盘块设备分布:
rkB/s 每秒读取数据量 kB;
wkB/s 每秒写入数据量 kB;
svctm :I/O请求的平均服务时间,单位毫秒;
await:I/O请求的平均等待时间,单位毫秒;值越小,性能越好。
util :一秒中百分之几的使用用于IO操作。接近100%时,表示磁盘带宽跑满,需要优化程序或增加磁盘。
rkB/s、wkB/s 根据系统应用不同会有不同的值,但有规律遵循;长期、超大数据量读写一般认为不正常。
svctm 和 await 二者的值很接近,表示几乎没有I/O等待,磁盘性能好,如果await 的值高于 svctm 的值,则表示I/O队列等待太长,需要优化程序或更换磁盘。
也可以使用pidstat
pidstat -d 采样间隔秒数 -p 进程号
6、网络 io
ifstat
ifstat 用于报告接口状态,是一个网络流量监测程序。该命令需要手动安装。
ifstat官网: http://gael.roualland.free.fr/ifstat/
wget http://gael.roualland.free.fr/ifstat/ifstat-1.1.tar.gz
tar-zxvf ifstat-1.1.tar.gz
cd ifstat-1.1
./configure # 默认会安装到/usr/local/bin/目录中
make
make install
常用参数:
-p | 优化打印 |
---|---|
-a | 忽略历史记录 |
-e | 显示错误信息 |
-r | 重置历史记录 |
类似的流量监控还有:
iftop
安装依赖:
CentOS上安装所需依赖包:
yum install flex byacc libpcap ncurses ncurses-devel libpcap-devel
Debian上安装所需依赖包:
apt-get install flex byacc libpcap0.8 libncurses5
下载安装包并编译安装:
wget http://www.ex-parrot.com/pdw/iftop/download/iftop-0.17.tar.gz
tar zxvf iftop-0.17.tar.gz
cd iftop-0.17
./configure
make && make install
常用参数:
iftop -i eth1 #设定监测的网卡,
iftop -B # 以bytes为单位显示流量(默认是bits),
iftop -n # 使host信息默认直接都显示IP,
iftop -N # 使端口信息默认直接都显示端口号
#-F显示特定网段的进出流量
iftop -F 10.10.1.0/24
iftop -F 10.10.1.0/255.255.255.0
iftop -h # 帮助,显示参数信息
iftop -p # 使用这个参数后,中间的列表显示的本地主机信息,出现了本机以外的IP信息;
iftop -b # 使流量图形条默认就显示;
iftop -f # 这个暂时还不太会用,过滤计算包用的;
iftop -P # 使host信息及端口信息默认就都显示;
iftop -m 100M # 设置界面最上边的刻度的最大值,刻度分五个大段显示
执行结果界面显示的是类似刻度尺的刻度范围,为显示流量图形的长条作标尺用的。中间的<= =>这两个左右箭头,表示的是流量的方向。
- TX:发送流量
- RX:接收流量
- TOTAL:总流量
- Cumm:运行iftop到目前时间的总流量
- peak:流量峰值
- rates:分别表示过去 2s 10s 40s 的平均流量
进入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 切换是否固定只显示当前的连接;
按 ! 可以使用shell命令
按 q 退出监控。
7、CPU高占用定位
(1)使用top命令找到cpu使用率最高的进程编号
(2)使用ps -ef
或 jps
进一步定位后台程序
ps -ef |grep java | grep -v grep
jsp -l
(3)定位到具体线程
ps -mp 进行编号 -o THREAD,TID,TIME
找到CPU占用最高的线程对应线程编号TID
- -m 显示所有的线程
- -p pid 进程使用cpu的世界
- -o 该参数后是用户自定义格式
(4)将需要的10进制线程ID转换为16进制格式的英文小写
再执行jstack
命令:
jstack 进程id | grep tid(16进制线程ID英文小写) -A60
-A60
: 打印前60行
比如:进行ID为 10234,则对应的16进制为:27fa
可以借助 在线进制转换工具 快速确定。
执行:
jstack 10234 | grep 27fa -A60
本文整理参考以下内容,后续增加内容再补充。
B站阳哥视频原视频地址
Linux 命令手册 或者 命令查询网址