Linux系统命令—cpu、内存、磁盘I\O、网络性能监控


前言

计算机系统可分为cpu、内存、外存(磁盘等)、外设(网卡等)四大部分,本文主要对这四大块的性能监控的linux命令做了简要小结。


1.Linux基础命令

1.1 检索命令:grep,find

grep —> 搜索关键词
find —> 查找文件

grep main ./test.c -C 3 -n -i
-C 3:打印前后三行
-n:显示行号
-i:忽略关键词的大小写

grep main test/ -r
-r:递归查找

grep main test.c -v
-v, --invert-match 反向查找,选中不匹配的行

grep retu* *.c
支持模糊查找

find . -name test.c
find . -iname test.c
-iname:忽略大小写

find /mnt -type d
find /mnt -type f
按文件类型查找

find /etc -maxdepth 1 -name passwd
mindepth/maxdepth:最小/最大查找层数

find /mnt -size 20K 查找大小在20K左右的文件
find /mnt -size +20K
find /mnt -size -20K

find /mnt -cmin 10 查找在10分钟左右修改的文件
find /mnt -cmin +10
find /mnt -cmin -10
find /mnt -ctime 10 10天左右
find /mnt -ctime +10
find /mnt -ctime +10

1.2 提取信息命令:sed,awk,head和tail,wc

head和tail:
在这里插入图片描述
wc test.c 显示test.c文件的行数、单词数、字节数

sed —> 针对行的批量操作
sed -n '5 p' sed1.cpp 显示1.cpp的第5行
sed -n '2,5 p' sed1.cpp 显示第2~第5行
sed -n '1~2 p' sed1.cpp 显示打印奇数行
sed -n '2~2 p' sed1.cpp 只显示偶数行
sed -n '/void/,+3 p' sed1.cpp 显示void的开头的行,和后三行
'sed -n '/main/,/return/ p' sed1.cpp 显示main开头的行,return结束的行,和之间的数据

sed '2,5 d' sed2.cpp delete时去掉-n参数
sed -i '2,5 d' sed2.cpp -i 使用此参数后,所有改动将在原文件上执行
sed -n '2,5 w output.txt' sed2.cpp

sed 's/int/double/g' sed3.cpp
显示 sed3.cpp的所有int替换成double后的内容
s:substitute 替换模式
g:globle
sed -i 's/int/double/g' sed3.cpp
sed3.cpp原文件,所有int替换成double

awk —> 针对列的批量操作
echo i love u | awk '{print $3 $2 $1}' 默认空格为分隔符
结果:ulovei
echo 192.168.0.1 | awk -F "." '{print $2}' 修改分隔符为.
结果:168

cat score.txt
结果:
tom 60 60 60
kitty 90 95 87
jack 72 84 99
awk '{if $2>=90 print $0}' score.txt 第0列就是第1行
结果:
kitty 90 95 87
awk '{if $2>=90 print $1,"优秀";else print $1,"良好"}' score.txt
结果:
tom 良好
kitty 优秀
jack 良好

在这里插入图片描述
netstat -ant |
awk ' \
BEGIN{print "State","Count"} \
/tcp/ \
    { rt[$6]++ } \
END{ for(i in rt){print i,rt[i]} } '
结果:
在这里插入图片描述

1.3 查看文件大小:ls,du

du和ls查看文件大小的区别:
ls显示的文件大小是实际的文件大小;显示的目录大小则表示该目录符所占的大小,并不表示该目录下所有文件的大小。
du显示的文件和目录的大小是占用磁盘空间的大小

ls -lhtR
-h:human
t:按最新修改的时间排序,新修改的在前面显示
-R:递归显示
du -a
du -s 显示当前所在目录的大小
du -lh --max-depth=1 最大深度到当前1级子目录

1.4 查看硬盘情况、挂载点:fdisk,df ,lsblk

fdisk -l 查看硬盘分区情况
lsblk 查看所有的块设备
df -h
结果:
在这里插入图片描述
虚拟硬盘的地址为/dev/sda1,虚拟硬盘挂载在文件系统的根目录下,也就是整个根目录的数据都存储在这个虚拟硬盘上。

linux文件系统可理解为目录拓展,每个目录下文件存放的磁盘可以不同,设备挂载到文件系统的某个目录下。
举例说明
假如你插入了一个 CD-ROM.你里面有个文件/file/hahaha.txt,设备地址为/dev/cdrom所有设备在linux下都是文件形式存在的,所以设备会在/dev文件下面),这时候如果你想访问里面的数据,你需要建立一个文件来映射该设备,假设你建立了一个/media/cdrom的文件夹,执行下面的命令mount /dev/cdrom /media/cdrom 就可以通过/media/cdrom/file/hahaha.txt访问到CD-ROM里面的数据了。如果使用完毕,你也可以使用umount /media/cdrom将设备卸载。

1.5 查看内存情况:free,查看交换分区:swapon

free -h
Cache和Buffer的区别:请点这里

swapon -s
查看交互分区的使用情况

1.6 日志监控工具:tail,multitail

tail -f name.log
f:follow

1.7 格式转换:dos2unix和unix2dos

dos2unix test.txt
unix2dos test.txt

find . -type f -exec dos2unix {} \;
找到当前目录下的所有普通文件,dos格式->unix格式

1.8 用户资源:ulimit

Linux系统对每个登录的用户都限制其最大进程数和打开的最大文件句柄数。为了提高性能,可以根据硬件资源的具体情况设置各个用户的最大进程数和打开的最大文件句柄数。

ulimit -a

ulimit -u 1024
设置用户的最大进程数
ulimit -n 65530
设置用户可以打开的最大文件句柄数

1.9 显示打开文件:lsof

在Unix中一切(包括网络套接口)都是文件

lsof -p 12 看进程号为12的进程打开了哪些文件
lsof -c abc 显示abc进程现在打开的文件
lsof log/default.log 显示打开文件default.log的进程

1.10 远程拷贝:scp

secure copy的缩写,scp是linux系统下基于ssh登陆进行安全的远程文件拷贝命令。
scp liaoqingfu@122.152.222.180:/home/liaoqingfu/test.txt 下载122.152.222.180的文件
scp mi9.aac liaoqingfu@122.152.222.180:/home/liaoqingfu/ 上传文件到122.152.222.180
scp -r liaoqingfu@122.152.222.180:/home/liaoqingfu/test 下载test整个目录到本地
scp -r test liaoqingfu@122.152.222.180:/home/liaoqingfu/ 上传本地test整个目录到122.152.222.180

1.11 其它:ps

ps -ef
ps -aux
pstree


2.cpu、内存、文件I/O性能监控

2.1 一套组合拳:uptime,mpstat,pidstat,vmstat,iostat

uptime
查看平均负载的变化情况
mpstat -P ALL 5 2
查看总的cpu和各个cpu使用率的变化情况
pidstat -urdwt 5 3
查看进程的state
u:cpu的使用率
r:内存的占用情况
d:磁盘I/O统计数据
w:上下文切换
-t:thread,输出线程的指标
-p 进程号:查看某个进程的state
vmstat 5 2
主要查的看参数
r(Running or Runnable):就绪队列,也就是正在运行和等待 CPU 的进程数。
b(Blocked):则是处于不可中断睡眠状态的进程数。
cs:参数表示线程环境的切换次数,此数据太大时表明线程的同步机制有问题。
iostat 2 3
磁盘的统计数据,如虚拟硬盘的I/O状态

2.2 压测模拟:stress,sysbench

进行压测模拟,然后用2.1中的一套组合拳,监控cpu、内存、磁盘I/O的变化情况。

场景一:CPU 密集型进程
stress --cpu 1 --timeout 600
场景二:I/O 密集型进程
stress -i 1 --timeout 600
场景三:大量进程的场景
stress -c 8 --timeout 600
场景四:大量线程的场景
sysbench --num-threads=10 --max-time=300 --max-requests=10000000 --test=threads run

2.3 一些综合性的工具:top(htop,atop),glances,nmon


3.网络I/O性能监控

3.1 常用命令:ping ifconfig,网卡情况:ethtool

ifconfig 来查看网络的配置
ethtool eth1 查看网卡配置
ethtool -i eth0 查看网卡驱动
ethtool -S eth0 查看网卡的一些工作统计信息

通常使用 ping ,来测试远程主机的连通性和延时
ping -c 3 baidu.com
-c 次数:ping指定次数
ping -s 524 182.168.0.116
-s:可以制定数据包的大小,范围:1Byte-65507Byte。默认ping命令的数据包大小是64Bytes
ping -t 255 www.baidu.com
-t:time to live,通过TTL设定值我们可以找到某主机到某主机的最小跳跃次数,即路由转发次数。

3.2 抓包:tcpdump,网络连通性,路由路径:mtr,traceroute

traceroute www.baidu.com
路由路径,延时
mtr www.baidu.com
路由路径,延时,丢包率

tcpdump 抓取各种报文
tcpdump -D 显示网卡设备
tcpdump -i eth0 抓取eth0的报文
tcpdump -i lo 抓取回环报文
tcpdump -i eth0 -c 2 抓取2条报文后退出

tcpdump -i eth0 -c 10 host www.0voice.com and port 80
tcpdump -i eth0 'dst 192.168.1.102 and tcp and (port 21 or 20)
显示去往192.168.1.102的所有会话信息

输出时间格式
-t 不显示时间戳
-tt 自1970年1月1日0点至今的秒数
-ttt 显示邻近两行报文间经过的秒数
-tttt 带日期的完整时间
-ttttt 自第一个抓取的报文起经历的秒数
sudo tcpdump -c 5 -t
sudo tcpdump -c 5 -tt
sudo tcpdump -c 5 -ttt
sudo tcpdump -c 5 -tttt
sudo tcpdump -c 5 -ttttt

文件操作
tcpdump -c 2 -w a 保存2个包到a文件
tcpdump -r a 读取a文件并显示
tcpdump -G 3 -w def%M-%s
-G:指定每个N秒就重新输出至新文件
%M:十时制表示的分钟数
%S:十进制的秒数

分析信息详情
-e 显示数据链路层头部,如08:00:27:ac:3b:da
-q 不显示传输层信息,如seq、ack等
-v 显示网络层头部更多的信息,如TTL、id等
-n 显示IP地址、数字端口代替hostname等
-A 以ASCII方式显示报文内容,适用HTTP分析
-x 以16进制方式显示报文内容,不显示数据链路层
-xx 以16进制方式显示报文内容,显示数据链路层
-X 同时以16进制及ASCII方式显示报文内容,不显示数据链路层
-XX 同时以16进制及ASCII方式显示报文内容,显示数据链路层
sudo tcpdump -r a -e
sudo tcpdump -r a -q
sudo tcpdump -r a -v
sudo tcpdump -r a -n
sudo tcpdump -r a -A
sudo tcpdump -r a -x
sudo tcpdump -r a -xx
sudo tcpdump -r a -X
sudo tcpdump -r a -XX

3.3 显示网络连接,端口信息,state等:netstat,ss

netstat/ss -ltnpo
-a, --all, --listening display all sockets (default: connected)
-l:listen
-t:表示只显示 TCP 套接字
n:表示显示数字地址和端口(而不是名字)
p:process
o:timers

使用 netstat 或 ss 查看协议栈的信息
netstat -s
在这里插入图片描述
ss -s
在这里插入图片描述
这些协议栈的统计信息都很直观。ss 只显示已经连接、关闭、孤儿套接字等简要统计,而 netstat 则提供的是更详细的网络协议栈信息。比如,上面 netstat 的输出示例,就展示了 TCP 协议的主动连接、被
动连接、失败重试、发送和接收的分段数量等各种信息。

3.4 查看某一主机开放的端口:nmap

扫描某一主机打开的端口及端口提供的服务信息,但实际能否进行连通还要看防火墙的设置。
nmap localhost 查看主机当前开放的端口
nmap -p 1024-65535 localhost -p:port ranges,查看主机端口(1024-65535)中开放的端口
nmap -PS 192.168.56.101 探测目标主机开放的端口
nmap -O 192.168.56.101 探测目标主机开放的端口

3.5 验证服务器端口是否开放:nc

nc -luv 9999 开启一个本地9999的UDP协议端口
-l:用于指定nc将处于侦听模式
-u:指定nc使用UDP协议,默认为TCP
-v:输出交互或出错信息,新手调试时尤为有用

在不熟悉公司的防火墙设置时,也可以通过监听端口来确定指定的端口是否被封
1.A机器操作如下:
nc -l 9999 > /dev/null
2.B机器开启数据传输
nc 129.204.197.215 9999 </dev/zero
3.A机器进行网络监控
sar -n DEV 5 3

3.6 吞吐量,网络使用率:sar

sar -n DEV 5 3
rxpck/s和txpck/s:分别是接收和发送的 PPS,单位为包 / 秒。
rxkB/s和txkB/s:分别是接收和发送的吞吐量,单位是 KB/ 秒。
rxcmp/s和txcmp/s:分别是接收和发送的压缩数据包数,单位是包 / 秒。
%ifutil:是网络接口的使用率,吞吐量(rxkB/s+txkB/s)/Bandwidth

3.7 其他:nslookup,telnet和ssh

nslookup www.baidu.com
检测网络中DNS服务器能否正确解析域名的工具命令
在这里插入图片描述
从输出中可以看到,www.baidu.com域名被正确解析到IP地址108.101.19.12/108.101.49.11。

使用方式:telnet IP PORT
telnet是TCP/IP协议族的一员,是网络远程登录服务的标准协议,帮助用户在本地计算机上连接远程主机。
和ssh 的区别
端口区别:telnet是23 ssh是22
本质:telnet是明码传输,ssh是加密传输


总结

本文是对linux命令的系统性小结,有些命令没有做过多介绍,命令的实际情况以实操中为准。


版权声明:本文为qq_38649266原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。