前言
   
计算机系统可分为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命令的系统性小结,有些命令没有做过多介绍,命令的实际情况以实操中为准。